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

Which operation in the FFT that is disturbed with the NAN values

我知道 FFT 函数不能处理 NAN 值。我们要么使用插值来摆脱那些 NAN,要么用零替换 NAN。然而,我想知道为什么 FFT 不能与 NAN 一起使用?。 FFT 基本上是在与不同的谐波相乘后对时间序列进行求和,大多数库都具有在跳过 NAN 值的同时执行求和的功能。 谢谢

最新版本的语言和编译器(C, C++) and subsecant compiled libraries (such as FFTW) performing floating point computations rely on the IEC 60559 or IEEE 754 standards for floating point arithmetics, using types like float or double, unless flags like ggc's -ffast-math are activated. These standards decribe the expected behavior of float and double : most SIMD instructions are expected to comply with these standards (See this course and Checking 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 的句子

Although the IEEE standard defines the basic floating-point operations to return a NaN if any operand is a NaN, this might not always be the best definition for compound operation...

一个few words about the operations on NaN in IEEE 754, in 1985:

Every operation involving a signaling NaN or invalid operation (7.1) shall, if no trap occurs and if a floating-point result is to be delivered, deliver a quiet NaN as its result.

因此,对于离散傅立叶变换,输入中的单个 NaN 可能会污染整个输出数组。由于 [=21] 等规则,此行为可能存在例外情况=]:

A complex or imaginary value with at least one infinite part is regarded as an infinity (even if its other part is a NaN).

没有用默认值覆盖NaN的原因是:

  • NaN 信号和错误,或应用程序开发人员必须小心处理的特殊情况。得到 NaN 通常表示由于错误的初始化或内存管理而出现问题。调查、理解、预防和处理这些错误通常会使代码比用默认值覆盖输入或输出更安全可靠。
  • 跳过 NaN 值可能是明智的,但它需要某种理由。更具体地说,可以通过忽略 NaN 值来计算具有 NaN 值的离散化信号(即 DFT 的频率 0)的平均值,但必须同时计算非 NaN 值的数量以恢复平均值的无偏估计.根据您的信号,使用线性插值可能很有意义。但是,如果信号是周期性的并且周期已知,则根据问题的物理特性,其他解决方案(例如 Trigonometric interpolation 可能更有意义。因此,库的不同用户可以实现不同的方式来处理 NaN...
  • 图书馆的名字有时不言而喻:"Fastest Fourier Transform in the West"。事实上,挂钟时间仍然是高效应用程序的重要因素。通过执行不同于 SIMD 指令的操作来处理 NaN 值可能需要更多测试并且可能会稍微减慢计算速度,即使数组中没有 NaN,即使最后调用 SIMD 指令也是如此。

关于 NaN 的其他来源:

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