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