首页 > 解决方案 > 为什么将 NumPy FFT 的输出除以 N?

问题描述

在许多教程/博客中,我看到了np.fft.fft(signal)除以样本点数的输出N

我知道在某些实现中,变换是通过一些因素来缩放/标准化的,比如乘以N. 但是,我只是阅读了文档,默认情况下输出fft.fft()是未缩放的。然而,我仍然看到输出除以N任何地方。

为什么是这样?

我注意到,通过按比例缩放输出,1/N我可以得到贡献波信号的正确幅度。所以显然这是必要的,但我想了解纯输出与缩放输出相比是什么。

标签: pythonnumpysignalssignal-processingfft

解决方案


要使 DFT 可逆 ( x == IDFT(DFT(x))),您需要除以N某处。在信号处理中,这种归一化通常在逆变换中完成。例如Wikipedia 以这种方式显示它。在其他领域,它更经常在前向变换中完成。在物理学中,我已经看到一半的归一化 ( 1/sqrt(N)) 应用于每个变换,使它们对称。

当正向变换归一化时,它返回的值与信号长度无关(例如,零频率是所有信号值的平均值)。因此,在研究信号功率时,这是更有用的变体。

在逆变换中应用归一化的变体(通常在信号处理软件中实现,例如np.fft.fft()和 MATLAB 的fft),然后在频域中通过乘法计算卷积是最简单的:可以直接编写g = IDFT(DFT(f)*DFT(h)). 如果在其他地方应用归一化,则必须部分撤消以获得正确缩放的结果。

其他软件,例如 FFTW 库,根本不规范化转换,这取决于用户。如果用户想要一个不同于库选择的标准化变体,这可以避免不必要的乘法。


推荐阅读