我正在使用AudioRecord类来分析从麦克风中接收到的原始PCM字节。
目前工作得很好。现在我需要将PCM字节转换为分贝。
我有一个公式,可以将声压(Pa)转化为分贝(db)。
db = 20 * log10(Pa / ref Pa)
所以问题是我从音频记录器获取的缓冲区中得到的字节是振幅帕斯卡声压还是其他什么。
我尝试将该值放入该公式中,但它返回非常高的分贝值,因此我认为这不正确。
谢谢
我正在使用AudioRecord类来分析从麦克风中接收到的原始PCM字节。
目前工作得很好。现在我需要将PCM字节转换为分贝。
我有一个公式,可以将声压(Pa)转化为分贝(db)。
db = 20 * log10(Pa / ref Pa)
所以问题是我从音频记录器获取的缓冲区中得到的字节是振幅帕斯卡声压还是其他什么。
我尝试将该值放入该公式中,但它返回非常高的分贝值,因此我认为这不正确。
谢谢
免责声明:我对Android知之甚少。
你的设备可能以44,100个采样率(也许更低)在单声道下录音,每个采样使用两个字节。因此,你的第一步是将原始数据中的字节成对组合为两个字节的整数(我不知道在Android中如何实现)。
然后,你可以通过首先取样本的归一化绝对值并将其传递给Db函数来计算每个样本相对于峰值的分贝值:
float Db = 20 * log10(ABS(sampleVal) / 32768)
接近峰值的数值(例如+32767或-32768)其dB值接近于0。数值为3277(0.1)的dB值为-20;数值为327(0.01)的dB值为-40等。
// assume input_sample is in the range 0 to 65535
sample = (input_sample * 10.0) - 327675.0
db = log10(sample / 327675.0)
我不知道这是否正确,但对于数学上有挑战的我来说,它感觉是正确的。随着输入样本接近“中间”,它会越来越像负无穷。
现在我想想,如果你想要一个SPL或者其他需要不同技巧的东西,比如在零交叉之间进行RMS评估,那么我只能猜测,因为我真的不知道它是如何工作的。
我将声级计放在我的Google Ion麦克风旁边,然后发出“Woooooo!”的声音,注意到削波发生在大约105分贝SPL。希望这可以帮助您。
单位是参考读数所使用的任何单位。在公式中,读数被参考读数除以,因此单位被消除,不再重要。
换句话说,分贝是一种比较两个事物的方式,而不是绝对的测量。当您看到它被用作绝对值时,那么比较的是人类能听到的最安静的声音。
在我们的情况下,它是与设备处理的最高读数进行比较(因此,每个其他读数都是负数或小于最大值)。