用python 写一个fft滤波程序
时间: 2023-10-24 10:07:57 浏览: 90
好的,以下是一个使用Python实现FFT滤波的示例代码:
```python
import numpy as np
import matplotlib.pyplot as plt
# 生成测试信号
fs = 1000 # 采样率
t = np.arange(0, 1, 1/fs) # 时间序列
f1 = 50 # 信号1频率
f2 = 150 # 信号2频率
x = np.sin(2*np.pi*f1*t) + 0.5*np.sin(2*np.pi*f2*t)
# 可视化原始信号
plt.subplot(2, 1, 1)
plt.plot(t, x)
plt.title('Original Signal')
plt.xlabel('Time (s)')
plt.ylabel('Amplitude')
# 计算FFT
N = len(x) # 信号长度
X = np.fft.fft(x) # FFT结果
f = np.arange(0, fs/2, fs/N) # 频率序列
# 可视化FFT结果
plt.subplot(2, 1, 2)
plt.plot(f, abs(X[:N//2]))
plt.title('FFT Result')
plt.xlabel('Frequency (Hz)')
plt.ylabel('Amplitude')
# 进行滤波
fc = 80 # 截止频率
H = np.zeros(N//2) # 滤波器频率响应
H[:fc] = 1 # 低通滤波器
H[-fc:] = 1 # 高通滤波器
X_filtered = X * H # 滤波后的FFT结果
x_filtered = np.fft.ifft(X_filtered) # 恢复时域信号
# 可视化滤波后的信号
plt.figure()
plt.plot(t, x_filtered.real)
plt.title('Filtered Signal')
plt.xlabel('Time (s)')
plt.ylabel('Amplitude')
plt.show()
```
上述代码首先生成了一个包含两个正弦波的测试信号,然后对其进行了FFT计算并可视化了结果。接下来,我们根据需要设定一个截止频率,生成一个低通或高通滤波器,并将其应用于FFT结果中。最后,使用ifft函数将滤波后的FFT结果转换回时域信号,并可视化滤波后的信号。
阅读全文