我正在将 vDSP 框架用于基于 FFT 计算的实时音频应用程序。
在尝试找出算法产生错误结果的原因后遇到很多问题,我在官方 vDSP FFT 帮助代码中发现了以下评论(DemonstrateFFT.c,第 242、416、548 行)
/* Zero the signal before timing because repeated FFTs on non-zero
data can cause abnormalities such as infinities, NaNs, and
subnormal numbers.
*/
为了重现错误,只需注释第 247 行(信号不为零)并在第 273 行添加类似于以下行的内容(就在 vDSP_fft_zrip 方法之后)
if (isnan(Observed.realp[0])) printf("Iteration %lu: NaN\n",i); // it would work with any of the components of Observed
有趣的是,减少 N(即增加每个时间单位的 FFT 数量)会使 zrip 算法之前失败,这是有道理的,因为评论建议执行重复 FFT。
使用 vDSP_fft_zrop 算法也可以观察到这种行为。
我真的很想知道按照评论中的建议执行“零数据”的 FFT 有什么意义。要么我遗漏了一些重要的东西,要么肯定 vDSP 框架根本不适合实时音频处理。