Android PCM字节

我使用AudioRecord类来分析麦克风中的原始pcm字节。

所以这很好地工作。 现在我需要将pcm字节转换为分贝。

我有一个公式,以压入db的声音压力。

db = 20 * log10(Pa / ref Pa)

所以问题是我从缓冲区从audiorecorder得到的字节是什么它振幅帕斯卡声压或什么。

我试图把公式的价值,但它回来非常高分贝,所以我不认为它的权利

谢谢

Solutions Collecting From Web of "Android PCM字节"

免责声明:我对Android知之甚less。

您的设备可能以每秒44,100个采样(可能更less)的单声道采样,每个采样使用两个字节。 所以你的第一步是将原始数据中的字节对组合成两个字节的整数(我不知道这是如何在Android中完成的)。

然后,您可以先计算样品的归一化绝对值并将其传递给Db函数,然后计算每个样品的分贝值(相对于峰值):

float Db = 20 * log10(ABS(sampleVal) / 32768) 

接近峰值的值(例如+32767或-32768)将具有接近0的Db值.3277(0.1)的值将具有-20的Db值; 327(.01)的值将具有-40的Db值等。

Leq(声压级)计算中的参考压力为20微帕(rms)。 要测量绝对的Leq电平,您需要使用校准器来校准麦克风。 大多数校准器适合1/2“或1/4”的麦克风胶囊,所以我有一个关于在Android手机上校准麦克风的疑问。 或者,您可以使用麦克风灵敏度(Pa / mV),然后校准进入ADC的电压电平。 将Android值与使用声级计的扩散静止声场的测量声级相比较,可以得到更不可靠的结果。 请注意,在Leq计算中,通常使用RMS值。 一个样本的价值并不意味着太多。

我把我的声级计放在我的谷歌麦克风旁边,然后去了'呜呜呜!' 并指出削减约105分贝发生。 希望这可以帮助。

问题可能是麦克风“参考”声压的定义。 我不知道它会是什么或者是否可用。

我曾经使用过的唯一的audio应用程序,定义0db为“完整音量”,当样本是在+或 – 最大值(无符号16位,这将是0和65535)。 为了得到这个分贝我可能会做这样的事情:

 // assume input_sample is in the range 0 to 65535 sample = (input_sample * 10.0) - 327675.0 db = log10(sample / 327675.0) 

我不知道这是否正确,但对math挑战我感觉不错。 随着input_sample接近“中间”,它会越来越像负无穷。

现在我想到了,如果你想要一个SPL或者一些可能需要不同的技巧,比如在零交叉点之间进行RMS评估,再一次我只能猜测,因为我不知道它是如何工作的。

单位是任何单位用于参考阅读。 在公式中,读数除以参考读数,所以单位抵消并不再重要。

换句话说,分贝是比较两种东西的一种方式,这不是一种绝对的测量。 当你看到它被用作绝对的时候,那么比较就是人类可以听到的最平静的声音。

在我们的例子中,这是对设备处理的最高读数的比较(因此,其他读数是负数,或者小于最大读数)。