eri*_*old 4 audio macos data-conversion
我能够使用声度计来测量“声音片段的均方根(RMS)”。现在我想以某种方式从这个值获得分贝 dB 测量值。
事实上,公式是这样的:
dB = 20 * log(RMS * P, 10)
Run Code Online (Sandbox Code Playgroud)
其中log是基数 10,P是一些未知的功率值,(据我从https://en.wikipedia.org/wiki/Decibel可以看出)取决于所使用的麦克风。
现在,如果我在 iPhone 上使用声级应用程序,我会看到房间内的平均噪音为 68dB,我收到的测量结果为soundmeter --collect --seconds 10:
正在收集 RMS 值... 149 超时 收集结果:最小值:97 最大值:149 平均值:126
这个逻辑有问题吗?以及如何在P不计算它的情况下确定使用什么值(我很想这样做,并且似乎有效)。我假设我必须在某些规格页面上在线查找它,但这似乎相当困难,并且使用 osx 我现在不确定是否P能弄清楚 的价值是什么。此外,这似乎取决于 osx 的麦克风音量设置。
soundmeter没有返回人们通常期望的单位中的 RMS,该单位将被校准,使得满量程数字正弦波为 1.0,静音为 0.0。
我找到了这些代码片段:
在https://github.com/shichao-an/soundmeter/blob/master/soundmeter/meter.py
data = self.output.getvalue()
segment = pydub.AudioSegment(data)
rms = segment.rms
Run Code Online (Sandbox Code Playgroud)
它调用https://github.com/jiaaro/pydub/blob/master/pydub/audio_segment.py
def rms(self):
if self.sample_width == 1:
return self.set_sample_width(2).rms
else:
return audioop.rms(self._data, self.sample_width)
Run Code Online (Sandbox Code Playgroud)
您可以看到下面的函数将数据除以最大样本值以给出所需的比例。我假设ratio_to_db是20*log10(x)
def dBFS(self):
rms = self.rms
if not rms:
return -float("infinity")
return ratio_to_db(self.rms / self.max_possible_amplitude)
Run Code Online (Sandbox Code Playgroud)
在您的特定情况下,您需要将收集的 RMS 电平除以 2^N,其中 N 是每个样本的位数,以缩放 RMS 电平,然后转换为 dB。该数字是相对于数字满量程的 dBFS 或分贝,介于 +0 和 -inf 之间。要获得正的 dBSPL 值,您需要找到麦克风的灵敏度。您可以通过查找规格或校准已知参考来做到这一点。如果您想信任 iPhone 上的应用程序,并且它报告房间噪音为 68 dBSPL,而您的程序读数为 -40 dBFS,那么您可以进行简单的算术转换,只需将两者的差值 (108) 添加到您的 dBFS 数字即可。得到。
| 归档时间: |
|
| 查看次数: |
2735 次 |
| 最近记录: |