阅读文档, 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 上实现这种东西时,我发现手动抽取和过滤操作在宏伟的计划中是相当微不足道的,并且没有费心进一步优化。