1、课程设计报告题 目 基于 MATLAB 的 FIR 滤波器的设计 学 院 信 息 工 程 学 院 专 业 电子信息工程 摘要数字滤波技术是数字信号处理的一个重要组成部分, 滤波器的设计是信号处理的核心问题之一。根据 FIR 滤波器的原理, 提出了 FIR 滤波器的窗函数设计法, 并对常用的几种窗函数进行了比较。给出了在 MATLAB 环境下, 用窗函数法设计 FIR 滤波器的过程和设计实例。仿真结果表明,设计的 FIR 滤波器的各项性能指标均达到了指定要求, 设计过程简便易行。该方法为快速、 高效地设计 FIR 滤波器提供了一个可靠而有效的途径。 FIR 数字滤波器以其良好的线性特性被广泛应用
2、于现代电子通信系统中,是数字信号处理的重要内容之一。在实际信号处理中,往往要求系统兼具实时性和灵活性,而已有的一些软件或硬件实现方案(如 DSP)则难以同时达到这两方面的要求。使用具有并行处理特性的 FPGA 来实现 FIR 滤波器,既有很强的实时性,又兼顾了灵活性,为数字信号处理提供了一种很好的解决方案。FIR 滤波器系数计算较为繁琐,在设计时借助 Matlab 工具箱,选择合适的窗函数,可以方便地计算滤波器系数,并分析其幅频、相频特性。设计目的(1)掌握用窗函数法设计 FIR 数字滤波器的原理与方法。(2)熟悉线性相位 FIR 数字滤波器的特性。(3)了解各种窗函数对滤波特性的影响。FIR
3、 滤波器的简介和原理FIR 数字滤波器的特点(与 IIR 数字滤波器比较): 优点 :(1)很容易获得严格的线性相位, 的信号 产生相位失真,这一特点在 宽频带信 号处理、阵 列信号处理、数据传输等系统中 非常重要;(2 )可得到多带幅频特性;(3 )极点全部在原点(永远稳定) ,无稳定 性问题;(4 )任何一个非因果的有限长序列,总可以通过一 定的延时,转变为因果序列, 所以因果性总是满足;(5)无反馈运算,运算误差小。缺点:(1)因为无极点,要获得好的过渡带特性,需以较高的阶数为代价;(2)无法利用模拟滤波器的设计结果,一般无解析设计公式,要借助计算机辅助设计程序完成。FIR 滤波器具有严
4、格的相位特性,返对于诧音信号处理和数据传输是很重要的前 FIR 滤波器的设计方法主要有三种:窗函数法、频率取样法和切比雪夫等波纹逼近的最优化设计方法。常用的是窗函数法和切比雪夫等波纹逼近的最优化设计法。本设计中的窗函数法比较简单,可应用现成的窗函数公式,在技术指标要丌高的时候是比较灵活方便的。 如果 FIR 滤波器的 h(n)为实数, 而且满足以下任意条件, 滤波器就具有准确的线性相位, 第一种:偶对称,h(n)=h(N-1-n), ()=-(N-1) /2 第二种:奇对称,h(n)=-h(N-1-n), ()=-(N-1) /2 +pi/2 对称中心在 n=(N-1)/2 处, 根据以上对称
5、条件,可以将 FIR 滤波器分为 4 种: h(n), evenly symmetric, odd N h(n), evenly symmetric, even N, 3 h(n), oddly symmetric, odd N, h(n), oddly symmetric, even N,典型的窗函数(1)矩形窗(Rectangle Window)()(nRwN其频率响应和幅度响应分别为:, 21)/si()(Njj eeW )2/sin()(NWR(2)三角形窗(Bartlett Window)12,10)( NnNnw其频率响应为: 2)/si(4)(jj eeW(3)汉宁(Hannin
6、g)窗,又称升余弦窗)(12cos(1)(nRNnw其频率响应和幅度响应分别为: )12()12(5.0)(5.)( )()(.)(.)( )21( NWWe ee RRRaj NjRRRj (4)海明(Hamming)窗,又称改进的升余弦窗)(cos(46.)( nNnw其幅度响应为: )12()123.0)5. NRRR (6)凯泽(Kaiser)窗0,)()1/21()020 nINnInw其中: 是一个可选参数,用来选择主瓣宽度和旁瓣衰减之间的交换关系,一般说来,越大,过渡带越宽,阻带越小衰减也越大。I 0()是第一类修正零阶贝塞尔函数。5 种窗函数性能比较窗类型 旁瓣峰值 主瓣峰值
7、最小阻带衰减矩形窗 13dB 4/M 21dB三角窗 25dB 8/M 25dB汉宁窗 31dB 8/M 44dB海明窗 41dB 8/M 53dB凯泽窗 57dB 12/M 74dB用窗函数设计 FIR 滤波器的基本方法设计思想:从时域从发,设计 逼近理想 。设理想滤波器)(nh)(nhd的单位脉冲响应为 。以低通线性相位 FIR 数字滤波器为例。)(jdeHddeHnhnhjddjj )(21)(一般是无限长的,且是非因果的,不能直接作为 FIR 滤波器的单位脉冲响应。要想得到一个因果的有限长的滤波器 h(n),最直接的方法是截断,即截取为有限长因果序列,并用合适的窗函数进行加权作为)()
8、(nwhdFIR 滤波器的单位脉冲响应。按照线性相位滤波器的要求,h(n) 必须是偶对称的。对称中心必须等于滤波器的延时常数,即2/)1(Nanhd用矩形窗设计的 FIR 低通滤波器,所设计滤波器的幅度函数在通带和阻带都呈现出振荡现象,且最大波纹大约为幅度的 9%,这个现象称为吉布斯(Gibbs )效应。为了消除吉布斯效应,一般采用其他类型的窗函数。使用窗函数法设计时要满足以下两个条件:( 1) 窗谱主瓣尽可能地窄, 以获得较陡的过渡带;( 2) 尽量减少窗谱的最大旁瓣的相对幅度, 也就是使能量尽量集中于主瓣, 减小峰肩和纹波, 进而增加阻带的衰减。设计步骤a.录制一段自己的语音信号,并对录制
9、的信号进行采样。b.画出采样后语音信号的时域波形和频谱图。c.噪声的添加。d.给出滤波器的性能指标,采用窗函数法和双线性变换设计滤波器,并画出滤波器的频率响应。e.设计滤波器并对采集的信号进行滤波,画出滤波后信号的时域波形和频谱,并对滤波前后的信号进行对比,分析信号的变化。f.回放语音信号。g设计一个 GUI 界面(选做) 。(a)语音信号的采集利用 Windows 下的录音机,录制一段自己的话音,时间在 2 s 内。然后在Matlab 软件平台下,利用函数 wavread 对语音信号进行采样,记住采样频率和采样点数。代码:y,fs,bits=wavread(zyb.wav,1024 6350
10、0);sound(y,fs,bits);(b)语音信号的频谱分析首先画出语音信号的时域波形;然后对语音号进行快速傅里叶变换,得到信号的频谱特性。代码:Y=fft(y,4096); figure(1); plot(y);title(语音信号的时域波形); figure(2); plot(abs(Y);title(语音信号的频谱特性); 0 1 2 3 4 5 6x 104-1-0.8-0.6-0.4-0.200.20.40.60.81 信 信 信 信 信 信 信 信 信0 500 1000 1500 2000 2500 3000 3500 4000 4500012345678910 信 信 信
11、信 信 信 信 信 信(c)利用特定的函数产生噪声。代码:t=0:0.2:10;y1=awgn(y,10,measured);Y1=fft(y1,4096);figure(3);plot(y1);title(加噪语音信号的时域波形);figure(4);plot(abs(Y1);title(加噪语音信号的频谱特性);0 1 2 3 4 5 6x 104-1.5-1-0.500.511.5 信 信 信 信 信 信 信 信 信 信 信0 500 1000 1500 2000 2500 3000 3500 4000 450001020304050607080 信 信 信 信 信 信 信 信 信 信
12、信(d)设计数字滤波器和画出其频率响应给出各滤波器的性能指标:(1)低通滤波器性能指标 fb1 000 Hz,fc 1 200 Hz,As100 dB,Ap1 dB。(2)高通滤波器性能指标 fc4 800 Hz,fb5 000 Hz As100 dB,Ap1 dB。(3)带通滤波器性能指标 fb11 200 Hz,fb23 000 Hz,fc11 000 Hz,fc23 200 Hz,As100 dB,Ap1 dB。利用窗函数法和双线性变换法设计其上的低通滤波器。在 Matlab 中,利用函数 fir1 设计 FIR 滤波器,并利用 Matlab 中的函数 freqz 画出各滤波器的频率响应
13、。(e)用滤波器对信号进行滤波利用设计出的各滤波器分别对采集的信号进行滤波,在 Matlab 中,FIR 滤波器利用函数 fftfilt 对信号进行滤波。(f)比较滤波前后语音信号的波形及频谱在一个窗口同时画出滤波前后的波形及频谱。(g)回放语音信号在 Matlab 中,函数 sound 可以对声音进行回放。(h)设计系统界面(选作)为了使编制的程序操作方便,设计 GUI 的用户界面。设计流程图对声音信号进行时域和频域分析添加噪声设计滤波器播放带有噪声的声音信号程序代码:fs=20000;%*对外部声音的读取和处理*y,fs,bits=wavread(张源斌.wav,2048 60000);s
14、ound(y,fs,bits);Y=fft(y,4096); figure(1); plot(y);title(语音信号的时域波形); figure(2); plot(abs(Y);title(语音信号的频谱特性); %*添加噪声*n=length(y);开始录制声音信号回放滤波后的声音比较滤波前后的时域和频域分析t=0:1/fs:(n-1)/fs;Au=0.04Noise=Au*sin(2*pi*5000*t);y1=y+Noise;Y=fft(y1,4096);sound(y1,fs,bits);figure(3);plot(y1);title(加噪语音信号的时域波形);figure(4)
15、;plot(abs(Y);title(加噪语音信号的频谱特性);%*FIR 滤波器设计*fs=20000;rp=1;rs=100;fcuts=1000 1200;d1=(10(rp/20)-1)/(10(rp/20)+1);d2=10(-rs/20);mags=1 0;devs=d1 d2;n,wn,beta,ftype=kaiserord(fcuts,mags,devs,fs);b=fir1(n,wn,ftype,kaiser(n+1,beta),noscale);figure(5);freqz(b,1,512);grid;xlabel(频率Hz);ylabel(频率响应幅度);grid;%
16、*对原信号进行滤波*f1=filter(b,1,y1);sound(f1,20000); %播放滤波后的信号%*比较波形滤波前后时域的图形*figure(6)subplot(2,1,1)plot(y1) %画出滤波前的时域图title(滤波前的时域波形);xlabel(times);ylabel(幅度);grid;subplot(2,1,2)plot(f1); %画出滤波后的时域图title(滤波后的时域波形);xlabel(times);ylabel(幅度);grid;%*比较波形滤波前后频域的图形*F0=fft(f1,1024);f=fs*(0:511)/1024;figure(7)y2=
17、fft(y1,1024);subplot(2,1,1);plot(f,abs(y2(1:512); %画出滤波前的频谱图title(滤波前的频谱);axis(0 4000 0 1.5);xlabel(频率Hz);ylabel(幅度);grid;subplot(2,1,2)F1=plot(f,abs(F0(1:512); %画出滤波后的频谱图title(滤波后的频谱);axis(0 4000 0 1.5);xlabel(频率Hz);ylabel(幅度);grid;运行结果图0 0.1 0.2 0.3 0.4 0.5 0.6 0.7 0.8 0.9 1-8000-6000-4000-20000No
18、rmalized Frequency ( rad/sample)Phase (degrees)0 0.1 0.2 0.3 0.4 0.5 0.6 0.7 0.8 0.9 1-200-1000100信 信 信 Hz信信信信信信0 1 2 3 4 5 6x 104-2-1012 信 信 信 信 信 信 信 信times信信0 1 2 3 4 5 6x 104-2-1012 信 信 信 信 信 信 信 信times信信0 500 1000 1500 2000 2500 3000 3500 400000.511.5 信 信 信 信 信 信信 信 信 Hz信信0 500 1000 1500 2000 2
19、500 3000 3500 400000.511.5 信 信 信 信 信 信信 信 信 Hz信信GUI 设计screen=get(0,screensize);W=screen(3);H=screen(4);figure(color,0.85,0.75,0.35,position,0.5*H,0.5*H,0.5*W,0.5*H,.name, 张源斌图形演示界面,Numbertitle,off,Menubar,none);hplot=uimenu(gcf,Label,uimenu(hplot,Label,语音信号采集,call,y,fs,Nbits=wavread(张源斌);,.plot(y);,
20、title(语音信号的时域波形););uimenu(hplot,Label,加噪语音信号的时域波形,call,fs=20000;,x1,fs,nbits=wavread(张源斌);,. t=length(x1)/20000;,f=fs*(0:1023)/2048;,Au=0.05;,d=Au*cos(2*pi*3800*t);,x2=x1+d;,.plot(x2);,title(加噪语音信号的时域波形););uimenu(hplot,Label,加噪语音信号的频谱特性,Call,y,fs,Nbits=wavread(张源斌);,.Y=fft(y,4096);,plot(abs(Y);,titl
21、e(加噪语音信号的频谱特性););uimenu(hplot,Label,加噪语音信号的频谱特性,call,fs=20000;,x1,fs,nbits=wavread(张源斌);,. t=length(x1)/20000;,f=fs*(0:1023)/2048;,Au=0.05;,d=Au*cos(2*pi*3800*t);,x2=x1+d;,.X=fft(x2,4096);,plot(abs(X);,title(加噪语音信号的频谱特性););uimenu(hplot,Label,滤波前后信号波形和频谱,Call,x1=wavread(wang);,t=length(x1)/20000;,. f
22、=fs*(0:1023)/2048;,Au=0.05;,d=Au*cos(2*pi*3800*t);,x2=x1+d;,fp=1000;,fc=1200;,.As=100;,Ap=1;,fs=8000;,wc=2*pi*fc/fs;,wp=2*pi*fp/fs;,beta=0.112*(As-8.7);,.wdel=wc-wp;,N=ceil(As-8)/2.285/wdel);,.wn= kaiser(N+1,beta);,ws=(wp+wc)/2/pi;,b=fir1(N,ws,wn);,freqz(b,1);,x=fftfilt(b,x2);,.X=fft(x,8192);,plot(x
23、);,title(滤波后信号波形););hoption=uimenu(gcf,Label,hfigcor=uimenu(hoption,Label,uimenu(hfigcor,Label,);uimenu(hfigcor,Label,);uimenu(hfigcor,Label,);uimenu(hfigcor,Label,);uimenu(gcf,Label,设计心得在课程设计期间由于做考试复习,在第一周自己并没有在课程设计上下很大的功夫,只是在做课程的时间在网上找找资料,并做一些 MATLAB 操作,并没有深入研究。第二周考试结束后,自己把所有的经历都放在课程设计上了,由于数字信号处理这
24、门课的知识自己很长时间没有复习,基本忘得差不多了,再加上自己没有学过 MATLAB,因此做起来很是吃力,还好有许多学过 MATLAB 的同学以及指导老师给自己相当大的帮助,从开始的声音信号采集,并分析时域和频域特性。到为声音信号添加噪声,再到滤波器的设计以及滤波后的时域和频域分析,几乎都是自己一步一步的做出来的,对程序有了很多的理解,也对MATLAB 的基本操作掌握了一些,掌握了各种窗函数的一些用法,这让自己感到十分欣慰,因为自己有多掌握了许多有用的知识,同时自己也发现了自己在学习上的许多缺点及错误方法,这在以后自己要逐渐改正。现在自己已经是一名大三的学生了,即将升入大四,做这样的课程设计对自
25、己有很大的帮助,无论将来自己是就业还是考研,加强动手能力是十分有必要的。参考文献1. 程佩青数字信号处理教程北京清华大学出版社 2007 年 2 月.2. 赵知劲、刘顺兰数字信号处理实验. 浙江大学出版社.3. S.K.MitraDigital Signal Processing:A Computer-Based Approach.NewYork,NewYork:McGraw-Hill,thirded,20064. 肖伟、刘忠等 MATLAB 程序设计与应用清华大学出版社、北京交通大学出版社 .5. 胡良剑、孙晓君 MATLAB 数学实验. 高等教育出版社.6. 杨述斌、李永全数字信号处理实践教程华中科技大学出版社 .