用matlab设计一个低通滤波器FIR,要求采样频率是20kHZ,通带截止频率为4khz,过渡带2kHZ,通带纹波系数小于3dB,阻带衰减大于40dB,求得滤波器系数并绘制频谱图
时间: 2023-07-30 15:05:03 浏览: 204
在MATLAB中设计一个低通滤波器FIR,可以使用fir1函数。首先需要计算出滤波器的阶数,这可以通过以下公式来计算:
$$ N = \frac{3.3}{2.285 \times 2\pi(\Delta f/f_s)} + 1 $$
其中,$\Delta f$ 是过渡带宽度,$f_s$ 是采样频率。根据题目中的要求,$\Delta f=2\text{kHz}$,$f_s=20\text{kHz}$,代入公式中得到:
$$ N = \frac{3.3}{2.285 \times 2\pi(2\text{kHz}/20\text{kHz})} + 1 \approx 58 $$
因为N必须为偶数,所以我们将其向上取整到60。接下来,可以使用fir1函数来计算滤波器系数:
```matlab
N = 60;
Wn = 4e3/(20e3/2);
b = fir1(N, Wn, 'low', kaiser(N+1, 3));
```
其中,N是滤波器的阶数,Wn是归一化的通带截止频率,'low'表示低通滤波器,kaiser(N+1, 3)是窗函数,3是窗函数的beta值,代表纹波系数。这里我们选取了3dB的纹波系数。
最后,我们可以利用freqz函数来绘制滤波器的频谱图:
```matlab
freqz(b, 1, 1024, 20e3);
```
其中,b是滤波器的系数,1表示滤波器是FIR滤波器,1024是频率响应的采样点数,20e3是采样频率。
相关问题
用matlab设计一个低通滤波器FIR,要求采样频率是20kHZ,通带截止频率为4khz,过渡带2kHZ,通带纹波系数小于3dB,阻带衰减大于40dB
以下是一种设计低通FIR滤波器的方法,对于所给的要求,我们可以采用 Parks-McClellan 算法进行设计。具体步骤如下:
1. 通过指定通带截止频率和过渡带宽度,计算出通带和阻带边界频率。
```matlab
fs = 20000; % 采样频率
Rp = 3; % 通带最大纹波
Rs = 40; % 阻带最小衰减
wp = 2*pi*4000/fs; % 通带截止频率
ws = 2*pi*6000/fs; % 阻带截止频率
delta_p = (10^(Rp/20)-1)/(10^(Rp/20)+1); % 通带纹波系数
delta_s = 10^(-Rs/20); % 阻带衰减系数
```
2. 通过 `firpmord` 函数计算出滤波器的阶数和截止频率。
```matlab
[n,fo,ao,w] = firpmord([wp ws]/pi,[1 0],[delta_p delta_s],fs);
```
3. 调用 `firpm` 函数进行滤波器设计。
```matlab
b = firpm(n,fo,ao,w);
```
4. 绘制滤波器的幅频响应和相频响应。
```matlab
freqz(b,1,1024,fs);
```
完整代码如下:
```matlab
fs = 20000; % 采样频率
Rp = 3; % 通带最大纹波
Rs = 40; % 阻带最小衰减
wp = 2*pi*4000/fs; % 通带截止频率
ws = 2*pi*6000/fs; % 阻带截止频率
delta_p = (10^(Rp/20)-1)/(10^(Rp/20)+1); % 通带纹波系数
delta_s = 10^(-Rs/20); % 阻带衰减系数
[n,fo,ao,w] = firpmord([wp ws]/pi,[1 0],[delta_p delta_s],fs);
b = firpm(n,fo,ao,w);
freqz(b,1,1024,fs);
```
调用remezord和remez设计FIR高通滤波器,要求:采样频率为16kHz,通带截止频率为5.5kHz,通带衰减为1dB,过渡带小于3.5kz,阻带衰减为75dB,分别画出各h(n),幅频特性、相频特性及衰减特性。
首先,我们需要确定滤波器的阶数。根据给定的通带截止频率和通带衰减,我们可以使用巴特沃斯滤波器公式来估计阶数:
$$
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()
```
这将生成三个图像,分别是滤波器的幅频特性、相频特性和衰减特性。
阅读全文