2.用频率采样法设计FIR数字滤波器的基本方法有哪几种?请列写出主要的程序语句。
时间: 2024-03-03 10:48:27 浏览: 72
对于用频率采样法设计FIR数字滤波器,主要有两种基本方法:窗函数法和最优化法。
1. 窗函数法
主要程序语句如下:
```python
import numpy as np
import matplotlib.pyplot as plt
# 1. 设计数字滤波器的参数
N = 51 # 滤波器阶数
fc = 0.2 # 截止频率
b = np.zeros(N+1)
mid = N//2
for i in range(-mid, mid+1):
if i == 0:
b[i+mid] = 2*np.pi*fc
else:
b[i+mid] = np.sin(2*np.pi*fc*i) / (np.pi*i)
# 2. 生成窗函数
win = np.hamming(N+1)
# 3. 将数字滤波器系数与窗函数相乘
h = b * win
# 4. 绘制数字滤波器幅频响应
w, H = signal.freqz(h)
plt.plot(w, 20*np.log10(abs(H)))
plt.xlabel('Frequency [rad/sample]')
plt.ylabel('Amplitude [dB]')
plt.show()
```
2. 最优化法
主要程序语句如下:
```python
import numpy as np
import matplotlib.pyplot as plt
from scipy.optimize import minimize
# 1. 定义目标函数
def target_func(x, N, fc, w):
b = np.zeros(N+1)
mid = N//2
for i in range(-mid, mid+1):
if i == 0:
b[i+mid] = 2*np.pi*fc
else:
b[i+mid] = np.sin(2*np.pi*fc*i) / (np.pi*i)
H = np.abs(np.fft.fft(b, w)) ** 2
H /= np.max(H)
h = np.real(np.fft.ifft(H * x, N+1))
return np.sum((h - np.sin(np.pi*i)) ** 2 for i in np.linspace(-0.5, 0.5, 21))
# 2. 最小化目标函数
N = 51 # 滤波器阶数
fc = 0.2 # 截止频率
w = 8192 # 频率采样点数
res = minimize(target_func, np.ones(w//2+1), args=(N, fc, w))
# 3. 计算数字滤波器系数
b = np.zeros(N+1)
mid = N//2
for i in range(-mid, mid+1):
if i == 0:
b[i+mid] = 2*np.pi*fc
else:
b[i+mid] = np.sin(2*np.pi*fc*i) / (np.pi*i)
H = np.abs(np.fft.fft(b, w)) ** 2
H /= np.max(H)
h = np.real(np.fft.ifft(H * res.x, N+1))
# 4. 绘制数字滤波器幅频响应
w, H = signal.freqz(h)
plt.plot(w, 20*np.log10(abs(H)))
plt.xlabel('Frequency [rad/sample]')
plt.ylabel('Amplitude [dB]')
plt.show()
```
阅读全文