使用Accelerate和vDSP_desamp()进行音频处理

时间:2015-02-08 09:09:58

标签: ios audio vdsp

我对vdsp框架完全陌生,我正在尝试通过构建来学习。我的目标是以下列方式处理信号:

  1. 100次Band Pass FIR
  2. 按因子进行下采样:2
  3. 从Apple的文档中可以理解,函数vDSP_desamp()是我正在寻找的(它可以同时执行两个步骤,对吗?)

    我如何正确使用它?

    以下是我的想法: 给定AudioBufferList *audio和一系列长度为[101]的过滤系数filterCoeffs

    vDSP_desamp((float*)audio->mBuffers[0].mData, 2, &filterCoeffs, (float*)audio->mBuffers[0].mData, frames, 101);
    

    这会正确使用该方法吗? 我是否需要为此过程实现循环缓冲区? 任何指导/方向/指向要阅读的东西都是非常受欢迎的。 感谢

1 个答案:

答案 0 :(得分:1)

阅读文档,vDSP_desamp()确实是复合抽取和FIR操作。将两者结合在一起是一个好主意,因为它减少了内存访问,并且可以消除大量计算。

这里的假设是FIR滤波器已经重组(P-1)/2群延迟。这样做的结果是,要计算C(n),该函数需要访问A(n*I+p)

其中(使用文档的术语):

`A[0..x-1]`: input sample array
`C[0..n-1]`: output sample array
`P`: number of filter coefficients
`I`: Decimation factor

显然,如果你将CoreAudio缓冲区传递给它,它将从缓冲区的末尾运行200个输入样本。充其量,产生100个垃圾样本,最坏的情况是SIGSEGV

所以,简单的答案是否定的。您无法单独使用vDSP_desamp()

您的选择是:

  • 将所需的样本组装到缓冲区中,然后为vDSP_desamp()输出样本调用N。这涉及从两个CoreAudio缓冲区复制样本。如果您担心延迟,则重新设计FIR以使用100个先前的样本,或者,它们可以来自下一个缓冲区。

  • 使用vDSP_desamp()获取,并计算过滤器包裹两个缓冲区时更复杂的情况。

  • 两次调用vDSP_desamp() - 一个用简单的情况,另一个用一个汇编的输入缓冲区,其中样本包裹相邻的CoreAudio缓冲区

我没有看到如何使用循环缓冲区来解决这个问题:你仍然遇到缓冲区需要处理的情况,并且仍然需要将所有样本复制到其中。

哪个更快取决于CoreAudio提供的音频缓冲区的大小。我的预感是,对于小缓冲区和较小的过滤器长度,vDSP_desamp()可能不值得,但您需要进行测量才能确定。

当我过去在iOS上实现这种事情时,我发现了一个 手动抽取和过滤操作在宏观方案中是相当微不足道的,并没有进一步优化。