使用声级计测量分贝(dB)

时间:2016-06-08 09:20:03

标签: macos audio data-conversion

我可以使用soundmeter来测量“声音片段的均方根(RMS)”。现在我想以某种方式从这个值得到分贝dB测量值。

Afaict公式如下:

dB = 20 * log(RMS * P, 10)

其中log为10,P为未知值功率,(https://en.wikipedia.org/wiki/Decibel)取决于使用的麦克风。

现在,如果我在iPhone上使用声级应用程序,我会发现房间内的平均噪音为68dB,而我从soundmeter --collect --seconds 10收到的测量值是:

  

收集RMS值...          149超时收集结果:       分:97       最大:149       平均:126

这个逻辑有问题吗?如何在不计算P的情况下确定P的值(我很想做,而且似乎有效)。我假设我必须在某些规格页面上在线查找,但这似乎很难,并且使用osx我现在不确定.navbar li { float: left; padding-right: 20px; /*padding-left: 20px;*/ //Remove padding text-align:center; //Add text-align display: block; font-size: 18px; font-family: tahoma; font-weight: italic; border-left: 1px solid black; padding-bottom: 7px; width: 90px; //Give specific width height: 60px; //Give specific height } li a { text-decoration: none; width: inherit; //Take parents width height: 100%; display: block; //display block padding-top: 10px; //add padding to vertical align } 的价值是什么。此外,这似乎取决于osx的麦克风音量级别设置。

1 个答案:

答案 0 :(得分:2)

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

调用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)

紧接着下面的函数可以看到数据除以最大样本值以得到所需的比例。我认为ratio_to_db20*log10(x)

def dBFS(self):
    rms = self.rms
    if not rms:
        return -float("infinity")
    return ratio_to_db(self.rms / self.max_possible_amplitude)

在您的特定情况下,您需要将收集的RMS级别除以2 ^ N,其中N是每个样本的位数,以获得缩放的RMS级别,然后转换为dB。该数字相对于数字满量程将是dBFS或分贝,并且介于+0和-inf之间。要获得正dBSPL值,您需要找到麦克风的灵敏度。您可以通过查找规格或校准到已知参考来完成此操作。如果您想信任iPhone上的应用程序,并且它报告房间噪音为68 dBSPL,而您的程序读取-40 dBFS,那么您可以通过简单地将两者(108)的差值添加到dBFS数字来进行简单的算术转换得到。