NumPy - 快速傅里叶变换
NumPy 快速傅里叶变换
快速傅里叶变换 (FFT) 是一种计算离散傅里叶变换 (DFT) 及其逆变换的快速方法。它通过将计算时间从 O(n2) 缩短到 O(nlogn) 来加速计算过程,使其速度更快,尤其是在处理大型数据集时。
在 NumPy 中,您可以使用 fft 模块计算 FFT,该模块包含用于一维和多维 FFT 计算的函数。
使用 fft() 函数计算 FFT
numpy.fft.fft() 函数计算数组的一维 n 点 FFT。它将信号从时域变换到频域。
fft(x) = 输入数组 x 的快速傅里叶变换
示例:计算 FFT
在以下示例中,我们使用 fft() 函数计算一维数组(信号)的快速傅里叶变换 -
import numpy as np # 定义一个简单的信号 signal = np.array([1, 2, 3, 4]) # 计算信号的快速傅里叶变换 fft_signal = np.fft.fft(signal) print("信号的 FFT:", fft_signal)
我们得到如下所示的输出−
信号的 FFT:[10.+0.j -2.+2.j -2.+0.j -2.-2.j]
计算逆 FFT
numpy.fft.ifft() 函数计算快速傅里叶变换的逆,将频率分量转换回原始时域信号。这在您想要根据信号的频率表示重建信号时非常有用。
ifft(x) = 输入数组 x 的逆快速傅里叶变换
示例:逆 FFT
在以下示例中,我们使用 NumPy 的 ifft() 函数计算先前计算的 FFT 的逆 FFT -
import numpy as np # 定义信号的 FFT(先前计算) fft_signal = np.array([10+0j, -2+2j, -2+0j, -2-2j]) # 计算逆快速傅里叶变换 reconstructed_signal = np.fft.ifft(fft_signal) print("重构信号:", reconstructed_signal)
结果如下 −
重构信号: [1.+0.j 2.+0.j 3.+0.j 4.+0.j]
计算实数信号的 FFT
numpy.fft.rfft() 函数已针对计算实数输入信号的 FFT 进行了优化。此函数仅返回非负频率项,因为负频率项对于实值信号来说是多余的。
rfft(x) = 实值输入数组 x 的 FFT
示例:实信号的 FFT
在以下示例中,我们使用 NumPy 的 rfft() 函数计算实值信号的快速傅里叶变换 -
import numpy as np # 定义一个实值信号 signal = np.array([1, 2, 3, 4]) # 计算实值信号的快速傅里叶变换 fft_real_signal = np.fft.rfft(signal) print("实值信号的 FFT:", fft_real_signal)
执行上述代码后,我们得到以下输出 -
实值信号的 FFT:[10.+0.j -2.+2.j -2.+0.j]
计算实信号的逆 FFT
numpy.fft.irfft() 函数计算实值信号的 FFT 逆,从其非负频率重建原始时域信号组件。
irfft(x) = 实数输入数组 x 的逆 FFT
示例:实数信号的逆 FFT
在以下示例中,我们计算实数信号的逆 FFT −
import numpy as np # 定义实值信号的 FFT(先前计算) fft_real_signal = np.array([10+0j, -2+2j]) # 计算实值 FFT 的逆 FFT reconstructed_real_signal = np.fft.irfft(fft_real_signal) print("重构的实值信号:", reconstructed_real_signal)
得到的输出如下所示 -
重构的实值信号:[4. 6.]
使用 fftfreq() 函数进行频率分箱
numpy.fft.fftfreq() 函数用于生成与 FFT 分量对应的采样频率数组。这对于绘制信号的频率分量或分析其频谱内容非常有用。
fftfreq(n, d=1) = 对应于具有 n 个点、间隔为 d 的数组的 FFT 的频率
示例:频率分箱
在以下示例中,我们生成对应于信号 FFT 的频率 -
import numpy as np # 定义 FFT 中的点数和样本间距 n_points = 4 spacing = 1 # 生成对应于 FFT 的频率 frequencies = np.fft.fftfreq(n_points, Spacing) print("对应于 FFT 的频率:", Frequencies)
以下是上述代码的输出代码 −
FFT 对应的频率:[ 0. 0.25 -0.5 -0.25]
在多维数组中使用 FFT
NumPy 的 fft 模块也支持多维数组,允许您沿数组的特定轴计算 FFT。 numpy.fft.fftn() 函数计算 n 维 FFT,而 numpy.fft.ifftn() 函数计算 n 维 FFT 的逆。
fftn(x) = 数组 x 的 N 维快速傅里叶变换
示例:二维 FFT
在以下示例中,我们计算二维数组的二维 FFT -
import numpy as np # 定义二维信号 signal_2d = np.array([[1, 2], [3, 4]]) # 计算二维快速傅里叶变换 fft_2d_signal = np.fft.fftn(signal_2d) print("信号的二维 FFT:", fft_2d_signal)
这将产生以下结果 -
信号的二维 FFT: [[10.+0.j -2.+0.j] [-4.+0.j 0.+0.j]]