这是我手头的问题:

  • 我需要实时分析音频数据以找出信号
  • 的幅度
  • 我无法使用AudioQueue计量功能,因为它在检测峰值方面有太多延迟
  • 我已经研究了aurioTouch示例.....但是...

  • 我根本不理解如何将PCM编码的缓冲区转换回示波器 View 中显示的波形。我想对振幅进行分析之前正是此波。

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

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

    同样,一旦将波形存储在内存中,我该如何分析幅度以及如何将读数转换为dB?

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

    干杯

    最佳答案

    一旦在内存中保存了一部分波形,就可以很容易地计算出以dB为单位的幅度值(尽管您需要确定0 dB的幅度引用值是多少)。通常,如果您想要在VU仪表上显示的短期幅度值,则需要校正波形的瞬时值(可以使用abs),然后将这些校正后的值通过简单的低通滤波器传递时间常数约为100毫秒。要将值转换为dB,您将执行以下操作:
    amplitude_dB = 20 * log10(amplitude) + calibration_dB;
    其中幅值​​是经过校正和滤波后的幅值,而calibration_dB是一个偏移量,可为您提供0 dB的正确幅值,无论您的特定应用是什么(例如dB满刻度,或已校准的dBV或dBm值)。

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

    y = alpha * x + (1.0 - alpha) * y_old;
    y_old = y;
    
  • x =当前输入值
  • y =新的输出值
  • y_old =先前的输出值
  • alpha =决定滤波器响应的常数-一个小的正数-尝试从0.001开始并尝试
  • 10-06 01:15