设计低通滤波器:要求通带截止频率为0.3π,最大衰减为2dB;阻带截止频率为0.6π,最小衰减为50dB。同时画出其幅频曲线和相频曲线,其代码怎么写
时间: 2023-06-02 15:03:55 浏览: 208
这是一个技术问题,我可以回答。为了设计低通滤波器,您可以使用以下代码:
N = 6 # 滤波器阶数
f_lpt = 0.3 * np.pi # 通带截止频率
f_hpt = 0.6 * np.pi # 阻带截止频率
# 计算理想滤波器的幅度和相位响应
h_ideal = np.zeros(N)
w = np.linspace(0, np.pi, 1000)
for i, t in enumerate(w):
if t <= f_lpt: # 通带
h_ideal += np.cos(np.pi * N / 2 * (t / f_lpt))
elif t >= f_hpt: # 阻带
h_ideal += 0
else: # 过渡带
h_ideal += np.cos(np.pi * N / 2 * ((f_hpt - t) / (f_hpt - f_lpt)))
h_ideal *= np.hanning(h_ideal.size)
# 使用firwin函数设计FIR滤波器
b = signal.firwin(N, cutoff=[f_lpt, f_hpt], pass_zero=True, window='hann')
# 计算滤波器的幅度和相位响应
w, h = signal.freqz(b)
# 绘制幅度响应图像
fig, ax1 = plt.subplots()
ax1.set_title('Digital filter frequency response')
ax1.plot(w, 20 * np.log10(abs(h)), 'b')
ax1.set_ylabel('Amplitude [dB]', color='b')
ax1.set_xlabel('Frequency [rad/sample]')
ax1.grid()
# 绘制相位响应图像
ax2 = ax1.twinx()
angles = np.unwrap(np.angle(h))
ax2.plot(w, angles, 'g')
ax2.set_ylabel('Phase (radians)', color='g')
ax2.grid(color='g', linestyle='-', linewidth=0.5)
plt.show()
需要用到的库有numpy、scipy.signal和matplotlib,您可以根据自己的需要进行调整。
阅读全文