资源描述
实验四 用窗函数设计FIR滤波器
———————————————————————————————— 作者:
———————————————————————————————— 日期:
17
个人收集整理 勿做商业用途
实验四 用窗函数设计FIR滤波器
姓 名:
刘竟伦
班 级:
11电子A
学 号:
1115105037
日 期
2014 年 3月25日
指导老师
戴在平
华侨大学信息科学与工程学院电子工程系
一、实验目的
1.熟悉FIR滤波器设计的基本方法。
2.掌握用窗函数设计FIR数字滤波器的原理及方法,熟悉相应的计算机高级语言编程。
3。熟悉线性相位FIR滤波器的幅频特性和相位特性.
4.了解各种不同窗函数对滤波器性能的响应。
二、实验原理与方法
(一)FIR滤波器的设计
目前FIR滤波器的设计方法主要有三种:窗函数法、频率取样法和切比雪夫等波纹逼近的最优化设计方法.常用的是窗函数法和切比雪夫等波纹逼近的最优化设计方法.本实验中的窗函数法比较简单,可应用现成的窗函数公式,在技术指标要求不高的时候是比较灵活方便的。它是从时域出发,用一个窗函数截取理想的得到h(n),以有限长序列h(n)近似理想的;如果从频域出发,用理想的在单位圆上等角度取样得到H(k),根据h(k)得到H(z)将逼近理想的,这就是频率取样法。
(二)窗函数设计法
同其它的数字滤波器的设计方法一样,用窗函数设计滤波器也是首先要对滤波器提出性能指标。一般是给定一个理想的频率响应,使所设计的FIR滤波器的频率响应去逼近所要求的理想的滤波器的相应。窗函数法设计的任务在于寻找一个可实现(有限长单位脉冲响应)的传递函数。
去逼近.我们知道,一个理想的频率响应的傅理叶变换
所得到的理想单位脉冲响应往往是一个无限长序列。对经过适当的加权、截断处理才得到一个所需要的有限长脉冲响应序列.对应不同的加权、截断,就有不同的窗函数.所要寻找的滤波器脉冲响应就等于理想脉冲响应和窗函数的乘积.即,由此可见,窗函数的性质就决定了滤波器的品质.
以下是几种常用的窗函数:
1.矩形窗:
2.Hanning窗:
3.Hamming窗:
4。Blackman窗:
5.Kaiser窗:
窗函数法设计线性相位FIR滤波器可以按如下步骤进行:
1.确定数字滤波器的性能要求。确定各临界频率{}和滤波器单位脉冲响应长度N。
2.根据性能要求和N值,合理地选择单位脉冲响应h(n)有奇偶对称性,从而确定理想频率响应的幅频特性和相位特性。
3.用傅里叶反变换公式,求得理想单位脉冲响应。
4.选择适当的窗函数W(n)根据式求得所设计的FIR滤波器单位脉冲响应。
5.用傅理叶变换求得其频率响应,分析它的幅频特性,若不满足要求,可适当改变窗函数形式或长度N,重复上述过程,直至得到满意的结果。
三、实验内容及步骤
1. 实验原理与方法
如果所希望的滤波器的理想频率响应函数为Hd(e jω), 则其对应的单位脉冲响应为 (10。6。1)
用窗函数w(n)将hd(n)截断, 并进行加权处理, 得到:
(10。6。2)
h(n)就作为实际设计的FIR数字滤波器的单位脉
冲响应序列, 其频率响应函数H(e jω)为
(10。6。3)
如果要求线性相位特性, 则h(n)还必须满足:
根据上式中的正、 负号和长度N的奇偶性又将线性相位FIR滤波器分成四类。 要根据所设计的滤波特性正确选择其中一类。 例如, 要设计线性相位低通特性, 可选择h(n)=h(N—1—n)一类, 而不能选h(n)=—h(N-1—n)一类.
3. 实验内容及步骤
(1) 复习用窗函数法设计FIR数字滤波器一节内容, 阅读本实验原理, 掌握设计步骤。
(2) 编写程序.
① 编写能产生矩型窗、 升余弦窗、 改进升余弦窗和二阶升余弦窗的窗函数子程序。
② 编写主程序. 主程序框图如图 10。6。1 所示, 仅供参考。 其中幅度特性要求用dB表示。
图10.6。1 用窗函数法设计滤波器主程序框图
设:
实验内容:
4、实验程序运行结果:
运行程序,根据实验内容要求和程序提示选择你要进行的实验参数.三个实验参数选定后,程序运行输出用所选窗函数设计的实际FIR低通数字滤波器的单位脉冲响应h(n)、幅频衰减特性(20lg|H(ejw)|)、相频特性及幅频特性|H(ejw)|的波形,h(n)和|H(ejw)|图中标出了所选窗函数类型及其长度N值。对四种窗函数(N=15和N=33)的程序运行结果如图4-2到图4-9所示,由图可以看出用各种窗函数设计的FIR滤波器的阻带最小衰减及过渡带均与教材中一致。在通带内均为严格相位特性。
首先我们选择N=15,截止频率选择pi ,选择矩形窗。
接下来我们尝试着把N改为30,截止频率改为2。5,选用Hanning窗:
N=15时的汉宁窗
N=15时的blackman窗
四、思考题
(1) 如果给定通带截止频率和阻带截止频率以及阻带最小衰减, 如何用窗函数法设计线性相位低通滤波器? 写出设计步骤。
答:将模拟频率转换成数字频率,确定理想滤波器 的特性;由 求出 ;选择适当的窗函数,并根据线性相位条件确定窗函数的长度N;在MATLAB中,可由w=boxcar(N)(矩形窗)、w=hanning(N)(汉宁窗)、w=hamming(N)(汉明窗)、w=Blackman(N)(布莱克曼窗)、w=Kaiser(N,beta)(凯塞窗)等函数来实现窗函数设计法中所需的窗函数。由h(n)= (n)。w(n), 0≤n≤ N-1,得出单位脉冲响应h(n).
① 首先确定模拟带通滤波器的技术指标。
② 确定归一化低通技术要求
③ 设计归一化低通
④ 将低通转化为带通
(2) 如果要求用窗函数法设计带通滤波器, 且给定上、 下边带截止频率为ω1和ω2,试求理想带通的单位脉冲响应hd(n).
答:我们可以利用实验中的ideal函数来产生所需的单位脉冲响应h(n). function hd=ideal(w,N);alpha=(N-1)/2;n=[0:(N-1)];m=n—alpha+eps;hd=sin(w*m)./(pi*m);
五、附录:
1、实验子程序(ideal)
function hd=ideal(w,N);
alpha=(N-1)/2;
n=[0:(N—1)];
m=n—alpha+eps;
hd=sin(w*m)。/(pi*m);
2、matlab源程序:
b=1;
close all;
i=0;
while(b);
temp=menu(’选择窗函数长度N’,'N=10',’N=15','N=20','N=25’,'N=30','N=33’,’N=35’,'N=40','N=45’,'N=50’,'N=55’,'N=60','N=64');
menu1=[10,15,20,25,30,33,35,40,45,50,55,60,64];
N=menu1(temp);
temp=menu('选择逼近理想低通滤波器截止频率Wc’,’Wc=pi/4',’Wc=pi/2',’Wc=3*pi/4',’Wc=pi',’Wc=0。5’,’Wc=1。0','Wc=1.5’,'Wc=2.0’,'Wc=2。5’,’Wc=3。0’);
menu2=[pi/4,pi/2,3*pi/4,pi,0.5,1,1。5,2,2.5,3];
w=menu2(temp);
n=[0:(N—1)];
hd=ideal(w,N); %得到理想低通滤波器
k=menu(’请选择窗口类型:’,’boxcar’,’hamming’,'hanning’,’blackman');
if k==1
B=boxcar(N);
string=[’Boxcar’,’N=',num2str(N)];
else if k==2
B=hamming(N);
string=[’Hamming’,'N=',num2str(N)];
else if k==3
B=hanning(N);
string=[’Hanning’,’N=',num2str(N)];
else if k==4
B=blackman(N);
string=['Blackman’,’N=',num2str(N)];
end
end
end
end
h=hd.*(B)’; %得到FIR数字滤波器
[H,m]=freqz(h,[1],1024,’whole’); %求其频率响应
mag=abs(H); %得到幅值
db=20*log10((mag+eps)/max(mag));
pha=angle(H); %得到相位
i=i+1;
figure(i)
subplot(2,2,1);
n=0:N-1;
stem(n,h,'.’);
axis([0,N-1,-0.1,0。3]);
hold on;
n=0:N—1;
x=zeros(N);
plot(n,x,'—’);
xlabel(’n');
ylabel(’h(n)');
title(’实际低通滤波器的h(n)’);
text((0.3*N),0.27,string);
hold off;
subplot(2,2,2);
plot(m/pi,db);
axis([0,1,-100,0]);
xlabel(’w/pi’);
ylabel(’dB');
title(’衰减特性(dB)’);
grid;
subplot(2,2,3);
plot(m,pha);
hold on;
n=0:7;
x=zeros(8);
plot(n,x,’-');
title('相频特性’);
xlabel('频率(rad)');
ylabel('相位(rad)’);
axis([0,3.15,—4,4]);
subplot(2,2,4);
plot(m,mag);
title('频率特性’);
xlabel('频率W(rad)’);
ylabel(’幅值’);
axis([0,3。15,0,1。5]);
text(0.9,1。2,string);
b=menu(’Do You want To Continue ?’,’Yes’,’No');
if b==2
b=0;
end
end
temp=menu(’Close All Figure ?’,'Yes’,’No');
if temp==1
close all
end
展开阅读全文