分类号编号华北水利水电学院NorthChinaInstituteofWaterConservancyandHydroelectricPower课程设计题目基于ccs环境的FIR滤波器仿真学院信息工程专业通信工程姓名学号指导教师2010年12月30日1基于CCS环境的FIR滤波器仿真摘要本文介绍了数字滤波器的设计基础及用窗函数法设计FIR滤波器的方法,运用MATLAB语言实现了带通滤波器的设计以及用CCS软件进行滤波效果的观察。读取语音文件,并加入一定的随机噪声,最后使用窗函数滤波法进行语音滤波,将加噪后的语音文件转换为.dat文件使其能和ccs软件链接,输出个阶段的时域和频域波形。一、设计目的利用汇编语言在CCS环境中设计一个80级的FIR带通滤波器,通带频率为1.375KHz至3.625KHz;阻带边界频率为1KHz和4KHz;采样频率为10KHz,并利用设计好的滤波器对常用信号进行滤波处理。二、设计思想1、FIR(FiniteImpulseResponse)滤波器原理:有限长单位冲激响应滤波器,是数字信号处理系统中最基本的元件。可以在保证任意幅频特性的同时具有严格的线性相频特性,同时其单位抽样响应是有限长的,因而滤波器是稳定的系统。FIR滤波器在通信、图像处理、模式识别等领域都有着广泛的应用。FIR滤波器无反馈回路,是一种条件稳定系统,可以设计成具有线性相位特性。设FIR滤波器的系数为h(0),h(1),...,h(N-1),X(n)表示滤波器在n时刻的输入,则n时刻的输出为:FIR数字滤波器的结构如图1所示:10()()()(0)()(1)(1)(1)[(1)]NiynhixnihxnhxnhNxnNx(n)Z-1Z-1Z-1h(0)h(1)h(2)h(N-2)h(N-1)y(n)22、使用Matlab中的Fdatool设计滤波器在Matlab的Start菜单中选择Toolboxes-FilterDesign-FilterDesign&AnalysisTools(fdatool),或者在命令行中输入fdatool来启动滤波器设计分析器。调整各参数后得到设计的数字滤波器如下:三、总体设计1、从Matlab中导出FIR滤波器系数。a.在Fdatool中,选择Targets-CodeComposerStudio(tm)IDE。b.在出现的对话框中选择输出文件类型为Cheaderfile,输出系数类型为signed16-bitinteger,如下图所示:3c.点击OK按钮,选择路径,即可输出前一步设计出的FIR滤波器的系数表,文件为fdacoefs.h,得到滤波器的参数如下:constintBL=81;constint16_TB[81]={-16,0,-7,0,139,0,-223,0,17,0,233,0,-14,0,-356,0,35,0,532,0,-59,0,-790,0,85,0,1184,0,-110,0,-1857,0,130,0,3334,0,-143,0,-10382,0,16531,0,-10382,0,-143,0,3334,0,130,0,-1857,0,-110,0,1184,0,85,0,-790,0,-59,0,532,0,35,0,-356,0,-14,0,233,0,17,0,-223,0,139,0,-7,0,-16};2、待测信号设计本实验设计一个采样频率Fs为10KHz,输入信号频率为0.5KHz、3KHz和8KHz的合成信号,通过设计的带通滤波器将0.5KHz和8KHz信号滤除,剩余其余信号。为了方4便的导入ccs环境,特用Matlab生成随机信号,并导出明为input的dat文件。随机信号生成代码:f11=500;%/Hzf12=3000;%/Hzf13=8000;%/Hzfs=10000;%/采样HzN=1000%数据个数T=1/fs;%采样周期n=0:N;x11=sin(2*pi*f11*n*T);x12=0.7*sin(2*pi*f12*n*T);x13=0.5*sin(2*pi*f13*n*T);x_base=(x11+x12+x13);%待滤波信号波形figure(1)plot(x_base)%待滤波信号频谱figure(2)yff=abs(fft(x_base))df=n*(fs/N)plot(df,yff)xout=x_base/max(x_base);%归一化xto_ccs=round(32767*xout)fid=fopen('input.dat','w');%打开文件fprintf(fid,'16511000\n');%输出文件头5fprintf(fid,'%d\n',xto_ccs);%输出fclose(fid);3、CCS环境程序设计A、在CCS上建立FIR工程并将滤波器仿真程序FIR.c、Matlab导出的头文件fdacoefs.h和链接文件FIR.cmd添加到工程中,对程序进行调试、链接;调试无误后生成FIR.out程序。FIR.c程序如下:#includestdio.h#includefdacoefs.h//fdacoefs.h为Matlab生成的系数表头文件#defineN81//FIR滤波器的级数+1,本例中滤波器级数为80#defineLEN200//待滤波的数据长度longyn;intinput[LEN];//输入缓冲,在仿真时将从内存载入intoutput[LEN];//输出缓冲,直接存放在内存中voidmain(){inti,j;int*x;for(j=0;jLEN-1;j++){x=&input[j];yn=0;for(i=0;iN-1;i++)yn+=B[i]*(*x++);output[j]=yn15;}while(1);}6FIR.cmd程序如下:MEMORY{PAGE0:EPROG:origin=0x1400,len=0x7c00VECT:origin=0xff80,len=0x80PAGE1:USERREGS:origin=0x60,len=0x1cBIOSREGS:origin=0x7c,len=0x4IDATA:origin=0x80,len=0x1380EDATA:origin=0x1400,len=0x8000EDATA1:origin=0x9400,len=0x4c00}SECTIONS{.vectors:{}VECTPAGE0.sysregs:{}BIOSREGSPAGE1.trcinit:{}EPROGPAGE0.gblinit:{}EPROGPAGE0frt:{}EPROGPAGE0.text:{}EPROGPAGE0.cinit:{}EPROGPAGE0.pinit:{}EPROGPAGE0.sysinit:{}EPROGPAGE0.bss:{}IDATAPAGE1.far:{}IDATAPAGE1.const:{}IDATAPAGE1.switch:{}IDATAPAGE1.sysmem:{}IDATAPAGE1.cio:{}IDATAPAGE1.MEM$obj:{}IDATAPAGE1.sysheap:{}IDATAPAGE17.stack:{}IDATAPAGE1}B、装载FIR.out文件,把滤波器程序载入内存;装载之前生成的input.dat文件,将Address设置为input,Length设置为200,Page设置为Data。C、运行程序,点击RUN按钮,程序即开始运行。D、查看滤波器滤波效果。打开View-Graph-Time/Frequency,修改参数设置如下:点击OK,得到输入信号的时域波形:E、重复前三个步骤,只改变图形选项中的DisplayType、GraphTitle、StartAddress,使之8最后出现如下的图形:左上角:输入数据时域图(StartAddress:input)右上角:输入数据频谱(DisplayType:FFTMagnitude)左下角:输出数据时域图(StartAddress:output)右下角:输出数据频谱(DisplayType:FFTMagnitude)四、总结实践证明,该滤波器准确度搞、稳定性好,易于移植使用,具有较强的实用性与灵活性。Matlab可方便地设计出FIR数字滤波器,并且修改系数方便。DSP的可移植性好,所以能从不同方法得来滤波器系数,从而达到不同的滤波效果。综合实验的各个方面以及实验中出现的问题,让我对DSP环境下滤波器设计这一课程设计有了全新而系统的认识:对滤波器设计首先应该明确设计任务(目的),要了解自己究竟要设计什么,怎样设计,以及怎样解决实验中出现的问题,必须有一个明确的设计思路;其次,要掌握足够的理论知识,以踏实、严谨的态度对待,充分发挥创新精神,将自己的理论知识与实际设计情况相结合,做到理论联系实际,实际也不脱离理论,只有理论联系实际才能真正学到知识!9参考文献[1]DSP原理及应用北京:电子工业出版社,2005.1[2]TMS320C54xDSP应用程序设计教程北京:机械工业出版社,2004.1[3]MATLAB在数字信号处理中的应用北京:清华大学出版社,2003[4]DSP系统设计与开发实例北京:电子工业出版社,2004