编写程序实现FIR滤波器设计,具体要求如下:用窗函数法设计一个线性相位FIR低通滤波器,要求Wp=0.22π,Ws=0.36π,Ap=3dB,As=50dB;在屏幕上打印出数字滤波器的频率区间【0,π】上的幅频响应特性曲线|H(e^jw)|和20log10|H(e^jw)|,并在屏幕上打印出单位脉冲响应h(n)的图形和数值,以及滤波器所要求的最小长度N
时间: 2023-07-05 09:31:53 浏览: 108
好的,以下是一个Python实现的程序,可以实现您的要求:
```python
import numpy as np
import matplotlib.pyplot as plt
# 模拟信号
t = np.linspace(0, 1, 1000)
x = np.sin(2 * np.pi * 10 * t) + np.sin(2 * np.pi * 30 * t)
# 计算滤波器的阶数
wp = 0.22 * np.pi
ws = 0.36 * np.pi
Ap = 3
As = 50
delta_p = (10 ** (0.05 * Ap) - 1) / (10 ** (0.05 * Ap) + 1)
delta_s = 10 ** (-0.05 * As)
delta = min(delta_p, delta_s)
N = np.ceil((As - 8) / (4.57 * (ws - wp)))
# 计算滤波器的截止频率
wc = wp
# 计算窗口函数
n = np.arange(N)
w = 0.54 - 0.46 * np.cos(2 * np.pi * n / (N - 1))
# 计算单位脉冲响应
h = np.zeros(N)
for i in range(N):
if i == (N - 1) / 2:
h[i] = wc / np.pi
else:
h[i] = np.sin(wc * (i - (N - 1) / 2)) / (np.pi * (i - (N - 1) / 2))
h[i] = h[i] * w[i]
# 绘制单位脉冲响应
plt.stem(h)
plt.title('Unit Impulse Response')
plt.xlabel('n')
plt.ylabel('h(n)')
plt.show()
# 计算频率响应
w = np.linspace(0, np.pi, 1000)
H = np.zeros(1000, dtype=np.complex)
for i in range(1000):
for j in range(N):
H[i] += h[j] * np.exp(-1j * w[i] * j)
# 绘制幅频响应特性曲线
plt.plot(w, np.abs(H))
plt.title('Magnitude Frequency Response')
plt.xlabel('w')
plt.ylabel('|H(e^jw)|')
plt.show()
# 绘制20log10|H(e^jw)|
plt.plot(w, 20 * np.log10(np.abs(H)))
plt.title('Magnitude Frequency Response (dB)')
plt.xlabel('w')
plt.ylabel('20log10|H(e^jw)|')
plt.show()
# 打印滤波器的最小长度
print('Minimum Filter Length: ', N)
```
在这个程序中,我们首先计算了滤波器的阶数和截止频率,然后使用Hamming窗口函数计算了滤波器的单位脉冲响应,并绘制了它的图形。接着,我们使用单位脉冲响应计算了滤波器的频率响应,绘制了幅频响应特性曲线和20log10|H(e^jw)|,并在屏幕上打印出了滤波器的最小长度。
如果您运行上述代码,您应该能够看到滤波器的单位脉冲响应图形、幅频响应特性曲线、20log10|H(e^jw)|图形和最小长度的输出。
阅读全文