IIR滤波器的DSP实现一、IIR滤波器的基本结构IIR滤波器差分方程的一般表达式为:y(n)=∑bix(n−i)Ni=0−∑aiy(n−i)Mi=1式中x(n)为输入序列;y(n)为输出序列;ai和bi为滤波器系数.若所有系数ai等于0,则为FIR滤波器.IIR滤波器具有无限长的单位脉冲响应,在结构上存在反馈回路,具有递归性,即IIR滤波器的输出不仅与输入有关,而且与过去的输出有关.将上式展开得出y(n)表达式为:y(n)=b0x(n)+b1x(n−1)+⋯+bNx(n−N)−a1y(n−1)−a2y(n−2)−⋯−aMy(n−M)在零初始条件下,对上式进行z变换,得到:Y(z)=b0X(z)+b1z−1X(z)+⋯+bNz−NX(z)−a1z−1Y(z)−a2z−2Y(z)−⋯−aMz−MY(z)设N=M,则传递函数为:H(z)=Y(z)X(z)=b0+b1z−1+⋯+bNz−N1+a1z−1+⋯+aNz−N上式可写成:H(z)=b0zN+b1zN−1+⋯+bNzN+a1z−1+⋯+aN=C∏z−ziz−piNi=1上式具有N个零点zi和N个极点pi.若有极点位于单位圆外将导致系统不稳定.由于FIR滤波器所有的系数ai均为0,不存在极点,不会造成系数的不稳定.对于IIR滤波器,系统稳定的条件如下:若|pi|1,当n→∞时,h(n)→0,系统稳定;若|pi|1,当n→∞时,h(n)→∞,系统不稳定.IIR滤波器具有多种形式,主要有:直接型(也称直接I型)、标准型(也称直接II型)、变换型、级联型和并联型.二阶IIR滤波器,又称为二阶基本节,分为直接型、标准型和变换型.对于一个二阶IIR滤波器,其输出可以写成:y(n)=b0x(n)+b1x(n−1)+b2x(n−2)−a1y(n−1)−a2y(n−2)1.直接型(直接I型)根据上式可以得到直接二型IIR滤波器的结构图.如图1所示.共使用了4个延迟单元(z−1).图1直接I型二阶IIR滤波器直接型二阶IIR滤波器还可以用图2的结构实现.图2直接I型二阶IIR滤波器此时,延时变量变成了w(n).可以证明上图的结构仍满足二阶IIR滤波器输出方程.前向通道:y(n)=∑biw(n−i)2i=0(1.1)反馈通道:w(n)=x(n)−∑ajw(n−j)2j=1(1.2)将1.2式代入1.1式可得:y(n)=∑bi[x(n−i)2i=0−∑ajw(n−i−j)]2j=1=∑bix(n−i)2i=0−∑bi2i=0∑ajw(n−i−j)2j=1=∑bix(n−i)2i=0−∑aj2i=0∑biw(n−i−j)2j=1=∑bix(n−i)2i=0−∑ajy(n−j)2j=12.标准型(直接II型)从图2可以看出,左右两组延迟单元可以重叠,从而得到标准二阶IIR滤波器的结构图,如图3所示.由于这种结构所使用的延迟单元最少(只有2个),得到了广泛地应用,因此称之为标准型IIR滤波器.图3标准型二阶IIR滤波器二、IIR滤波器的设计IIR滤波器的设计可以利用模拟滤波器原型,借鉴成熟的模拟滤波器的设计结果进行双线性变换,将模拟滤波器变换成满足预定指标的数字滤波器,即根据模拟设计理论设计出满足要求的传递函数H(s),然后将H(s)变换成数字滤波器的传递函数H(z).设计IIR滤波器的基础是设计模拟滤波器的原型,这些原型滤波器主要有:①巴特沃兹(Butterworth)滤波器,其幅度响应在通带内具有最平特性;②切比雪夫(Chebyshev)滤波器,在通带内具有等波纹特性,且阶数小于巴特沃兹滤波器.③椭圆(Elliptic)滤波器,在通带内具有等波纹特性,且阶数最小.将模拟滤波器转换为数字滤波器常用的方法是双线性变换,其作用是完成从s平面到z平面的一个映射.其关系为:{s=z−1z+1(2.1)z=1+s1−s(2.2)双线性变换的基本性质如下:①s平面上的jω轴映射到z平面的单位圆上;②s平面的左半平面映射到z平面的单位圆内;③s平面的右半平面映射到z平面的单位圆外.考虑到s平面上的虚轴映射为z平面的单位圆,令s=jωA,它代表一个可变的模拟频率.其z平面上相应的数字频率为ωD,即z=ejωDT,将以上两式代入2.1式得:jωA=ejωDT−1ejωDT+1=ejωDT2(ejωDT/2−e−jωDT/2)ejωDT2(ejωDT2+e−jωDT/2)对上式求解得:ωA=arctanωDT2(2.3)模拟频率ωA和相应的数字频率ωD之间的映射关系如图4所示:图4ωA和ωD之间的映射关系当ωA在0~1之间变化时,ωD在0~ωD4之间变化,ωs为采样频率:当ωA1时,其对应的ωD在ωD4~ωD2之间.双线性变换会造成频率失真,通常采用预畸变来补偿频率失真.双线性变换设计的步骤如下:①选择一个合适的模拟传递函数H(s);②对截止频率或预定的数字频率ωD进行畸变,并根据式2.3求得相应的模拟频率ωA;③用ωA对H(s)中的频率进行换算,即:H(s)|s=s/ωA④用式2.1计算H(z):H(z)=H(sωA)|s=z−1z+1三、二阶IIR滤波器的DSP实现1.标准型二阶IIR滤波器的实现在二阶IIR滤波器结构中,标准型结构是最常见的滤波器结构,其结构如图5所示:图5标准型二阶IIR滤波器由结构图可以写出反馈通道和前向通道的差分方程:反馈通道:w(n)=x(n)+a1w(n−1)+a2w(n−2)前向通道:y(n)=b0w(n)+b1w(n−1)+b2w(n−2)由以上两式对二阶IIR滤波器进行编程,其中乘法-累加运算可采用单操作数指令或双操作数指令,数据和系数可存放在DARAM中,如图6所示:图6双操作数数据存放和系数表2.直接型二阶IIR滤波器的实现二阶IIR滤波器可以用直接型结构来实现.在迭代运算中,先衰减后增益,系统的动态范围和鲁棒性要好些.直接型二阶IIR滤波器的结构如图7所示:图7直接型二阶IIR滤波器直接型二阶IIR滤波器的脉冲传递函数为:H(z)=b0+b1z−1+b2z−21−a1z−1−a2z−2差分方程为:y(n)=b0x(n)+b1x(n−1)+b2x(n−2)+a1y(n−1)+a2y(n−2)为了实现直接型滤波,可在DARAM中开辟4个循环缓冲区,用来存放变量和系数,并采用循环缓冲区方式寻址.这4个循环缓冲区的结构如图8所示:图8循环缓冲区结构四、总体设计方案1.利用MATLAB来确定IIR滤波器的参数;2.启动CCS,在CCS中建立一个汇编源文件、建立一个C源文件和一个命令文件,并将这三个文件添加到工程,再编译并装载程序;3.设置波形时域观察窗口,得到其滤波前后波形变化图;4.设置频域观察窗口,得到其滤波前后频谱变化图.五、主要参数f1=500Hzf2=1000Hzfs=2000六、源程序1.汇编源文件程序(.asm).global_iir,_init,_outdata_iirbsetfrctsub#1,t0movt0,mmap(csr)addt0,ar0movxar2,xdpmovar2,cdpmov#0,ac0rptcsrmacmz*ar0-,*cdp+,ac0addt0,ar1movxar3,xdpmovar3,cdprptcsrmacmz*ar1-,*cdp+,ac0mar*ar1+movhi(ac0),*ar1movhi(ac0),t0bclrfrctret_initsub#1,t0movt0,mmap(csr)mov#0,ac0rptcsrmovac0,*ar0+rptcsrmovac0,*ar1+ret_outdatamovt1,ac0sub#2,ac0movac0,mmap(csr)addac0,ar0rptcsrdelay*ar0-mar*ar0+movt0,*ar0ret2.C源文件程序(.c)#includemath.h#definesignal_1_f500#definesignal_2_f10000#definesignal_sample_f25000#definepi3.1415926#defineIIRNUMBER_L2#definebufer_L256intN_L=IIRNUMBER_L;intdata_in[bufer_L];intout[bufer_L];intx[IIRNUMBER_L+1];inty[IIRNUMBER_L+1];intk=0;intbufer=bufer_L;intfBn[IIRNUMBER_L]={0,0x634a};intfAn[IIRNUMBER_L]={0xe5c,0xe5c};externintiir(int*x,int*y,int*fAn,int*fBn,intN_L);externintinit(int*,int*,int);externintoutdata(int*,int,int);voidinputwave();voidmain(){intiirout;inputwave();init(x,y,N_L);while(1){x[0]=data_in[k];iirout=iir(x,y,fAn,fBn,N_L);outdata(out,iirout,bufer);k++;if(k=bufer_L){k=0;}}}voidinputwave(){floatwt1;floatwt2;inti;for(i=0;i=bufer_L;i++){wt1=2*pi*i*signal_1_f;wt1=wt1/signal_sample_f;wt2=2*pi*i*signal_2_f;wt2=wt2/signal_sample_f;data_in[i]=(cos(wt1)+cos(wt2))/2*32768;}}3.命令文件程序(.cmd)-stack0x0500-sysstack0x0500-heap0x1000-c-u_Reset-lrts55.libMEMORY{PAGE0:RAM(RWIX):origin=0x000100,length=0x01ff00ROM(RIX):origin=0x020100,length=0x01ff00VECS(RIX):origin=0xffff00,length=0x000200PAGE2:IOPORT(RWI):origin=0x000000,length=0x020000}SECTIONS{.textROMPAGE0.dataROMPAGE0.bssRAMPAGE0.constRAMPAGE0.sysmemRAMPAGE0.stackRAMPAGE0.cioRAMPAGE0.sysstackRAMPAGE0.switchRAMPAGE0.cinitRAMPAGE0.pinitRAMPAGE0.vectorsVECSPAGE0.ioportIOPORTPAGE2}七、实验结果及分析1.输入波形:①时域波形:②频域波形:2.输出波形:①时域波形:②频域波形:八、心得体会课程设计是培养学生综合运用所学知识,发现,提出,分析和解决实际问题,锻炼实践能力的重要环节,是对学生实际工作能力的具体训练和考察过程.随着科学技术发展的日新日异,数字技术已经成为当今计算机应用中空前活跃的领域,在生活中可以说得是无处不在.通过这次课设,我掌握了数字滤波器的设计过程,了解了IIR的原理和特性,学习IIR滤波器的DSP实现原理.熟悉设计IIR数字滤波器的原理和方法,学习使用CCS的波形观察窗口观察输入输出信号波形和频谱变化情况.通过这次课程设计使我懂得了理论与实际相结合是很重要的,只有理论知识是远远不够的,只有把所学的理论知识与实践相结合起来,从理论中得出结论,才能真正为社会服务,从而提高自己的实际动手能力和独立思考的能力.