Python FFT 频域滤波
介绍
快速傅里叶变换(FFT)是一种将信号从时间域转换到频域的算法。在信号处理中,频域滤波是一种常用的技术,用于去除噪声、突出频率特征等。Python提供了强大且易于使用的FFT库,使频域滤波更加简便。
本文将介绍Python中的FFT库和频域滤波的基本原理,以及如何使用这些工具进行频域滤波。
FFT 基本原理
傅里叶变换是将一个信号从时间域转换到频域的过程。它将信号表示为不同频率的正弦和余弦波的线性组合。傅里叶变换可以分为离散傅里叶变换(DFT)和快速傅里叶变换(FFT)两种。
FFT是一种高效的DFT实现方法,利用了信号的对称性质,将计算复杂度从O(N^2)降低到O(Nlog(N))。这使得FFT成为处理大量数据的理想选择。
Python FFT 库
Python提供了多个FFT库,包括numpy.fft
和scipy.fftpack
。这些库提供了方便且高效的FFT算法和相应的频域滤波工具。
numpy.fft
numpy.fft
是Python中最常用的FFT库之一。它提供了快速的FFT算法和各种频域操作功能。以下是一个使用numpy.fft
进行FFT和频域滤波的示例:
import numpy as np
# 生成信号
t = np.linspace(0, 1, 1000)
x = np.sin(2*np.pi*50*t) + np.sin(2*np.pi*120*t)
# 进行FFT
fft = np.fft.fft(x)
# 获取频率轴
freq = np.fft.fftfreq(len(x), t[1]-t[0])
# 频域滤波
mask = np.abs(freq) > 100
fft = fft * mask
# 反向FFT
filtered_x = np.fft.ifft(fft)
# 绘制原始信号和滤波后信号
import matplotlib.pyplot as plt
plt.plot(t, x, label='Original signal')
plt.plot(t, filtered_x, label='Filtered signal')
plt.xlabel('Time')
plt.ylabel('Amplitude')
plt.legend()
plt.show()
在这个示例中,我们首先生成了一个由两个正弦波叠加而成的信号。然后使用np.fft.fft
函数进行FFT变换,并使用np.fft.fftfreq
函数获取频率轴。接下来,我们通过创建一个布尔掩码来定义滤波器,将低频部分屏蔽掉。最后,使用np.fft.ifft
函数进行反向FFT变换,恢复滤波后的信号。
scipy.fftpack
scipy.fftpack
是另一个常用的FFT库,它提供了更多的FFT变换选项和频域滤波工具。以下是一个使用scipy.fftpack
进行FFT和频域滤波的示例:
import numpy as np
from scipy.fftpack import fft, fftfreq, ifft
# 生成信号
t = np.linspace(0, 1, 1000)
x = np.sin(2*np.pi*50*t) + np.sin(2*np.pi*120*t)
# 进行FFT
fft = fft(x)
# 获取频率轴
freq = fftfreq(len(x), t[1]-t[0])
# 频域滤波
mask = np.abs(freq) > 100
fft = fft * mask
# 反向FFT
filtered_x = ifft(fft)
# 绘制原始信号和滤波后信号
import matplotlib.pyplot as plt
plt.plot(t, x, label='Original signal')
plt.plot(t, filtered_x, label='Filtered signal')
plt.xlabel('Time')
plt.ylabel('Amplitude')
plt.legend()
plt.show()
这个示例中的代码与numpy.fft
示例非常相似,只是导入和函数调用的方式稍有不同。