我最近意识到FFT并不是完美的。这意味着,如果我先接收信号,然后进行FFT,然后进行逆FFT,则结果输出与输入并不完全相同。这是一张图片,向您展示我的意思:

我认为这张图片很容易解释。 IFFT信号只是“ FFT频谱”的逆变换,“差”图是IFFT信号与原始信号($ \ text {IFFT-Original} $)之间的差。

显然有一些文物,尽管它们确实很小。我想知道为什么它们首先出现。这是因为傅立叶变换的有限窗口吗?还是由于FFT算法中的某些问题?

注意:该图具有32点,但是我已经检查了100、1000、1024、256和64点,并且始终存在此残差大小相似($ 10 ^ {-16} $或$ 10 ^ {-15} $)。

评论

所有有限精度的数学运算都有这些错误,而不仅仅是FFT。

#1 楼

您看到的差异是由于浮点格式的数字错误所致。执行FFT和逆FFT所需的所有操作只能以有限的精度完成,并且您已经在右下图中显示了这种有限精度的结果。

评论


$ \ begingroup $
会不会出现这种误差超出浮点精度的情况?
$ \ endgroup $
– Kitchi
13年5月21日在20:14

$ \ begingroup $
为了确认@MattL的答案:$ 10 ^ {-16} \ approx 2 ^ {-53} $并且双精度浮点数中有53位尾数。因此,您看到的舍入误差仅在最后2位。那差不多就可以了。
$ \ endgroup $
–流浪逻辑
13年5月21日在20:18

$ \ begingroup $
@Kitchi:是的,即使在浮点格式中,在很多情况下数值误差也可能是一个主要问题。矩阵求逆将是许多示例之一。这都与条件编号有关。
$ \ endgroup $
– Matt L.
13年5月21日在20:39



$ \ begingroup $
@MattL。 -太好了!感谢您的参考。
$ \ endgroup $
– Kitchi
13年5月21日在21:25

#2 楼

通常,数字不能完全以数字形式表示。引入了错误。如果您在Matlab中,则可以在命令中输入eps,它会为您提供一个数字。


EPS,不带参数,是从1.0到下一个较大精度数的距离,即EPS = 2 ^(-52)。


您在绘图中看到的错误在eps返回的范围内(即2 ^(-52))。

即使您期望IFFT输出中的实数值,您可能也会看到虚部不完全等于零。一样。