NumPy - 离散傅里叶变换
NumPy 离散傅里叶变换
离散傅里叶变换 (DFT) 是一种数学技术,用于将值序列转换为不同频率的分量。它广泛应用于信号处理、图像分析和音频处理。
在 NumPy 中,可以使用 fft(快速傅里叶变换)模块来计算 DFT,该模块提供了计算 DFT 及其逆变换的实现。
DFT 有助于分析信号的频率内容,因此在许多应用中非常有用,包括滤波、信号压缩和频谱分析。
使用 fft() 函数计算 DFT
numpy.fft.fft() 函数计算数组的一维 n 点离散傅里叶变换 (DFT)。该函数返回输入信号的频率分量,零频率分量位于输出数组的开头。
fft(x) = 输入数组 x 的离散傅里叶变换
示例:计算 DFT
在以下示例中,我们使用 NumPy 的 fft() 函数计算一维数组的离散傅里叶变换 −
import numpy as np
# 定义样本数据(信号)的数组
signal = np.array([1, 2, 3, 4])
# 计算信号的离散傅里叶变换
dft_signal = np.fft.fft(signal)
print("DFT of the signal:", dft_signal)
上述代码的结果为 −
DFT of the signal: [10.+0.j -2.+2.j -2.+0.j -2.-2.j]
计算逆 DFT
numpy.fft.ifft() 函数计算离散傅里叶变换的逆变换,将频率分量转换回原始时域信号。这在希望从频率表示重建信号时非常有用。
ifft(x) = 输入数组 x 的逆离散傅里叶变换
示例:逆 DFT
在以下示例中,我们使用 NumPy 的 ifft() 函数计算先前计算的 DFT 的逆离散傅里叶变换 −
import numpy as np
# 定义信号的 DFT(先前计算得到)
dft_signal = np.array([10+0j, -2+2j, -2+0j, -2-2j])
# 计算 DFT 的逆离散傅里叶变换
reconstructed_signal = np.fft.ifft(dft_signal)
print("Reconstructed signal:", reconstructed_signal)
得到以下输出 −
Reconstructed signal: [1.+0.j 2.+0.j 3.+0.j 4.+0.j]
计算实信号的 DFT
numpy.fft.rfft() 函数针对实输入信号的 DFT 计算进行了优化。该函数仅返回非负频率项,因为对于实值信号,负频率项是冗余的。
rfft(x) = 实值输入数组 x 的 DFT
示例:实信号的 DFT
在以下示例中,我们使用 NumPy 的 rfft() 函数计算实值信号的离散傅里叶变换 −
import numpy as np
# 定义实值信号
signal = np.array([1, 2, 3, 4])
# 计算实值信号的离散傅里叶变换
dft_real_signal = np.fft.rfft(signal)
print("DFT of the real-valued signal:", dft_real_signal)
将产生以下结果 −
DFT of the real-valued signal: [10.+0.j -2.+2.j -2.+0.j]
计算实信号的逆 DFT
numpy.fft.irfft() 函数用于计算实值信号的 DFT 逆变换,从其非负频率分量重建原始时域信号。
irfft(x) = 实值输入数组 x 的逆 DFT
示例:实信号的逆 DFT
在以下示例中,我们计算一个实值信号的逆 DFT −
import numpy as np
# 定义实值信号的 DFT(先前计算得到)
dft_real_signal = np.array([10+0j, -2+2j])
# 计算实值 DFT 的逆离散傅里叶变换
reconstructed_real_signal = np.fft.irfft(dft_real_signal)
print("Reconstructed real-valued signal:", reconstructed_real_signal)
以上代码的输出如下 −
Reconstructed real-valued signal: [4. 6.]
使用 fftfreq() 函数进行频率分箱
numpy.fft.fftfreq() 函数用于生成与 DFT 分量对应的采样频率数组。这对于绘制信号的频率分量或分析其频谱内容非常有用。
fftfreq(n, d=1) = 具有 n 个点的数组的 DFT 对应的频率,间隔为 d
示例:频率分箱
在以下示例中,我们生成信号的 DFT 对应的频率 −
import numpy as np
# 定义 DFT 中的点数和采样间隔
n_points = 4
spacing = 1
# 生成对应于 DFT 的频率
frequencies = np.fft.fftfreq(n_points, spacing)
print("Frequencies corresponding to the DFT:", frequencies)
得到的输出如下所示 −
Frequencies corresponding to the DFT: [ 0. 0.25 -0.5 -0.25]