FFT中哪个操作受到NAN值的干扰

时间:2018-01-17 00:02:07

标签: matlab signal-processing fft fftw ifft

我知道FFT函数不能用于NAN值。我们使用inerpolation来获取那些NAN,或者我们用零替换NAN。然而,我想知道为什么FFT不适用于NAN? FFT基本上是在用不同的谐波相乘后对时间序列求和,并且大多数库具有在跳过NAN值时执行求和的功能。 谢谢

1 个答案:

答案 0 :(得分:2)

执行浮点计算的langages和编译器(CC++)和次级编译库(如FFTW)的最新版本依赖于 IEC 60559或IEEE 754标准的浮点数算术,使用floatdouble等类型,除非激活ggc' s -ffast-math等标记。这些标准描述了floatdouble的预期行为:大多数SIMD指令都应符合这些标准(请参阅this courseChecking if a double (or float) is NaN in C++)。因此,使用SIMD指令的库(Blas Lapack)可能会以相同的方式运行。

David Goldberg在"What Every Computer Scientist Should Know About Floating-Point Arithmetic "中对NaN的态度

  

虽然IEEE标准定义了基本的浮点运算,如果任何操作数是NaN,则返回NaN,这可能并不总是复合运算的最佳定义...

A few words about the operations on NaN in IEEE 754, in 1985

  

如果没有发生陷阱并且如果要传递浮点结果,则每个涉及信令NaN或无效操作(7.1)的操作都应该提供一个安静的NaN作为其结果。

因此,对于离散傅立叶变换,输入中的单个NaN可能会污染整个输出数组。由于this one proposed in a draft之类的规则,这种行为可能会出现这种情况:

  

具有至少一个无限部分的复数或虚数值被视为无穷大(即使其它部分是NaN)。

有理由不用默认值覆盖NaN

  • NaN信号和错误,或者必须由应用程序的开发人员小心处理的特殊情况。获取NaN通常表示由于错误的初始化或内存管理而导致出现问题。调查,理解,预防和处理这些错误通常会使代码比使用默认值覆盖输入或输出更安全,更可靠。
  • 跳过NaN值可能是明智的,但它需要某种基本原理。更具体地,可以通过忽略NaN值来计算具有NaN值的经干扰信号(即,DFT的频率0)的平均值,但是必须计算非NaN值的数量以恢复对于平均值的无偏估计。 。根据您的信号,使用线性插值可能有意义。但是如果信号是周期性的并且如果周期已知,那么其他解决方案(例如Trigonometric interpolation)可能会更有意义,具体取决于问题的物理特性。因此,库的不同用户可以实现不同的方式来处理NaN ...
  • 图书馆的名称有时不言自明:"西方最快的傅里叶变换"。实际上,挂钟时间仍然是有效应用的重要因素。通过执行与SIMD指令不同的操作来处理NaN值可能需要更多测试,并且可能会略微减慢计算速度,即使数组中没有NaN,即使最终调用了SIMD指令。

关于NaN的附加资料来源:

Checking if a double (or float) is NaN in C++