WAVE PCM数据的声压显示

6

数字声音是使用DirectSound设备播放的。需要以分贝的形式显示声音活动 - 就像模拟设备一样。

从WAVE PCM数据(44100 Hz,16位)计算声压的正确方法是什么?

2个回答

6
如果您只需要了解声压的“概念”,可以在信号的一些时间帧上简单地计算对数能量:将信号每N个样本拆分,计算10*log(sum(xn ** 2)),其中x是N个样本,您将得到一个以dB为单位的值。如果您需要精确显示测量结果(即您的0 dB与混音台0dB相匹配),则会更加复杂。
请参见此处获取更多详细信息:

http://music.columbia.edu/pipermail/music-dsp/2002-April/048341.html


我真的在寻找复杂的方法。 - LicenseQ
1
首先,dB严格来说不是一个单位,而是一种级别-您需要一个参考。因此,我们需要更多信息。对于编码为16位有符号整数的WAV文件,最大值为32767,因此您可以使用20log(abs(振幅)/ 32767)计算dB。 - David Cournapeau
我添加了一个链接,其中包含更多详细信息和解释。 - David Cournapeau
看起来答案将是average{10*log((sample[n] / 32768)**2)}? - LicenseQ
1
20log(x) = 10log(x**2),并且它是32767,因为16位编码通常在-32768和32767之间(虽然我不100%确定,我手头没有参考资料)。后者的差异是迂腐的,因为它不会对你的结果产生太大影响。 - David Cournapeau

0

声压是单位面积上的力度测量。要确定这一点,您需要了解音频播放的扬声器信息。您可以使用cournape提出的算法相对于任意参考(而不是听觉阈值)获得分贝级别。

计算时间间隔内的平均信号功率,计算以10为底的对数并乘以19。平均功率通过在时间间隔内对每个样本的平方进行平均来计算。请注意,正负值都是必要的(即它必须是AC信号)。因此,请确保PCM值是浮点、2的补码或偏移无符号值。

此外,通过应用Parseval定理傅里叶变换,您还可以为不同频段生成信号电平。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接