2015-02-08 65 views
2

我完全不熟悉vdsp框架,我正在尝试通过构建学习。我的目标是要通过以下方式进行处理的信号:使用Accelerate和vDSP_desamp进行音频处理()

  1. 100阶带通FIR
  2. 下采样的因素:2

从什么我可以从Apple的文档功能vDSP_desamp理解()是我在找什么(它可以同时做两个步骤,对吧?)

我该如何正确使用它?

这里是我的想法: 给定一个AudioBufferList *audio和滤波器系数filterCoeffs与长度的阵列[101]:

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

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

回答

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

所以,简单的答案是NO。您不能单独使用vDSP_desamp()

的选项有:

  • 需要组装成一个缓冲器的采样,然后调用vDSP_desamp()N输出样本。这涉及从两个CoreAudio缓冲区复制样本。如果您担心等待时间,则重新设置FIR以使用100个之前的样本,或者,它们可能来自下一个缓冲区。

  • 使用vDSP_desamp()代表什么,并计算过滤器包装在两个缓冲区上时更复杂的情况。

  • 两个呼叫vDSP_desamp() - 一个用简单的情况下,另一个与组装输入缓冲器,其中样品包裹相邻CoreAudio的缓冲区

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

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

当我在iOS上实现了这种类型的事情时,我发现手动抽取和过滤操作在事件的宏观体系中相当微不足道,并且没有考虑进一步优化。

+0

感谢您的澄清!我想我也会用手卷解决方案。 – Kaitis 2015-02-08 10:52:00