Android PCM字节

时间:2010-05-27 00:30:31

标签: android audio

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

所以那很好用。现在我需要将pcm字节转换为分贝。

我有一个公式,将Pa中的声音置于db。

db = 20 * log10(Pa / ref Pa)

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

我试图把这个值放到te公式中,但是它带有非常高的db,所以我不认为它是正确的

感谢

5 个答案:

答案 0 :(得分:11)

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

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

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

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

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

答案 1 :(得分:2)

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

我曾经使用的唯一音频应用程序,当样本处于+或 - 最大值时(无符号16位,即0和65535),将0db定义为“全音量”。为了得到这个db我可能会做这样的事情:

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

我不知道这是否正确,但在数学上挑战我感觉是正确的。当input_sample接近“中间”时,它看起来会越来越像负无穷大。

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

答案 2 :(得分:2)

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

答案 3 :(得分:2)

我把我的声级计放在谷歌离子上的麦克风旁边,然后去'呜呜!'并注意到裁剪发生了约105分贝。希望这可以帮助。

答案 4 :(得分:1)

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

换句话说,分贝是比较两件事的一种方式,它不是绝对的衡量标准。当你看到它被用作绝对时,那么比较就是普通人听到的最安静的声音。

在我们的例子中,它是与设备处理的最高读数的比较(因此,每个其他读数都是负数,或小于最大值)。