实验五FIR滤波器的matlab实现
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
实验五FIR滤波器的matlab实现
一、实验目的和任务
1.理解并掌握FIR数字滤波器的机理,了解各种窗函数对滤波特性的影响;
2. 掌握用MATLAB构建FIR滤波器的方法,设计FIR低通滤波器;
3. 观察FIR滤波器的频域特性。
二、实验原理
滤波器的种类很多,从功能上可以分为低通、高通、带通和带阻滤波器,上述每种滤波器又可以分为模拟滤波器和数字滤波器。如果滤波器的输入输出都是数字信号,则这样的滤波器称之为数字滤波器,它通常通过一定的运算关系改变输入信号所含频率成分的相对比例或者滤除某些频率成分来实现滤波。根据数字滤波器冲激响应的时域特性,可将数字滤波器分为两种,即无限长冲激响应(IIR)滤波器和有限长冲激响应(FIR)滤波器[3]。有数字信号处理的一般理论可知,IIR滤波器的特征是具有无限持续时间的冲激响应,而FIR滤波器使冲激响应只能持续一定的时间。
三、FIR滤波器的窗函数设计法
FIR滤波器的设计方法有许多种,如窗函数设计法、频率采样设计法和最优化设计法等。窗函数设计法的基本原理是用一定宽度窗函数截取无限脉冲响应序列获得有限长的脉冲响应序列,主要设计步骤为:
(1) 通过傅里叶逆变换获得理想滤波器的单位脉冲响应hd(n)。
(2) 由性能指标确定窗函数W(n)和窗口长度N。
(3) 求得实际滤波器的单位脉冲响应h(n),h(n)即为所设计FIR滤波器系数向量b(n)。
(4) 检验滤波器性能。
设计FIR低通、带通滤波器,并改变参数要求,观察输出结果。
参考实例一及解析(窗口函数法):
N=21; wc=pi/4; %理想低通滤波器参数
r=(N-1)/2;n=0:N-1;
hdn= sin(wc*(n-r))/pi/(n-r); %计算理想低通单位脉冲响应hd(n)
if rem(N,2)~=0; hdn(r+1)=wc/pi;
end % N为奇数时,处理n=r点的0/0型
wn1=boxcar(N); % 矩形窗
hn1=hdn.*wn1'; % 加窗
% 以上两条语句可代以fir函数:hn1=fir1(N-1,wc/pi,boxcar(N));
wn2=boxcar(N); % 矩形窗
hn2=hdn.*wn2'; % 加窗
% 以上两条语句可代以fir函数:
% hn2=fir1(N-1,wc/pi,hamming(N)); k=3;
% k=1; %绘图函数p751f的位置参数
hnwplot(hn1,k); title('矩形窗设计的h(n)');
%hamming 窗
wn2=hamming (N);
hn2=hdn.*wn2';
k=3;
hnwplot(hn2,k); title ('hamming设计的h(n)');
注意:可能会由于实验室没安装hnwplot工具函数而运行不好。
参考实例二(Buttord函数法)
低通滤波器
fc=500;
fs=2000;
fst=550;
Rc=1;
Rst=50;
Wc=fc/(fs/2);
Wst=fst/(fs/2);
[N,Wn]=Buttord(Wc,Wst,Rc,Rst);
[B,A]=Butter(N,Wn);
[H,w]=freqz(B,A,N);
plot(w*fs/(2*pi),abs(H))
grid
01002003004005006007008009001000
00.2
0.4
0.6
0.8
1
1.2
1.4
参考实例三(窗函数)
% (1)
%FIR filter design
clc;clear all; close all
wp=0.2*pi;
ws=0.3*pi;
wdelta=ws-wp;
N=ceil(8*pi/wdelta);
Wn=(0.2+0.3)*pi/2;
b=fir1(N,Wn/pi,hanning(N+1));
figure
freqz(b,1,512)
b=fir1(N,Wn/pi,hamming(N+1));
figure
freqz(b,1,512)
b=fir1(N,Wn/pi,blackman(N+1));
figure
freqz(b,1,512)
b=fir1(N,Wn/pi,triang(N+1));
figure
freqz(b,1,512)
b=fir1(N,Wn/pi,boxcar(N+1));
figure
freqz(b,1,512)
参考实例五
带通滤波器
fc1=180;
fc2=280;
fst1=140;
fst2=320;
rc=0.5;
rst=40;
wc=[fc1,fc2]/(fs/2);
wst=[fst1,fst2]/(fs/2);
[N,Wn]=Buttord(wc,wst,rc,rst);
[B,A]=Butter(N,Wn);
[H,W]=freqz(B,A);
plot(W*fs/(2*pi),abs(H))
grid
[H,W]=freqz(B,A);
plot(W*fs/(2*pi),abs(H))
grid
05101520253035404550
00.2
0.4
0.6
0.8
1
1.2
1.4