首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Android PCM字节

Android PCM字节
EN

Stack Overflow用户
提问于 2010-05-27 08:30:31
回答 5查看 15.3K关注 0票数 10

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

因此,这是很好的工作。现在我需要将pcm字节转换为分贝。

我有一个公式,用Pa表示的声压等于db。

db = 20 * log10(Pa/ref Pa)

所以问题是,我从录音机,从缓冲区得到的字节,它是什么,振幅,pascal,声压,还是什么。

我试着把这个值放入te公式中,但返回的结果是非常高的分贝,所以我不认为它是正确的。

谢谢

EN

回答 5

Stack Overflow用户

回答已采纳

发布于 2010-05-27 09:04:37

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

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

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

代码语言:javascript
复制
float Db = 20 * log10(ABS(sampleVal) / 32768)

峰值附近的值(例如+32767或-32768)的DB值将接近0。值3277 (0.1)的Db值为-20;值327 (.01)的Db值为-40,依此类推。

票数 14
EN

Stack Overflow用户

发布于 2010-05-27 08:44:32

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

我使用过的唯一一个音频应用程序,当采样为+或- max值时,将0db定义为“全音量”(在无符号16位中,这将是0和65535)。为了把这个放到db中,我可能会这样做:

代码语言:javascript
复制
// 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
EN

Stack Overflow用户

发布于 2010-05-27 15:42:01

在Leq (声压级)计算中,参考压力是20微帕斯卡(rms)。要测量绝对Leq电平,您需要使用校准器校准麦克风。大多数校准器都可以安装1/2英寸或1/4英寸的麦克风胶囊,所以我对在Android手机上校准麦克风持怀疑态度。或者,您可以使用麦克风灵敏度(Pa/mV),然后校准进入ADC的电压电平。通过将Android的值与使用声级计测量的漫射固定声场的声级进行比较,可能会得到更不可靠的结果。请注意,在Leq计算中,通常使用RMS值。单个样本的值并没有多大意义。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/2917762

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档