带通滤波器的设计与实现绘图部分代码
时间: 2024-12-14 09:15:55 浏览: 1
带通滤波器的设计通常涉及确定所需频率范围和滤波器的类型,比如 Butterworth、Chebyshev、Bessel 或 elliptic 等。设计过程包括计算截止频率、选择滤波器阶数以及利用滤波库函数生成系数。
在 Python 中,如果你打算使用 `scipy.signal` 库来绘制滤波器的幅频响应和相频响应,可以参考以下简单的示例:
```python
import numpy as np
from scipy import signal
import matplotlib.pyplot as plt
# 设定滤波器参数
fs = 1000 # 采样率
cutoff_freq = [100, 500] # 上限和下限频率 (Hz)
filter_order = 4 # 滤波器阶数
# 创建低通和高通滤波器
b, a = signal.butter(filter_order, cutoff_freq, btype='bandpass', fs=fs)
# 计算并绘制滤波器特性
w, h = signal.freqz(b, a, worN=8000) # 获取幅频和相频响应
freqs = w / (2 * np.pi) * fs # 将频率从 rad/s 转换为 Hz
fig, axs = plt.subplots(nrows=2, ncols=1, sharex=True, figsize=(10, 6))
# 绘制幅频响应
axs[0]..semilogx(freqs, 20 * np.log10(abs(h)), 'b') # 对数坐标
axs[0].set_title('Band-Pass Filter Frequency Response')
axs[0].grid(True)
axs[0].arrow(cutoff_freq[0], -60, 0, 20, head_width=10, color='r', alpha=0.7) # 标记截止频率
axs[0].arrow(cutoff_freq[1], -60, 0, 20, head_width=10, color='g', alpha=0.7)
# 绘制相频响应
axs[1].semilogx(freqs, np.unwrap(np.angle(h))*180/np.pi, 'b')
axs[1].set_ylabel('Phase (degrees)')
axs[1].margins(0.05)
axs[1].grid(True)
plt.xlabel('Frequency (Hz)')
plt.tight_layout()
plt.show()
阅读全文