离散傅里叶变换#

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])

计算具有 Hermitian 对称性的信号的逆 FFT.

辅助例程#

fftfreq (n[, d, device])

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

rfftfreq (n[, d, device])

返回离散傅里叶变换采样频率(用于 rfft,irfft).

fftshift (x[, axes])

将零频率分量移到频谱的中心.

ifftshift (x[, axes])

fftshift 的逆.

背景信息#

傅里叶分析从根本上来说是一种将函数表示为周期分量之和,并从这些分量中恢复函数的方法.当函数及其傅里叶变换都被离散化的对应物代替时,它被称为离散傅里叶变换 (DFT).DFT 已经成为数值计算的主要方法,部分原因是存在一种非常快速的算法来计算它,称为快速傅里叶变换 (FFT),高斯(1805 年)就知道这种算法,并且由 Cooley 和 Tukey [CT] 以当前形式将其公之于众.Press et al. [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 指示direct/inverse变换对的哪个方向被缩放以及使用什么归一化因子.默认归一化 ( "backward" ) 使直接(正向)变换不缩放,而逆(反向)变换按 \(1/n\) 缩放.可以通过将关键字参数 norm 设置为 "ortho" 来获得酉变换,以便直接和逆变换都按 \(1/\sqrt{n}\) 缩放.最后,将关键字参数 norm 设置为 "forward" 会使直接变换按 \(1/n\) 缩放,而逆变换不缩放(即与默认 "backward" 完全相反). None 是默认选项 "backward" 的别名,用于向后兼容.

实数和 Hermitian 变换#

当输入纯粹是实数时,其变换是 Hermitian,即频率 \(f_k\) 处的分量是频率 \(-f_k\) 处的分量的复共轭,这意味着对于实数输入,负频率分量中没有正频率分量中已有的信息. rfft 函数族旨在对实数输入进行操作,并通过仅计算正频率分量(直到并包括奈奎斯特频率)来利用此对称性.因此, n 个输入点产生 n/2+1 个复数输出点.此函数族的逆假定其输入的相同对称性,并且对于 n 个点的输出,使用 n/2+1 个输入点.

相应地,当频谱纯粹是实数时,信号是 Hermitian. 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., and John W. Tukey, 1965, “An algorithm for the machine calculation of complex Fourier series,” Math. Comput. 19: 297-301.

[NR]

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.

示例#

有关示例,请参见各种函数.