实验五IIR数字滤波器的算法实现和仿真一、实验目的(1)了解IIR滤波器的原理及使用方法;(2)了解使用Matlab语言设计IIR滤波器的方法;(3)了解DSP对IIR滤波器的设计及编程方法;(4)熟悉对IIR滤波器的仿真调试方法:I/O口数据输入输出法和探针数据输入输出法。二、实验设备安装有CCS软件的电脑三、实验目标试利用CCS测试四阶IIR低通滤波器的单位冲激响应。滤波器的通带为200Hz,阻带为500Hz。四、实验原理(一)基本理论数字滤波器的输入x[k]和输出y[k]之间的关系可以用如下常系数线性差分方程来描述:∑∑==−+−=NiiMiiinyainxbny10)()()(系统的转移函数为∑∑=−=−−=NiiiMiiizazbzH101)(展开为NnMmzazazazbzbbzH−−−−−−−−−+++=...1...)(2211110转换成极零点表示为:NjjjpzzzCzH1)(=∏−−=式中,zj表示零点,pj表示极点,它具有N个零点和N个极点,如果任何一个极点在Z平面单位圆外,则系统不稳定。如果系数ai全部为0,滤波器成为非递归的FIR滤波器,这时系统没有极点,因此FIR滤波器总是稳定的。对于IIR滤波器,有系数量化敏感的缺点。由于系统对序列施加的算法,是由加法、延时和常系数乘三种基本运算的组合,所以可以用不同结构的数字滤波器来实现而不影响系统总的传输函数。为了要用四阶IIR结构实现通带为200Hz,阻带为500Hz的低通滤波器。滤波器的差分方程表达式为:)4(.....)1()4(.....)1()()(41410−++−+−++−+=nyanyanxbnxbnxbny用MATLAB求得:a1=3.4674,a2=-4.4615,a3=2.8518,a4=-0.6739,b0=0.0951,b1=-0.3139,b2=0.4460,b3=-0.3139,b4=0.0951下图为一个直接Ⅱ型的四阶IIR滤波器的结构标准形式。+Z-1Z-1XXXX+x(n)y(n)a1a2b1Xb0b2w(n)x0x1x2反馈通道前向通道Z-1Z-1XXXXa3a4b3b4x3x4图5-1直接Ⅰ型四阶IIR滤波器由图可以写出反馈通道和前向通道的差分方程如下:反馈通道:443322110)()(xaxaxaxanxnwx∗+∗+∗+∗+==前向通道:4433221100***)(xaxbxbxbxbny++∗++∗=在编程时,将变量和系数都存放在DARAM中,并采用循环缓冲区方式寻址,共需开辟4个循环缓冲区用来存放变量和系数。这四个循环缓冲区的结构如下:x(n-2)x(n-1)x(n)y(n-2)y(n-2)y(n)b2b1b0a2a1未用XYBAAR2AR4AR5AR3x(n-3)x(n-4)y(n-3)y(n-4)b3b4a3a4图5-2内存中缓冲区及指针的设置(二)实验程序1.汇编语言源程序直接形式四阶IIR滤波器的源程序iir_4order.asm如下:.title“iir_4order.asm”.mmregs.globalmainX.usect“X”,5Y.usect“Y”,5B.usect“B”,5A.usect“A”,5PA0.set0PA1.set1.datatable.word0,0,0,0;x(n-1)~x(n-4).word0,0,0,0;y(n-1)~y(n-4).word3116;B4=0.0951.word-10286;B3=-0.3139.word14615;B2=0.4460.word-10286;B1=-0.3139.word3136;B0=0.0951.word-22082;A4=-0.6739.word31149;A3/3=2.8518/3.word-30484;A2/5=-4.6515/5.word28383;A1/4=3.4647/4.textmain:SSBXFRCTSTM#X,AR1RPT#3MVPD#table,*AR1+STM#Y,AR1RPT#3MVPD#table+4,*AR1+STM#B,AR1RPT#4MVPD#table+8,*AR1+STM#A,AR1RPT#3MVPD#table+13,*AR1+STM#X+4,AR2STM#A+3,AR3STM#Y+3,AR4STM#B+4,AR5STM#5,BKSTM#-1,AR0STM#1000h,AR6;输出数据缓冲器首址为#1000hSTM#0200h-1,AR7;循环计算512个样点LOOP:PORTRPA1,*AR2LD*AR2,ASTLA,-1,*AR2;x(n)/2,防止溢出MPY*AR2+0%,*AR5+0%,A;计算前向通道MAC*AR2+0%,*AR5+0%,AMAC*AR2+0%,*AR5+0%,AMAC*AR2+0%,*AR5+0%,AMAC*AR2,*AR5+0%,AMAC*AR4,*AR3,A;计算反向通道MAC*AR4,*AR3,A;*A1/4MAC*AR4,*AR3,AMAC*AR4+0%,*AR3+0%,AMAC*AR4,*AR3,AMAC*AR4,*AR3,AMAC*AR4,*AR3,AMAC*AR4,*AR3,AMAC*AR4+0%,*AR3+0%,AMAC*AR4,*AR3,A;*A3/3MAC*AR4,*AR3,AMAC*AR4+0%,*AR3+0%,AMAC*AR4+0%,*AR3+0%,A;*A4MAR*AR3+0%STHA,*AR4PORTW*AR4,PA0STHA,*AR6+;输出y(n)BANZLOOP,*AR7-;保存y(n)end:Bend.end2.复位向量文件IIR_V.asm.titleIIR_V.asm*************Reset-Vector********************.refmain.sect.vecs0Bmain.end3.链接命令文件IIR.cmdMEMORY{PAGE0:EPROM:org=0xE000,len=0x1000VECS0:org=0xFF80,len=0x0080PAGE1:SPRAM:org=0x0060,len=0x0020DARAM:org=0x0080,len=0x1380}SECTIONS{.text:EPROMPAGE0.data:EPROMPAGE0X:align(8){}DARAMPAGE1Y:align(8){}DARAMPAGE1B:align(8){}DARAMPAGE1A:align(8){}DARAMPAGE1.vecs0:VECS0PAGE0}4.编写数据文件IIRIN.dat本例输入和输出数据文件名为IIRIN.dat和IIROUT.dat,分别存放输入的单位冲激序列数据和输出的单位冲击响应数据。IIRIN.dat存放的输入冲激数据共512个,第一个为0x7FFF,其余均为0。数据文件impulse.dat清单如下(数据文件的格式见教材):16511100012000x7FFF0x00x0┇0x00x0五、实验步骤1.建立工程项目和向工程项目添加文件选择Project—New命令,打开建立工程项目对话框,在Project框中键入要创建的工程项目名IIR_4order。工程项目建立以后,就可以选择Project—AddFiletoProject命令,向工程项目添加以下文件:¾汇编语言源文件iir_4order.asm;¾复位向量文件IIR_V.asm;¾链接命令文件IIR.cmd。2.编译链接和加载可执行文件选择Project—Build或Project—RebuildAll命令,对工程项目中的文件进行编译、汇编和链接,生成可以在目标系统中运行的、可执行的输出文件(.out文件)。选择File—1oadProgram命令,加载.out文件,之后就可以进入程序调试阶段了。3.调试方法一、利用I/O端口与外部冲激信号序列连接,观察滤波器的冲激响应和幅频特性准备工作之一:定义配置I/O端口的GEL函数。具体方法是在CCS的C5402.gel文件(假设CCS配置时选择了C5402DeviceSimulator)中添加以下两个GEL函数:GEL_MapAdd(0x0001,2,0x0001,1,0);GEL_MapAdd(0x0000,2,0x0001,0,1);以设置I/O口:输入口地址为0x0001,输出口的地址为0x0000.准备工作之二:将数据文件与I/O口地址相关联。方法是:选择Tools—PortConnect命令,打开连接对话框(在CCS的下面,如图5-4)。单击Connect按钮,在弹出的Connect对话框中(如图5-3),选择Port:1;Length:1;Page:I/O;Type:Read。图5-3用PortConnect关联数据文件的设置单击OK后选择相关联的输入数据文件impulse.dat。之后在CCS的下边出现如图5-4所示的状态窗口。图5-4数据文件与I/O口地址关联情况用同样方法,在Connect对话狂中,选择Port:0;Length:1;Page:I/O;Type:Write,单击OK后选择输出数据文件IIROUT.dat就行了。①运行程序。计算结果(本滤波器的单位冲击响应)共512个样点,保存在数据存储器的0x1000~Ox11FF和输出数据文件IIROUT.dat中。选择View—Graph—Time/Frequency命令,在弹出的对话框中设置参数(见图5-5),就可以根据存储器中的数据画出滤波器的单位冲激响应曲线了,如图5-6所示。此曲线表明本系统是稳定的。图5-5观察冲激响应信号时的参数设置图5-6滤波器的冲激响应h(n)注意:程序重新编译链接并重装载后,与原来的连接的数据文件会失去连接,必须重新连接外部数据文件。对冲激相应信号h(n)做FFT变换,就可以得到本滤波器的频率特性H(ω)。对自内存数据空间0x1000起的512字的h(n)做FFT变换,选择菜单View—Graph—Time/Frequency,出现GraphPropertyDialog参数设置框,在Displaytype中选择FFTMagnitude,并设置其它参数,如图5-7所示。就得到本滤波器的幅频特性,如图5-8所示。可见此幅频特性符合原来的设计要求,得到了验证。图5-7观察滤波器H(w)的设置图5-8滤波器的幅频特性方法二、利用探针输入或输出外部数据文件(1)建立外部数据文件。例如,要建立的输入数据文件是名为impulse.dat的冲激信号文件,格式如前所述。165112000120000x7fff0x00000x00000x00000x00000x0000…(2)修改程序将iir_4order.asm文件中的:LOOP:PORTRPA1,*AR2LD*AR2,A改成:LOOP:LD*(Input),A将LOOP程序段中的“BANZLOOP,*AR7-”语句改成“BLOOP”,以使程序不停地循环运行。(3)设置探针将光标移到需要从外部文件载人数据的源程序语句处,即“LD*(Input),A”处,单击工具栏按钮,光标所在的语句行左端就会出现一个蓝色菱形标志。此步操作的作用是:设定程序执行到此语句时从外部数据文件载入数据。如果要撤消此探针,只需将鼠标移到此语句上,再单击按钮耻就行了。单击工程工具栏按钮,将取消所设置的全部探针。(4)将探针与外部文件关联选择File—FileI/O命令,即可打开FileI/O对话框,如图5-9所示。图5-9FileI/O对话框单击图5-9中的AddFile按钮,浏览并指定外部输入数据文件,假设为冲激序列impulse.dat。在Page下拉列表框中选择Data,在Address文本框中键入Input,在Length文本框中键入1,表示将从外部文件中载人1个数据,保存到起始地址为Input的数据存储器中。至于何时载入数据,则由探针确定。接着单击AddProbePoint按钮,弹出Break/Probe