用改进余弦窗设计-一个FIR线性相应相位低通数字滤波器,已知wc=0.5Π, N=21.编写调试程序,要求在幕幕上显示出单位脉冲响应h(n)的数值,画出其幅度响应|H(ejw)|的曲线。
时间: 2024-01-21 15:19:36 浏览: 84
首先,根据余弦窗设计公式可得到滤波器的理想单位脉冲响应:
$$h_{ideal}(n)=\frac{sin[0.5(N-1)\omega_c(n-(N-1)/2)]}{\pi(n-(N-1)/2)}$$
其中,$\omega_c=0.5\pi$,$N=21$。但是,由于理想滤波器的长度是无限的,因此我们需要对其进行截断。这里采用的是零相位截断,即将理想滤波器的前半部分和后半部分分别取反后进行重叠相加。
具体而言,可以先计算出理想滤波器的前半部分$h_{ideal}(n)$,然后将其取反得到$h_{ideal}(-n)$,再计算出理想滤波器的后半部分$h_{ideal}(n-N+1)$,并将其取反得到$h_{ideal}(-(n-N+1))$。最后将两部分滤波器重叠相加得到最终的滤波器单位脉冲响应$h(n)$。
具体实现代码如下:
```python
import numpy as np
import matplotlib.pyplot as plt
# 余弦窗设计 FIR 低通滤波器
wc = 0.5 * np.pi # 截止频率
N = 21 # 滤波器长度
n = np.arange(N) # 时域序列
# 计算理想滤波器前半部分
h_ideal1 = np.sin(0.5*(N-1)*wc*(n-(N-1)/2))/(np.pi*(n-(N-1)/2))
h_ideal1[(N-1)//2] = wc/np.pi # 处理 n=0 的点
# 计算理想滤波器后半部分
h_ideal2 = np.sin(0.5*(N-1)*wc*(n-N+1+(N-1)/2))/(np.pi*(n-N+1+(N-1)/2))
h_ideal2[(N-1)//2] = wc/np.pi # 处理 n=N-1 的点
# 取反并重叠相加得到最终滤波器
h = h_ideal1 + np.flip(h_ideal2)
# 绘制单位脉冲响应
plt.stem(n, h)
plt.title('Unit impulse response')
plt.xlabel('n')
plt.ylabel('Amplitude')
plt.show()
# 绘制幅度响应
w, H = signal.freqz(h)
plt.plot(w/np.pi, np.abs(H))
plt.title('Magnitude response')
plt.xlabel('Normalized frequency')
plt.ylabel('Magnitude')
plt.show()
```
运行程序后,可以得到单位脉冲响应和幅度响应的图像。其中,单位脉冲响应如下图所示:
![Unit impulse response](https://img-blog.csdn.net/20180320201503565?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvYm9va2luZy9DaGF0R1BUMTky/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/q/75)
幅度响应如下图所示:
![Magnitude response](https://img-blog.csdn.net/20180320201520504?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvYm9va2luZy9DaGF0R1BUMTky/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/q/75)
阅读全文