FIR滤波器的设计——使用Matlab和CCS摘要:本文通过使用Matlab软来辅助CCS设计FIR滤波器,图文并茂,讲解详细,思路清晰。设计流程如下图用Matlab中Fdatool设计滤波器导出滤波器系数表在CCS中设计FIR滤波器程序输出滤波并观察波形用Matlab产生待滤波数据1、使用Matlab中的Fdatool设计滤波器(本文以FIR带通滤波器为例)1.1、在Matlab的Start菜单中选择Toolboxes-FilterDesign-FilterDesign&AnalysisTools(fdatool),或者在命令行中输入fdatool来启动滤波器设计分析器。启动成功后界面如图1-1所示。图1-11.2、在选项中选择或输入滤波器参数,然后点击“DesignFilter”按钮,完成滤波器的设计。具体参数及设计成功后的结果如图1-2图1-21.3、从Matlab中导出FIR滤波器系数。a.在Fdatool中,选择Targets-CodeComposerStudio(tm)IDE,如图1-3。b.在出现的对话框中选择输出文件类型为Cheaderfile,输出系数类型为signed16-bitinteger,如图1-4所示。c.点击Generate按钮,选择路径,即可输出前一步设计出的FIR滤波器的系数表。(假设生成的系数表文件为fdacoefs.h)图1-3图1-42、利用Matlab产生噪声信号用于滤波器测试将下面代码另存为M文件,在Matlab中运行后将会生成input.dat文件。该数据文件中含有500Hz、3000Hz、8000Hz三种频率的信号,用于滤波器滤波效果测试。信号的时域图和频谱分别图2-1、图2-2所示。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');%输出文件头fprintf(fid,'%d\n',xto_ccs);%输出fclose(fid);020040060080010001200-2.5-2-1.5-1-0.500.511.522.5图2-1010002000300040005000600070008000900010000050100150200250300350400450500图2-23、在CCS中编写FIR滤波器程序(本文以C语言为例)3.1、新建工程,作者是以C54xSimulator为例,新建工程的过程就不再赘述。3.2、编写C语言源代码并导入工程,如下:#includestdio.h#includefdacoefs.h//fdacoefs.h为Matlab生成的系数表头文件//如运行不通过,请修改fdacoefs.h中的代码,将”#include”这行修改为如下://#included:\MATLAB7\extern\include\tmwtypes.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);}3.3、cmd文件如下,其实是从CCS软件中的例子里复制过来的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:{}IDATAPAGE1.stack:{}IDATAPAGE1}3.4、另外还要导入rts.lib文件,在…\ti\c5400\cgtools\lib文件夹下。4、滤波器仿真测试4.1、在第3部分编译成功后会在”工程所以目录/debug”文件夹下产生*.out文件,在CCS软件的File-LoadProgram里打开这个.out文件(图4-1)图4-14.2、将滤波器设计文件载入到内存中4.2.1、选择File-Data-Load…打开之前Matlab生成的input.dat文件(图4-2)图4-24.2.2、将Address设置为input,Length设置为200,Page设置为Data(图4-3)图4-34.3、运行程序,点击按钮,程序即开始运行4.4、查看滤波器滤波效果4.4.1、打开View-Graph-Time/Frequency(图4-4)图4-44.4.2、在上一步出现的对话框中,按如图4-5设置:图4-54.4.3、如果出现的波形图太大,在图形上点右键,将”AllowDocking”、”Floatinmainwindow”之前的勾去掉,即会变成如图4-6的波形:图4-64.4.4、重复前三个步骤,只改变图形选项中的DisplayType、GraphTitle、StartAddress,使之最后出现如下的图形:图4-7左上角:输入数据时域图(StartAddress:input)右上角:输入数据频谱(DisplayType:FFTMagnitude)左下角:输出数据时域图(StartAddress:output)右下角:输出数据频谱(DisplayType:FFTMagnitude)5、后记本文的灵感来自于笔者的DSP课程设计。刚开始学DSP的时候,疯狂地在网上找资料,也的确找到不少有价值的资料,但唯一遗憾的就是都不是非常完美(或者说不完整)。有些看似简单却很重要的步骤经常会被作者省略,可能是作者水平较高,不能体会到初学者的苦衷吧。所以本人在这次DSP课程设计之后,在原来的设计报告的基础上做了一定修改和加工,故成此文,希望能给DSP初学者一定的帮助吧!如有不足之处,还望读者批评指正!ByCraftor@2009-6-26E-mail:craftor@126.comQQ:363901060