【问题标题】:Android PCM BytesAndroid PCM 字节
【发布时间】:2010-05-27 00:30:30
【问题描述】:

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

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

我有一个公式可以将 Pa 中的声压转换为 db。

db = 20 * log10(Pa/ref Pa)

所以问题是我从缓冲区中的音频记录器获得的字节是什么,它是振幅帕斯卡声压还是什么。

我试图将值放入 te 公式中,但它返回的 db 非常高,所以我认为它不正确

谢谢

【问题讨论】:

  • 1+ 为所有人点赞以获得更多信息。谢谢大家。
  • 我自己也需要一些帮助,因为我正在尝试做同样的事情!我有像你一样的原始 pcm 字节,但是当我使用你的公式时,它会出现无穷大:/ 当我记录时,我正在使用字节数组中的最后 2 个字节值,这是错误的吗?

标签: android audio


【解决方案1】:

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

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

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

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

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

【讨论】:

  • 嗨,谢谢它似乎适用于这个公式。值为 +32767 或 -32768 范围。
  • 一个问题只是为了让我思考一下。 sampleValue 是什么计量单位
  • 严格来说,采样值代表麦克风输出的瞬时电压(其中+32767代表最大正电压,-32768代表最小负电压)。由于麦克风的工作方式,该电压与局部平均声压的变化有关 - 当麦克风记录声音时,麦克风周围的气压会轻微上下波动,从而移动薄膜来回产生交替的正负电压。 ADC(模数转换器)每秒对该电压进行 44100 次采样 ...
  • ... 并将其转换为保存在数据中的有符号短值(-32768 到 +32767)。
  • @MusiGenesis 您的第一条评论可能是一个正确的答案。多么好的答案。竖起大拇指
【解决方案2】:

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

我曾经使用过的唯一音频应用程序,将 0db 定义为“全音量”,当样本处于 + 或 - 最大值时(无符号 16 位,即 0 和 65535)。要将它放入 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 评估,我也只能猜测,因为我不知道它是如何工作的.

【讨论】:

  • 关闭,除了 PCM 样本是 有符号 16 位(因此您不需要偏移减法)。另外——至少在我的世界里——你不能记录负数。 :)
  • 哈哈好点。他们总是签约?我确信我曾经不得不处理未签名的 PCM 数据(当然可能是记错了)。
  • 我应该说 PCM通常是有符号的 - 每个样本 1 字节的 PCM 和 RAW PCM 格式(就像你可能使用的那样)是无符号的,但它们'在野外非常罕见(CD 音频已签名)。
【解决方案3】:

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

【讨论】:

  • 我真正想要对 db 做的是找出音频的音量(负载),如果它高于某个音量(db 中的负载)我想做点什么。我有一个 db 的参考表 en.wikipedia.org/wiki/…
  • 您需要以一种或另一种方式校准系统。至少您需要将计算值与已知的声级进行比较。维基百科条目中给出的值很可能是 A 加权声级,其中每个八度音阶中的声级被加权以产生一个整体值。 Leq 通常是为每个八度带给出的。
  • 我得到的样本值是 +32767 到 -32768 这是什么单位,它是振幅声压伏瓦特...
  • 两者都不是。它是一个任意单位,通过麦克风的压力到电压转换,与 ADC 输入端的电压和帕斯卡成正比。要获得从无量纲样本值到电压或压力的转换因子,您需要将这些样本值与已知电压或声压级进行比较。这就是校准的作用。
  • 麦克风规格会告诉您多少 mV/Pa,但在不了解 ADC 规格(和中间电路)的情况下,这仍然无法为您提供从压力 (Pa) 到采样值的转换。我认为您最好的选择是实施您的 dB 测量并将您的值与来自声级计的已知值进行比较。然后你可以在你的代码中加入正确的转换因子。
【解决方案4】:

我把我的声级计放在我的 google ion 上的麦克风旁边,然后“哇哦!”并注意到削波发生在 105 db spl 左右。希望这可以帮助。

【讨论】:

    【解决方案5】:

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

    换句话说,分贝是比较两个事物的一种方式,它不是一个绝对的度量。当您看到它好像是绝对的一样使用时,那么比较的是普通人可以听到的最安静的声音。

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-04-11
      • 1970-01-01
      • 1970-01-01
      • 2016-03-06
      • 2021-12-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多