加速vDSP FFT,在苛刻的情况下导致NaN

时间:2017-07-25 15:33:47

标签: fft nan vdsp accelerate

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

1 个答案:

答案 0 :(得分:1)

正常16和24位"实时"音频样本不会看到这个问题。

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