-1

我正在将 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 框架根本不适合实时音频处理。

4

1 回答 1

1

普通 16 位和 24 位“实时”音频样本不会出现此问题。

但是,当迭代次数足够多时,并且在使用许多函数时,基准可以创建更大或更小的数字,这些数字可能超过双精度浮点数的范围,而不仅仅是 FFT。尝试迭代 exp() 反馈给自身,这将更快地爆炸。这是使用任何有限精度计算机算法(不仅仅是 vDSP 使用的 ARM 和 x86 CPU)都会遇到的问题。

于 2017-07-27T05:58:03.567 回答