Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/iphone/44.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
iPhone-如何测量PCM编码信号的振幅_Iphone_Audio_Pcm - Fatal编程技术网

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

iPhone-如何测量PCM编码信号的振幅,iphone,audio,pcm,Iphone,Audio,Pcm,这是我手头的问题: 我需要实时分析音频数据,找出信号的振幅 我不能使用AudioQueue计量功能,因为它在检测峰值时有太多延迟 我研究了aurioTouch的例子。。。。。然而 我只是不明白PCM编码缓冲器是如何转换回示波器视图中显示的波形的。这正是我要分析的波孔的振幅 在我的回调中,当我分析缓冲区时,它只有0和-1-当使用NSLog(@“%d”)时。我想这是有道理的,因为它是PCM 我在aurioTouch找不到将0/-1流转换为波形的神奇之处:-(( 还有,一旦我在内存中有了波形,我如何分

这是我手头的问题:

  • 我需要实时分析音频数据,找出信号的振幅
  • 我不能使用AudioQueue计量功能,因为它在检测峰值时有太多延迟
  • 我研究了aurioTouch的例子。。。。。然而
  • 我只是不明白PCM编码缓冲器是如何转换回示波器视图中显示的波形的。这正是我要分析的波孔的振幅

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

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

    还有,一旦我在内存中有了波形,我如何分析振幅,如何将读数转换成dB

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

    干杯


    Mat

    AurioTouch是一个正确的例子。不幸的是,代码太糟糕了。请确保使用它只是为了了解使用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开始并进行实验

    我不是DSP方面的专家,因此如果您能发布低通滤波器的代码,我将不胜感激。MatI现在在答案中添加了一个简单的低通滤波器实现。非常感谢让我开始学习。同时,我还成功地从rioBuffer中提取了数据:-))这只是一个理解问题。我从我拥有的各种合成器中了解LP滤波器。一个单极滤波器意味着6dB/Oct,而一个四极滤波器将有24dB/Oct。当我正确理解上述滤波器时,我将不得不通过它运行我的数据四次,以获得24dB/Oct-还是不?!澄清一下-我们在这里过滤的是整流信号,以便在短时间间隔内获得信号幅度的平滑估计,因此低通滤波器的响应并不特别重要。但在一般情况下,是的,如果你级联N个相同的滤波器,衰减6 dB/倍频程,你将得到6 N dB/倍频程。我认为这是正确的位置,但我也认为它看起来太简单了。。。。。谢谢你的意见!