利用窗函数法设计线性相位FIR滤波器.docx
- 文档编号:11772988
- 上传时间:2023-04-01
- 格式:DOCX
- 页数:16
- 大小:70.44KB
利用窗函数法设计线性相位FIR滤波器.docx
《利用窗函数法设计线性相位FIR滤波器.docx》由会员分享,可在线阅读,更多相关《利用窗函数法设计线性相位FIR滤波器.docx(16页珍藏版)》请在冰豆网上搜索。
利用窗函数法设计线性相位FIR滤波器
西安工程大学
课程设计说明书
题目:
利用窗函数法设计线性相位FIR滤波器
学院(系):
计算机科学学院
年级专业:
电子信息科学与技术01班
学号:
******
学生姓名:
***
日期:
2013\12\31-2014\01\03
论文摘要
数字信号处理学科的一项重大进展是关于数字滤波器设计方法的研究。
而FIR数字滤波器可以方便地实现线性相位且其群时延不随频率变化的,在任何幅度特性下都能稳定的工作,因此在数字信号处理中占有非常重要的地位。
在现代电子系统中,FIR数字滤波器以其良好的线性特性被广泛使用。
FIR数字滤波器传统的设计方法有窗函数法、频率抽样法和等波纹逼近法。
用窗函数设计FIR数字滤波器就是用有限长的脉冲相应逼近序列,其基本设计思想为:
首先选定一个理想的选频滤波器,然后截取它的脉冲响应得到线性相位。
本文是以窗函数设计方法为基础的。
首先介绍了满足线性相位条件的FIR数字滤波器的基础知识,简述了FIR数字滤波器的设计方法与流程。
本课题主要应用MATLAB软件利用窗函数法设计满足线性相位的FIR数字滤波器,并对所设计的滤波器进行仿真,得到滤波器的单位脉冲响应、频率响应特性。
关键字:
数字滤波器; C语言。
窗口函数设计FIR滤波器论文
、窗函数法的基本思想
窗函数设计的基本思想是要选取某一种合适的理想频率选择性滤波器,然后将它的脉冲响应截断以得到一个线性相位和因果的FIR滤波器。
因此这种方法的重点在于选择某种合适的窗函数和一种理想滤波器。
对于给定的滤波器技术指标,选择滤波器长度和具有最窄主瓣宽度和尽可能小的旁瓣衰减的某个窗函数。
任何数字滤波器的频率响应
都是ω的周期函数,它的傅立叶级数展开式为:
(1-1)
式中,
其中的
为滤波器的归一化的截止频率。
傅立叶系数ha(n)实际上就是理想数字滤波器的冲激响应。
获得有限冲激响应数字滤波器的一种可能方法就是把无穷级数截取为有限项级数来近似,而吉布斯(Gibbs)现象使得直接截取法不甚令人满意。
窗函数法就是用被称为窗函数的有限加权系列{ω(n)}来修正式(1-2)的傅立叶级数,以求得要求的有限冲激响应序列h(n),即有:
(1-2)
是有限长序列,当n>N-1及n<0时,
。
、窗函数的选择
工程中比较常用的窗函数有:
矩形窗函数、三角形((Bartlett)窗函数、汉宁(Harming)窗函数、汉明(Hamming)窗函数、布莱克曼(Blackman)窗函数和凯塞(Kaiser)窗函数。
这几种窗函数的比较见下表所示:
窗函数
旁瓣峰值幅度/dB
过渡带宽
阻带最小衰减/dB
矩形窗
-13
4π/N
-12
三角窗
-25
8π/N
-25
汉宁窗
-31
8π/N
-44
海明窗
-41
8π/N
-53
布莱克曼窗
-57
12π/N
-74
凯塞窗
-57
10π/N
-80
六种窗函数的基本参数
几种常用窗函数对比,窗函数的选择原则是:
①具有较低的旁瓣幅度,尤其是第一旁瓣幅度;
②旁瓣幅度下降速度要大,以利增加阻带衰减;
③主瓣的宽度要窄,以获得较陡的过渡带。
通常上述三点很难同时满足。
当选用主瓣宽度较窄时,虽然得到较陡的过渡带,但通带和阻带的波动明显增加:
当选用最小的旁瓣幅度时,虽能得到匀滑的幅度响应和较小的阻带波动,但过渡带加宽。
因此,实际选用的窗函数往往是它们的折衷。
在保证主瓣宽度达到一定要求的条件下,适当牺牲主瓣宽度来换取旁瓣波动的减少。
就几种窗函数的比较在本课题中我们采用了汉明窗。
1、矩形窗
2、汉宁窗
3、三角窗
4、海明窗
5、布拉克曼窗
6、凯塞窗
其中是I。
(β)第一类零阶修正贝塞耳函数。
口是控制窗函数形状的参数,β越大,w(n)窗越窄,频谱的旁瓣越小,但主瓣也相应加宽。
口的典型值为4≤p≤9。
P=0时,凯塞窗变为矩形窗;β=5.44时,凯塞窗与海明窗接近;p=8.5时,凯塞窗与布拉克曼窗接近。
、FIR滤波器的设计方法
1.选择窗函数的类型和长度
(1).根据阻带最小衰减选择窗函数的类型原则是:
在保证阻带衰减满足要求的情况下,尽量选择主瓣窄的窗函数。
(2).根据过渡带的宽度选择窗函数的长度
2.按性能指标要求,构造希望频率响应函数(1-12)
近似为过渡带中心频率,幅度函数衰减一半(-6dB)
(1-13)
(1).确定期望滤波器的单位脉冲响应
(1-14)
(2).加窗得到设计结果
(1-15)
、利用窗函数设计C语言实现:
1子函数语句
voldfirwin(n,band,fln,fhn,wn,h)
2.形参说明
n—整型变量。
滤波器的阶数。
band—整型变量。
滤波器的类型。
取值为1、2、3和4,分别对应低通、高通、带通和带阻滤波器。
fln——双精度实型变量。
fhn——双精度实型变量。
对于低通和高通滤渡器,fln:
通带边界频率对于带通和带阻滤渡器,fln:
通带下边界频率,fhn:
通带上边界频率
wn一整型变量。
窗函数的类型;取值l到7,分别对应矩形窗,图基窗,三角窗,汉宁窗,海明窗,布拉克曼窗和凯塞窗。
h——双精度实型一维数组,长度为(n+1)。
存放FIR滤波器的系数。
函数firwin()调用以下函数:
子函数window(),窗函数的计算。
子函数Kalser(),凯塞窗的计算。
子函数bessel0(),贝塞耳函数的计算。
子函数程序
#include"math.h"
#include"stdio.h"
/*n:
滤波器的阶数,n是奇数时可用来设计各种滤波器
band:
滤波器类型1、2、3、4分别对应低通,高通,带通,带阻
fln:
通带下边界频率
fhn:
通带上边界频率
wn:
窗函数的类型1-7分别对应
h:
长度为n+1,存放滤波器的系数
fs:
采样频率*/
voidfirwin(n,band,fln,fhn,wn,h)
intn,band,wn;
doublefln,fhn,h[];
{
inti,n2,mid;
doubles,pi,wc1,wc2,beta,delay,fs;
doublewindow();//窗函数的计算
beta=0.0;
if(wn==7)//只有凯塞窗需要输入系数beta
{printf("inputbetaparameterofKaiserwindow(2 scanf("%1f",&beta); } pi=4.0*atan(1.0);//pi=PI; if((n%2)==0)/*如果阶数n是偶数*/ {n2=n/2+1;/**/ mid=1;// } else {n2=n/2;//n是奇数,则窗口长度为偶数 mid=0;// } delay=n/2.0; wc1=2.0*pi*fln;// if(band>=3)/*先判断用户输入的数据,如果band参数大于3*/ {wc2=2.0*pi*fhn;} switch(band) { case1: {for(i=0;i<=n2;i++) {s=i-delay;// h[i]=(sin(wc1*s/fs)/(pi*s))*window(wn,n+1,i,beta);//低通,窗口长度=阶数+1,故为n+1 h[n-i]=h[i]; } if(mid==1)h[n/2]=wc1/pi;//n为偶数时,修正中间值系数 break; } case2: {for(i=0;i<=n2;i++) {s=i-delay; h[i]=(sin(pi*s)-sin(wc1*s/fs))/(pi*s);//高通-//对 h[i]=h[i]*window(wn,n+1,i,beta); h[n-i]=h[i]; } if(mid==1)h[n/2]=1.0-wc1/pi;//对 break; } case3: {for(i=0;i {s=i-delay; h[i]=(sin(wc2*s/fs)-sin(wc1*s/fs))/(pi*s);//带通-//对 h[i]=h[i]*window(wn,n+1,i,beta); h[n-i]=h[i]; } if(mid==1)h[n/2]=(wc2-wc1)/pi;//对 break; } case4: {for(i=0;i<=n2;i++) {s=i-delay; h[i]=(sin(wc1*s/fs)+sin(pi*s)-sin(wc2*s/fs))/(pi*s);//带阻-//对 h[i]=h[i]*window(wn,n+1,i,beta); h[n-i]=h[i]; } if(mid==1)h[n/2]=(wc1+pi-wc2)/pi; break; } } } /*返回窗函数的表达式 n: 窗口长度 type: 选择窗函数的类型 beta: 生成凯塞窗的系数*/ staticdoublewindow(type,n,i,beta) inti,n,type; doublebeta; { intk; doublepi,w; doublekaiser(); pi=4.0*atan(1.0);//pi=PI; w=1.0; switch(type) { case1: {w=1.0;//矩形窗 break; } case2: {k=(n-2)/10; if(i<=k) w=0.5*(1.0-cos(i*pi/(k+1)));//图基窗 break; } case3: {w=1.0-fabs(1.0-2*i/(n-1.0));//三角窗 break; } case4: {w=0.5*(1.0-cos(2*i*pi/(n-1)));//汉宁窗 break; } case5: {w=0.54-0.46*cos(2*i*pi/(n-1));//海明窗 break; } case6: {w=0.42-0.5*cos(2*i*pi/(n-1))+0.08*cos(4*i*pi/(n-1));//布莱克曼窗 break; } case7: {w=kaiser(i,n,beta);//凯塞窗 break; } } return(w); } staticdoublekaiser(i,n,beta)//因凯塞窗的表达式复杂,调用贝塞尔窗表达式 inti,n; doublebeta; { doublea,w,a2,b1,b2,beta1; doublebessel0(); b1=bessel0(beta); a=2.0*i/(double)(n-1)-1.0; a2=a*a; beta1=beta*sqrt(1.0-a2); b2=bessel0(beta1); w=b2/b1; return(w); } staticdoublebessel0(x) doublex; { inti; doubled,y,d2,sum; y=x/2.0; d=1.0; sum=1.0; for(i=1;i<=25;i++) {d=d*y/i; d2=d*d; sum=sum+d2; if(d2 } return(sum); } 主函数: 下面给出主函数程序,它调用firwin.c子函数。 通过人机对话,它可以设计低通、高通、带通和带阻这四种形式的滤波器。 r面对输入参数进行说明: band;滤波器的类型;n: 滤波器的阶数;fs: 采样频率;对于低通和高通滤波器,f1: 通带边界频率;对于带通和带阻滤波器,f1;通带下边界频率,fh: 通带上边界频率;wn: 窗函数的类型;fname: 幅频响应文件名。 主函数要调用计算滤波器频率响应的函数gain()。 主函数程序(文件名firwin.m); #include”stdio.h” #include”firwin.C” #include”gain.c” main() {inti,j,fl,n2,band,wn; doublef1.fh,fs,freq; doubleh[100],e[100],x[300],y[300]; charfname[40]} FLLE*fp; c[1]一0.0; printf(”selectOneofthefourtypesforFIRdigitalfilter\n”); printf(“1--lowpass;2--highpassnn”); printf(“3--bandpass;4--bandstop\n); scanf(”%d”,&band); printf(”inputthefilterordern\n”); scanf(”%d”,&n); printf(”inputlowcutofffrequrncyfl\n”)l scanf(”%If”,&fl); fh=0.0; if(band>=3) {printf(”inputhighcutofffrequencyfh\n”){ scanf(”%If”,&fh); } printf(”inputsamplefrequencefs\n”): scanf(”%If”,&fs); printf(”selectwindow\n”); printf(“1--rectangular;2--taperedrectangular\n”) printf(“3--triangular;4—Hanning\n”)I printf(“5--Hamming);6—Blaekman\n”); printf(“7--Kaiser\n”)l scanf(”%d”,&wn); fl=fl/fs; fh=fh/fs; firwin(n,band,fl,fh,wn,h); printf(”FIRdigitalfilter\n”); printf(’***fimpulseresponse****\n\n”); n2=n/2; for(i=0;i<=n2;i++) {j=n-i; printf(”h(%2d)一%12.8lf=h(%2d)\n”,i,h[i],j); } printf(“\ninputfilensmeoffrequencyresponse\n”); scanf(”%s,fname); if((fp—fopen(fname,”w”))==NULL) {printf(”cannotopenthisfile\n”); exit (1); } gain(h,c,n,1,x,y,300,2); for(i=0;i<300;i++) {freq=0.5*i/299; fprintf(fp,”%lf%1f\n”,freq,x[i]); } fclose(fp); } 设计一个30阶的FIR高通数字滤波器,其通带边界频率为0.3。 选择参数n= 30,hand=2,fl=0.3,fs=1,wn=4,采用海明窗函数。 运行结果: h(0)=0.00000000=h(30) h (1)=-0.00023626=h(29) h (2)=0.00062213=h(28) h(3)=0.00148885=h(27) h(4)=-0.00455292=h(26) h(5)=-0.00000000=h(25) h(6)=0.01162121=h(24) h(7)=-0.01047130=h(23) h(8)=-0.01476106=h(22) h(9)=0.03302330=h(21) h(10)=0.00000000=h(20) h(11)=-0.06316213=h(19) h(12)=0.05641053=h(18) h(13)=0.08950506=h(17) h(14)=-0.29942300=h(16) h(15)=0.40000000=h(15) 滤波器幅度响应如图: 总结与体会 设计带通滤波器时首先要计算出过渡带,然后查表得到不同窗函数所需要的阶数,不同的窗函数所设计的滤波器的形状各有差异,尤其在主瓣宽度、旁瓣的形状以及主瓣与旁瓣的高度差上有比较明显得差别,实际应用中应根据实际情况,折衷处理,兼顾各项指标。 为了这次课程设计,自己自学了数字信号处理领域中窗函数的有关知识。 在信号处理中,对离散序列的数据截断是通过序列与窗函数相乘来实现的。 而且,有关滤波器的设计、功率谱估计等基本概念也要用到窗函数。 本次课程设计对经常用到的下面8个窗函数: 矩形窗函数、三角窗函数、巴特利特窗函数、汉明窗函数、海明窗函函数、布莱克曼窗函数、凯塞窗函数以及切比雪夫窗函数,先是做了基本概念上的阐释,然后对其MATLAB实现函数做出了说明,最后又结合具体的实例,对这些窗函数的频域特性等进行了介绍。 通过这次学习,我不但掌握了FIR数字滤波器窗函数的基本知识及其实际应用的技巧了,还提高了自己的编程和写报告的能力,收获颇多。
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 利用 函数 设计 线性 相位 FIR 滤波器