iPhone - 如何测量PCM编码信号的幅度

时间:2010-01-30 10:19:35

标签: iphone audio pcm

这是我的问题:

  1. 我需要实时分析音频数据以找出信号的幅度
  2. 我无法使用AudioQueue测量功能,因为它有太多的延迟来检测峰值
  3. 我研究过aurioTouch示例.....然而......
  4. 我根本不明白PCM编码缓冲区如何转换回示波器视图中显示的波形。正是这个波浪我才想分析幅度。

    在我的回调中,当我分析缓冲区时,它只有0和-1 - 当使用NSLog(@“%d”)时。这是有道理的,我猜是因为它是PCM。

    我无法在aurioTouch中找到将0 / -1流转换为波形的神奇之处: - ((

    此外,当我在内存中有波形时,如何分析振幅以及如何将此读数转换为dB?

    我不想使用FFT,因为我对频率不感兴趣,我希望还有其他方法。

    干杯

2 个答案:

答案 0 :(得分:10)

一旦你在内存中有一大块波形,那么以dB为单位计算幅度值相当容易(尽管你需要确定0 dB的参考幅度)。通常,如果您想要在VU表上看到的那种短期幅度,那么您需要纠正波形的瞬时值(您可以使用abs),然后通过简单的低通滤波器传递这些经过校正的值时间常数大约为100毫秒。要将值转换为dB,您可以执行以下操作:

amplitude_dB = 20 * log10(amplitude) + calibration_dB;

其中幅度是经过整流和滤波的幅度,而calibration_dB是一个偏移量,可以为您提供0 dB的正确幅度,无论您的特定应用是什么(例如dB re re scale,或校准的dBV或dBm值)

可以如下实现简单但有效的低通滤波器。这将是单极IIR(递归)滤波器。每个输出取决于先前的输出值和当前输入值。我们有一个常数因子α,它有效地确定了这个低通滤波器的时间常数或截止频率。

y = alpha * x + (1.0 - alpha) * y_old;
y_old = y;
  • x =当前输入值
  • y =新产出值
  • y_old =上一个输出值
  • alpha =常数,它决定了过滤器的响应 - 一个小的正数 - 尝试0.001开始和实验

答案 1 :(得分:1)

AurioTouch是正确的例子。不幸的是,代码非常糟糕。确保只使用它来了解使用RemoteIO音频设备背后的概念。

波形的实际绘制正好发生在renderProc回调中,当PCM数据可用时,CoreAudio会调用该回调。查看aurioTouchAppDelegate.mm:197中的PerformThru()...再往下,第237行

SInt8 *data_ptr = (SInt8 *)(ioData->mBuffers[0].mData);

......这就是访问实际PCM数据的地方。这是您需要分析的数据,以获得信号的峰值/平均功率。