博客中的代码不出意外的话应该都是直接可以跑的,如果出了意外的话可以邮箱1902946954@qq.com
实验 5 有限冲激响应数字滤波器设计
- 实验目的:
1、加深对数字滤波器的常用指标理解。
2、学习数字滤波器的设计方法。
二、预习要求
1. 在 MATLAB 中,熟悉函数 fir1、kaiserord 、remezord、remez 的使用; B = fir1(n,Wn,'high','noscale')设计滤波器; [n,Wn,beta,ftype] = kaiserord(f,a,dev)估计滤波器阶数; [n,fo,ao,w] = remezord (f,a,dev,fs)计算等波纹滤波器阶数 n 和加权函数 w(ω); B=remez(n,f,a)进行等波纹滤波器的设计。
2. 阅读扩展练习中的实例,学习 FIR 滤波器的设计方法及其在 MATLAB 中的实现;
3. 给出 FIR 数字滤波器的冲激响应,绘出它们的幅度和相位频响曲线,讨论它们各自的实 现形式和特点。 数字滤波器有 IIR 和 FIR 两种类型,它们的特点和设计方法不同
三、实验内容
四、窗函数法设计FIR数字滤波器
4.1代码思路
我们查阅matlab帮助手册可以看到kaiserord和fir1函数的使用方法:
即kaiserord用来估计滤波器阶数,输入的参数分别为边界频率,mags(可理解为滤波器的形状,带通为“010”)和通带阻带指标。因此我们只需要将要求中的dB单位换掉,用kaiseord估计滤波器阶数等参数,再代到fir1函数中即可得到滤波器的系数b。
4.2 实验源代码
clc;clear;
fcuts = [0.3 0.45 0.65 0.75]; %边界频率
mags = [0 1 0]; %滤波器形状描述
devs = [0.01 0.1 0.01]; %通带阻带指标
[n,Wn,beta,ftype] = kaiserord(fcuts,mags,devs); %滤波器阶数估计
n = n + rem(n,2);
bandpass_window = fir1(n,Wn,ftype,kaiser(n+1,beta),'noscale'); %生成滤波器系数
figure(1);
freqz(bandpass_window);%画出频率响应
4.3 实验结果及分析
用窗函数法设计FIR带通滤波器频率响应曲线入图1所示,我们可以看到该滤波器边界频率处能达到要求,并且在工作区具有线性的相位。
图1 用窗函数法设计FIR带通滤波器频率响应曲线
我们同样可以用直接向滤波器输入频率为0.3Π,0.55Π,0.75Π的正弦波,观察是否能够滤除0.3Π和0.75Π的频率分量并且让0.55Π幅度损失在1dB以内。实现代码如下:
N=512;
n=0:N-1;
cos_test=cos((2*pi/N)*140*n)+cos((2*pi/N)*64*n)+cos((2*pi/N)*205*n);
cos_test_128=[cos_test,zeros(1,512)];
figure(2);
stem(0:length(cos_test)-1,cos_test);
test_before=fft(cos_test_128);
test_before=abs(test_before);
figure(3);
stem(0:length(cos_test_128)-1,test_before);
test_after=filter(bandpass_window,1,cos_test);
figure(4)
stem(0:length(test_after)-1,test_after);
test_after=[test_after,zeros(1,512)];
test_after=fft(test_after);
test_after=abs(test_after);
figure(5);
stem(0:length(test_after)-1,test_after);
我们可以对比滤波前后通过FFT变化得到的频谱。
图2 滤波前后频谱
我们可以清晰的看到滤波后低频和高频被滤除,而0.55Π的分量幅度从256下降至246,损失在1dB以内,也证明了该带通滤波器达到了要求的指标。
五、等波纹法设计带通滤波器
5.1代码思路
函数remezord和remez的用法和kaiserord和fir1很相近。前者输入滤波器指标,输出滤波器阶数等参数,后者通过参数设计出滤波器最后的系数。
5.2 实验源代码
clc;clear;
fcuts=[0.3 0.45 0.65 0.75];
mval=[0 1 0];%幅值
dev=[0.01 0.1 0.01];%通带和阻带波纹系数
[N,fpts,mag,wt]=remezord(fcuts,mval,dev);
b=remez(N,fpts,mag,wt);
figure(6);
freqz(b);
5.3 结果与分析
我们看到该滤波器在通带峰值起伏上能够达到指标,但在阻带衰减上不能达到。(如0.3Π时衰减仅有37dB<40db)
图3 等波纹法设计带通滤波器频率响应曲线
因此,我们需要增加滤波器的阶数来让其达到指标要求,我们查看MATLAB工作区,发现用remezord估计的阶数为N=25。我们逐渐增加N,发现在N=28时能够达到滤波器的最小阻带衰减。频率响应如下图所示
图4 修正过阶数的带通滤波器频率响应曲线