离散傅里叶变换 (numpy.fft
)#
SciPy 模块 scipy.fft
是 numpy.fft
的更全面的超集,它只包含一组基本的例程。
标准 FFT#
实数 FFT#
厄米特 FFT#
辅助例程#
背景信息#
傅里叶分析本质上是一种将函数表示为周期分量之和的方法,以及从这些分量中恢复函数的方法。当函数及其傅里叶变换都被替换为离散对应物时,它被称为离散傅里叶变换 (DFT)。DFT 成为数值计算的支柱,部分原因在于它有一个非常快的计算算法,称为快速傅里叶变换 (FFT),该算法为高斯 (1805) 所知,并以其当前形式由库利和图基 [CT] 提出。普雷斯等人 [NR] 对傅里叶分析及其应用进行了易于理解的介绍。
由于离散傅里叶变换将它的输入分离成在离散频率处贡献的成分,它在数字信号处理中有很多应用,例如用于滤波,在这个背景下,变换的离散输入习惯上被称为 *信号*,它存在于 *时域* 中。输出称为 *频谱* 或 *变换*,它存在于 *频域* 中。
实现细节#
有很多方法可以定义 DFT,它们在指数的符号、归一化等方面有所不同。在这个实现中,DFT 定义为
DFT 通常为复数输入和输出定义,在线性频率为 \(f\) 的单频率分量由复数指数 \(a_m = \exp\{2\pi i\,f m\Delta t\}\) 表示,其中 \(\Delta t\) 是采样间隔。
结果中的值遵循所谓的“标准”顺序:如果 A = fft(a, n)
,则 A[0]
包含零频率项(信号的总和),对于实数输入,它始终是纯实数。然后 A[1:n/2]
包含正频率项,而 A[n/2+1:]
包含负频率项,按负频率递减的顺序排列。对于偶数个输入点,A[n/2]
表示正负奈奎斯特频率,对于实数输入也是纯实数。对于奇数个输入点,A[(n-1)/2]
包含最大的正频率,而 A[(n+1)/2]
包含最大的负频率。例程 np.fft.fftfreq(n)
返回一个数组,该数组给出输出中对应元素的频率。例程 np.fft.fftshift(A)
会将变换及其频率进行移位,以便将零频率分量放在中间,而 np.fft.ifftshift(A)
会撤销该移位。
当输入 a 是时域信号且 A = fft(a)
时,np.abs(A)
是它的幅度谱,而 np.abs(A)**2
是它的功率谱。相位谱由 np.angle(A)
获得。
逆 DFT 定义为
它与正向变换的不同之处在于指数参数的符号和默认情况下 \(1/n\) 的归一化。
类型提升#
numpy.fft
将 float32
和 complex64
数组分别提升到 float64
和 complex128
数组。对于不提升输入数组的 FFT 实现,请参阅 scipy.fftpack
。
归一化#
参数 norm
指示正向/逆变换对中的哪个方向进行缩放以及使用什么归一化因子。默认归一化 ("backward"
) 使正向变换不进行缩放,而逆变换则按 \(1/n\) 进行缩放。可以通过将关键字参数 norm
设置为 "ortho"
来获得酉变换,以便正向和逆变换都按 \(1/\sqrt{n}\) 进行缩放。最后,将关键字参数 norm
设置为 "forward"
会使正向变换按 \(1/n\) 进行缩放,而逆变换不进行缩放(即与默认的 "backward"
恰好相反)。None 是默认选项 "backward"
的别名,用于向后兼容性。
实数和厄米特变换#
当输入是纯实数时,它的变换是厄米特的,即频率为 \(f_k\) 的分量是频率为 \(-f_k\) 的分量的复共轭,这意味着对于实数输入,负频率分量中没有正频率分量中没有的信息。rfft
函数族专为处理实数输入而设计,并利用这种对称性,仅计算正频率分量,直至奈奎斯特频率(包含奈奎斯特频率)。因此,n
个输入点会产生 n/2+1
个复数输出点。此函数族的逆变换假设其输入具有相同的对称性,对于 n
个输出点,它会使用 n/2+1
个输入点。
相应地,当频谱是纯实数时,信号是厄米特的。hfft
函数族利用这种对称性,在输入(时域)中使用 n/2+1
个复数点来表示频域中的 n
个实数点。
在更高维度中,FFT被用于图像分析和滤波等应用。 FFT的计算效率意味着它也可以是一种更快的计算大型卷积的方法,因为它利用了时域卷积等效于频域逐点乘法的性质。
更高维度#
在二维情况下,DFT定义为
该定义可以很容易地扩展到更高维度,反变换在更高维度上的扩展也类似。
参考文献#
Cooley, James W., and John W. Tukey, 1965, “An algorithm for the machine calculation of complex Fourier series,” Math. Comput. 19: 297-301.
Press, W., Teukolsky, S., Vetterline, W.T., and Flannery, B.P., 2007, Numerical Recipes: The Art of Scientific Computing, ch. 12-13. Cambridge Univ. Press, Cambridge, UK.
示例#
有关示例,请参见各种函数。