iPhone-如何测量PCM编码信号的振幅
这是我手头的问题:iPhone-如何测量PCM编码信号的振幅,iphone,audio,pcm,Iphone,Audio,Pcm,这是我手头的问题: 我需要实时分析音频数据,找出信号的振幅 我不能使用AudioQueue计量功能,因为它在检测峰值时有太多延迟 我研究了aurioTouch的例子。。。。。然而 我只是不明白PCM编码缓冲器是如何转换回示波器视图中显示的波形的。这正是我要分析的波孔的振幅 在我的回调中,当我分析缓冲区时,它只有0和-1-当使用NSLog(@“%d”)时。我想这是有道理的,因为它是PCM 我在aurioTouch找不到将0/-1流转换为波形的神奇之处:-(( 还有,一旦我在内存中有了波形,我如何分
MatAurioTouch是一个正确的例子。不幸的是,代码太糟糕了。请确保使用它只是为了了解使用RemoteIO音频单元背后的概念 波形的实际绘制发生在renderProc回调中,该回调在PCM数据可用时由CoreAudio调用。请查看aurioTouchAppDelegate.mm:197…下一行237中的PerformThru()
SInt8 *data_ptr = (SInt8 *)(ioData->mBuffers[0].mData);
…这是访问实际PCM数据的地方。这是您需要分析的数据,以便获得信号的峰值/平均功率。一旦内存中有一块波形,则以dB为单位计算幅值值就相当容易了(尽管您需要确定0 dB的参考幅值).通常,如果您想要在VU表上显示的短期幅度,则需要校正波形的瞬时值(您可以使用abs进行校正)然后将这些校正值通过一个简单的低通滤波器,时间常数为100 ms。要将这些值转换为dB,您需要执行以下操作:
振幅\u dB=20*log10(振幅)+校准\u dB;
其中,振幅是校正和滤波的幅度,校准_dB是一个偏移量,为您提供0 dB的正确振幅,无论在您的特定应用中是什么(例如,dB re满标度,或校准的dBV或dBm值)
一个简单但有效的低通滤波器可以如下实现。这将是一个单极IIR(递归)滤波器。每个输出取决于以前的输出值和当前输入值。我们有一个常数因子α,它有效地确定了该低通滤波器的时间常数或截止频率
y = alpha * x + (1.0 - alpha) * y_old;
y_old = y;
- x=当前输入值
- y=新的输出值
- y_old=以前的输出值
- α=确定过滤器响应的常数-一个小的正数-尝试0.001开始并进行实验