离散傅里叶变换 (numpy.fft)#

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 维逆离散傅里叶变换.

实数快速傅里叶变换#

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

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

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

计算 rfft 的逆.

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

计算实数数组的二维傅里叶变换.

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

计算 rfft2 的逆.

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

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

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

计算 rfftn 的逆.

Hermitian FFTs#

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

计算具有厄米对称性的信号的FFT,即,实谱.

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

计算具有厄米对称性的信号的逆傅里叶变换.

辅助例程#

fftfreq(n[, d, device])

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

rfftfreq(n[, d, device])

返回离散傅里叶变换样本频率(用于与 rfft, irfft 一起使用).

fftshift(x[, axes])

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

ifftshift(x[, axes])

fftshift 的逆操作.

背景信息#

傅里叶分析从根本上说是一种将函数表示为周期成分之和的方法,以及从这些成分中恢复函数的方法.当函数及其傅里叶变换都被替换为离散对应物时,称为离散傅里叶变换(DFT).DFT之所以成为数值计算的支柱,部分原因是一种计算它的非常快的算法,称为快速傅里叶变换(FFT),该算法已为高斯(1805年)所知,并在库利和图基[Rfb1dc64dd6a5-CT]之后以当前形式被提出.Press等人[Rfb1dc64dd6a5-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, Numerical Recipes: The Art of Scientific Computing, ch. 12-13. Cambridge Univ. Press, Cambridge, UK.

示例

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