离散傅里叶变换#

SciPy 模块 scipy.fftnumpy.fft 的一个更全面的超集,后者仅包含一组基本的例程。

标准 FFT#

fft(a[, n, axis, norm, out])

计算一维离散傅里叶变换。

ifft(a[, n, axis, norm, out])

计算一维逆离散傅里叶变换。

fft2(a[, s, axes, norm, out])

计算二维离散傅里叶变换。

ifft2(a[, s, axes, norm, out])

计算二维逆离散傅里叶变换。

fftn(a[, s, axes, norm, out])

计算 N 维离散傅里叶变换。

ifftn(a[, s, axes, norm, out])

计算 N 维逆离散傅里叶变换。

实数 FFT#

rfft(a[, n, axis, norm, out])

计算实数输入的一维离散傅里叶变换。

irfft(a[, n, axis, norm, out])

计算 rfft 的逆变换。

rfft2(a[, s, axes, norm, out])

计算实数数组的二维 FFT。

irfft2(a[, s, axes, norm, out])

计算 rfft2 的逆变换。

rfftn(a[, s, axes, norm, out])

计算实数输入的 N 维离散傅里叶变换。

irfftn(a[, s, axes, norm, out])

计算 rfftn 的逆变换。

厄米特 FFT#

hfft(a[, n, axis, norm, out])

计算具有厄米特对称性(即实数频谱)信号的 FFT。

ihfft(a[, n, axis, norm, out])

计算具有厄米特对称性信号的逆 FFT。

辅助例程#

fftfreq(n[, d, device])

返回离散傅里叶变换的采样频率。

rfftfreq(n[, d, device])

返回离散傅里叶变换的采样频率(用于 rfftirfft)。

fftshift(x[, axes])

将零频率分量移动到频谱中心。

ifftshift(x[, axes])

fftshift 的逆变换。

背景信息#

傅里叶分析本质上是一种将函数表示为周期分量之和,并从这些分量中恢复函数的方法。当函数及其傅里叶变换都被离散化时,它被称为离散傅里叶变换 (DFT)。DFT 之所以成为数值计算的重要组成部分,部分原因在于其计算有一个非常快速的算法,称为快速傅里叶变换 (FFT),该算法为高斯 (Gauss, 1805) 所知,并由 Cooley 和 Tukey [CT] 以其当前形式呈现。Press 等人 [NR] 提供了傅里叶分析及其应用的易懂介绍。

由于离散傅里叶变换将其输入分解为在离散频率处贡献的分量,因此它在数字信号处理中具有广泛的应用,例如用于滤波;在此背景下,变换的离散化输入通常被称为*信号*,它存在于*时域*中。输出被称为*频谱*或*变换*,存在于*频域*中。

实现细节#

定义 DFT 的方法有很多种,它们的指数符号、归一化等各不相同。在此实现中,DFT 定义为

\[A_k = \sum_{m=0}^{n-1} a_m \exp\left\{-2\pi i{mk \over n}\right\} \qquad k = 0,\ldots,n-1.\]

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 定义为

\[a_m = \frac{1}{n}\sum_{k=0}^{n-1}A_k\exp\left\{2\pi i{mk\over n}\right\} \qquad m = 0,\ldots,n-1.\]

它与正向变换的区别在于指数参数的符号以及默认的 \(1/n\) 归一化。

类型提升#

numpy.fftfloat32complex64 数组分别提升为 float64complex128 数组。对于不提升输入数组的 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 定义为

\[A_{kl} = \sum_{m=0}^{M-1} \sum_{n=0}^{N-1} a_{mn}\exp\left\{-2\pi i \left({mk\over M}+{nl\over N}\right)\right\} \qquad k = 0, \ldots, M-1;\quad l = 0, \ldots, N-1,\]

这以显而易见的方式扩展到更高维度,更高维度中的逆变换也以同样的方式扩展。

参考文献#

[CT]

Cooley, James W., 和 John W. Tukey, 1965, “复数傅里叶级数机器计算算法,” *Math. Comput.* 19: 297-301.

[NR]

Press, W., Teukolsky, S., Vetterline, W.T., 和 Flannery, B.P., 2007, *数值食谱:科学计算的艺术*, 第 12-13 章。剑桥大学出版社,剑桥,英国。

示例#

有关示例,请参阅各个函数。