我对vdsp框架完全陌生,我正在尝试通过构建来学习。我的目标是以下列方式处理信号:
从Apple的文档中可以理解,函数vDSP_desamp()是我正在寻找的(它可以同时执行两个步骤,对吗?)
我如何正确使用它?
以下是我的想法:
给定AudioBufferList *audio
和一系列长度为[101]的过滤系数filterCoeffs
:
vDSP_desamp((float*)audio->mBuffers[0].mData, 2, &filterCoeffs, (float*)audio->mBuffers[0].mData, frames, 101);
这会正确使用该方法吗? 我是否需要为此过程实现循环缓冲区? 任何指导/方向/指向要阅读的东西都是非常受欢迎的。 感谢
答案 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上实现这种事情时,我发现了一个 手动抽取和过滤操作在宏观方案中是相当微不足道的,并没有进一步优化。