编写python程序,窗函数法设计一个FIR数字滤波器,数字滤波器的技术指标如下:通带边界频率为0.4pi rad,阻带截止频率为0.6pi rad,通带内允许的最大衰减为0.5dB,阻带内允许的最小衰减为50dB
时间: 2023-08-30 09:05:50 浏览: 82
以下是使用窗函数法设计FIR数字滤波器的Python代码:
```python
import numpy as np
import matplotlib.pyplot as plt
# 指定滤波器的技术指标
wp = 0.4 * np.pi # 通带边界频率
ws = 0.6 * np.pi # 阻带截止频率
Rp = 0.5 # 通带内允许的最大衰减(单位:dB)
As = 50 # 阻带内允许的最小衰减(单位:dB)
# 计算滤波器的参数
delta_p = (10**(Rp/20) - 1) / (10**(Rp/20) + 1)
delta_s = 10**(-As/20)
A = -20 * np.log10(delta_p * delta_s)
N = np.ceil((A - 8) / (4.57 * (ws-wp)/np.pi)) # 计算滤波器的阶数
M = N // 2
# 构造理想的低通滤波器
hd = np.zeros(int(N)+1)
for n in range(int(N)+1):
if n == M:
hd[n] = wp / np.pi
else:
hd[n] = np.sin(wp*(n-M)) / (np.pi*(n-M))
# 应用窗函数(这里采用汉宁窗)
w = np.hanning(int(N)+1)
h = hd * w
# 绘制滤波器的幅度响应
w, H = signal.freqz(h)
fig, ax = plt.subplots()
ax.plot(w/np.pi, 20*np.log10(np.abs(H)))
ax.set_xlabel('Normalized frequency (x pi rad/sample)')
ax.set_ylabel('Magnitude (dB)')
ax.set_ylim(-60, 5)
ax.set_title('Frequency response of FIR filter')
ax.axvline(wp/np.pi, color='green', linestyle='--')
ax.axvline(ws/np.pi, color='red', linestyle='--')
ax.axhline(-Rp, color='green', linestyle='--')
ax.axhline(-As, color='red', linestyle='--')
ax.grid(True)
plt.show()
```
在上面的代码中,我们首先指定了数字滤波器的技术指标,即通带边界频率wp、阻带截止频率ws、通带内允许的最大衰减Rp和阻带内允许的最小衰减As。然后,我们根据这些指标计算出滤波器的阶数N和窗函数的长度M。接着,我们构造了一个理想的低通滤波器,并应用了汉宁窗函数。最后,我们绘制了滤波器的幅度响应,并在图中标出了通带边界频率、阻带截止频率、通带内允许的最大衰减和阻带内允许的最小衰减。