调用remezord和remez设计FIR高通滤波器,要求:采样频率为16kHz,通带截止频率为5.5kHz,通带衰减为1dB,过渡带小于3.5kz,阻带衰减为75dB,分别画出各h(n),幅频特性、相频特性及衰减特性。
时间: 2023-12-29 08:03:54 浏览: 31
首先,我们需要确定滤波器的阶数。根据给定的通带截止频率和通带衰减,我们可以使用巴特沃斯滤波器公式来估计阶数:
$$
N \approx \frac{\log(\frac{10^{0.1A_p}-1}{10^{0.1A_s}-1})}{2\log(\frac{\omega_p}{\omega_s})}
$$
其中 $A_p$ 和 $A_s$ 分别是通带衰减和阻带衰减(单位为 dB),$\omega_p$ 和 $\omega_s$ 分别是通带截止频率和阻带截止频率(单位为 弧度/秒)。在这里,我们有 $A_p = 1$ dB,$A_s = 75$ dB,$\omega_p = 2\pi\times 5.5\text{kHz}$,$\omega_s = 2\pi\times 3.5\text{kHz}$。代入公式得到:
$$
N \approx \frac{\log(\frac{10^{0.1}-1}{10^{-7.5}-1})}{2\log(\frac{2\pi\times 5.5\text{kHz}}{2\pi\times 3.5\text{kHz}})} \approx 6
$$
因此,我们需要一个6阶的高通滤波器。
接下来,我们使用 `remezord` 函数来计算一个最小阶数的滤波器系数:
```python
import numpy as np
import matplotlib.pyplot as plt
from scipy.signal import freqz, remez, remezord
# 采样频率
fs = 16000
# 通带截止频率
fp = 5500
# 通带衰减
ap = 1
# 阻带截止频率
fs1 = 3500
# 阻带衰减
as1 = 75
# 计算最小阶数
N, Wn = remezord([fp, fs1], [1, 0], [ap, as1], fs=fs)
# 使用 Remez 算法设计滤波器
b = remez(N, Wn, [1, 0], Hz=fs)
```
接下来,我们可以使用 `freqz` 函数来绘制滤波器的幅频特性、相频特性和衰减特性:
```python
# 计算频率响应
w, h = freqz(b, [1], worN=1024)
# 绘制幅频特性
plt.figure()
plt.plot(w / np.pi * fs / 2, 20 * np.log10(np.abs(h)))
plt.title('Amplitude Response')
plt.xlabel('Frequency (Hz)')
plt.ylabel('Amplitude (dB)')
plt.grid()
# 绘制相频特性
plt.figure()
plt.plot(w / np.pi * fs / 2, np.unwrap(np.angle(h)))
plt.title('Phase Response')
plt.xlabel('Frequency (Hz)')
plt.ylabel('Phase (rad)')
plt.grid()
# 绘制衰减特性
plt.figure()
plt.plot(w / np.pi * fs / 2, -20 * np.log10(np.abs(h)))
plt.title('Attenuation Response')
plt.xlabel('Frequency (Hz)')
plt.ylabel('Attenuation (dB)')
plt.ylim([0, 100])
plt.grid()
plt.show()
```
这将生成三个图像,分别是滤波器的幅频特性、相频特性和衰减特性。