标题:无限冲激响应滤波器的(IIR)算法摘要:信息时代的到来,使得信息处理技术飞速发展,并且数字化成为了信息处理技术的一门主流技术,在越来越多的行业得到了广泛应用。数字滤波器具没有漂移,能够处理低频信号,频率响应曲线可以非常接近去理想滤波器的特性,并且精度高,容易集成的优势,所以数字滤波器相对于模拟滤波器得到了快速发展。由于DSP的出现和FPGA的迅速发展也为数字滤波器提供了有力的硬件支持和实现方式。数字信号处理芯片由于运算速度快,具有可编程特点和接口灵活的特点,使得它在许多电子产品的研制、开发和应用中,发挥着重要的作用。采用DSP芯片来实现数字信号处理系统是当前发展的趋势。引言:数字滤波器按其单位脉冲响应分为IIR(无限脉冲响应)和FIR(有限脉冲响应),而IIR通常具有利用较低饿阶数获得高的选择性,执行速度更快,所使用的储存单元更少,经济又高效.本实验是利用CCS编译环境,所进行的软件仿真用来实现用TMS320F2812构成确定技术指标的数字低通滤波器,通过用标准C的数学库中的sin和cos函数,产生低频和高频的混频信号,并通过所设计的低通滤波器,观察其实际的滤波效果。原理:1.无限冲激响应数字滤波器的基础理论。数字滤波器是指输入、输出均为数字信号,通过数值运算处理改变输入信号所含成分的频率成分的相对比例,或者滤除某些频率成分的数字器件或程序。IIR数字滤波器是存在反馈,其单位脉冲响应为无限长的滤波器。IIR数字滤波器的工作原理:将模拟波形进行采样(采样频率要满足时域采样定理),并通过AD转化将模拟量改为数字量并输入IIR数字滤波器中,该过程存在量化误差并且经采样的信号的频谱以采样频率为周期进行了周期延拓,IIR数字滤波器的频谱特性逼近与通过相应的滤波指标所确定的模拟滤波器的频谱特性(频谱指标有通带下限截止频率,阻带上限频率,3dB频率,通带衰减和阻带衰减),并且进行了以2π为周期的周期延拓,由于数字频率π所对应的模拟频率为π/TS,Ts为采样周期,这样就将相应频率滤除了,不过所得的信号频谱仍为周期延拓的数字信号,通过DA转化就可得到模拟波形.IIR数字滤波器的常用设计方法为间接法,即利用已有的设计成熟的模拟滤波器通过相应指标,和对应关系转化为因果稳定的数字频率和模拟角频率为线性的数字滤波器。对应方法为:脉冲响应不变法和双线性变换法。脉冲响应不变法在数字频率为π,即为于模拟频率为Fs/2附近的高频区域存在严重的频谱混叠,故不适合用于设计高通和带通滤波器。双线性变换法由于运用了w和Ω的非线性关系,克服了高频混叠,但是却使得数字滤波器的频率响应不能保真的模仿模拟滤波器的频响曲线。2.模拟滤波器原理(巴特沃斯滤波器、切比雪夫滤波器、椭圆滤波器、贝塞尔滤波器)。通过已知的各种模拟滤波器的幅度平方函数,进行归一化,可得巴特沃斯低通滤波器的频响特性曲线,仅有其阶数确定,所以只需要相应的数字滤波器的设计指标,并转化为模拟巴特沃斯滤波器的指标,确定其阶数即可。3.数字滤波器系数的确定方法。步骤:(1)确定数字滤波器的技术指标(2)转化为相应模拟滤波器的技术指标(3)按照模拟低通滤波器的技术指标设计模拟低通滤波器(4)先利用各个模拟低通滤波器的阶数计算式确定其最小阶数,并利用各个模拟低通滤波器的归一化的系统函数H(s)(5)运用脉冲响应不变法或者双线性变换法,通过对应的S与Z的关系,将模拟滤波器H(s)转化为数字低通滤波器系统函数H(z)4.根据要求设计低通IIR滤波器要求:低通巴特沃斯滤波器在其通带边缘1kHz处的增益为-3dB,12kHz处的阻带衰减为30dB,采样频率25kHz。设计:-确定待求通带边缘频率fp1Hz、待求阻带边缘频率fs1Hz和待求阻带衰减-20logδsdB。技术指标:模拟通带截止频率为:fp1=1000Hz模拟阻带频率为:fs1=12000Hz阻带衰减为:as=30dB通带衰减为:ap=3dB3dB频率为:fc=1KHz采样频率为:fs=25000Hz-用=2πf/fs把由Hz表示的待求模拟频率转换成弧度表示的数字频率,得到Wp1和Ws1。Wp1=2πfp1/fs=2π1000/25000=0.08π弧度Ws1=2πfs1/fs=2π12000/25000=0.96π弧度-进行“预畸变校正”模拟频率以避免双线性变换带来的失真。由Ω=2fstan(w/2)求得Ωp1和Ωs1,单位为弧度/秒。Ωp1=2fstan(Wp1/2)=6316.5弧度/秒Ωs1=2fstan(Ws1/2)=794727.2弧度/秒利用巴特沃斯低通滤波器的阶数计算式:Ksp=可得N=0.714所以一阶滤波器即可满足要求。因此,一阶巴特沃斯滤波器的传输函数为:H(s)=wp1/(s+wp1)=6316.5/(s+6316.5)由双线性变换定义s=2fs(z-1)/(z+1)得到数字滤波器的传输函数为:H(z)=因此差分方程为:y[n]=0.7757y[n-1]+0.1122x[n]+0.1122x[n-1]软件框图:程序流程图:开始初始化工作变量调用波形发生子函数产生混频的波形(高频和低频)调用IIR滤波子函数计算当前输出波形发生计算步长用标准的C的sin函数和cos函数计算当前波形值。返回波形值IIR滤波用滤波器系数乘以保存的N-1个输入输出值和当前输入值并求和返回计算结果硬件框图:调试过程与步骤:上机调试过程:(1)按要求进行连线,产生所需要的AB波形(2)设置CCS为硬仿真(3)打开IIR的pjg工程文件(4)选择菜单Debug-ResetCPU。(5)编译、下载程序,选择菜单Debug-GoMain,使程序运行到main函数入口位置。(6)观察窗口(7)按CTR控制板的K6键,实现滤波显示,K7键实现混频显示,按K8实现键A、B两信号源分屏显示。实验结果:软件仿真图:上机实现图:(高频和低频各自波形)(高低频混频波形)(滤波后的波形)结果分析:程序略有修改,并加上了自己的见解和注释。#includeDSP281x_Device.h//DSP281xHeaderfileIncludeFile#includeDSP281x_Examples.h//DSP281xExamplesIncludeFile#includef2812a.h#includemath.h//标准C语言的数学库头文件#defineIIRNUMBER2#defineSIGNAL1F500//低频信号#defineSIGNAL2F10000//高频信号#defineSAMPLEF25000//采样信号#definePI3.1415926floatInputWave();floatIIR();floatfBn[IIRNUMBER]={0.0,0.7757};//低通滤波器的H(Z)的系数矩阵floatfAn[IIRNUMBER]={0.1122,0.1122};floatfXn[IIRNUMBER]={0.0};//由于每一个输出的点值,需要上一个输入输出值和当前的输入值来经过H(Z)的系数矩阵的计算来得到,即通过数值计算得到滤波后的点值floatfYn[IIRNUMBER]={0.0};floatfInput,fOutput;floatfSignal1,fSignal2;//确定输入点值的初始值floatfStepSignal1,fStepSignal2;//有高低频率决定其步值floatf2PI;inti;floatfIn[256],fOut[256];//创建输入输出波形的点数,即每次所观察的波形点数intnIn,nOut;main(void){nIn=0;nOut=0;f2PI=2*PI;fSignal1=0.0;fSignal2=PI*0.1;//fStepSignal1=2*PI/30;//fStepSignal2=2*PI*1.4;fStepSignal1=2*PI/50;//模拟频率为500HZ的低频正弦波在低通滤波器的通带内fStepSignal2=2*PI/2.5;//模拟频率为10KHz的高频正弦波并未在其阻带内while(1)//在滤波器的过渡带内,故滤波演示效果没达到最佳{fInput=InputWave();fIn[nIn]=fInput;nIn++;nIn%=256;fOutput=IIR();fOut[nOut]=fOutput;nOut++;if(nOut=256){nOut=0;/*请在此句上设置软件断点*/}}}floatInputWave(){for(i=IIRNUMBER-1;i0;i--){fXn[i]=fXn[i-1];fYn[i]=fYn[i-1];}fXn[0]=sin(fSignal1)+cos(fSignal2)/6.0;//产生混合波形,其中高频噪声波的幅值为低频波得1/6,频率为低频的20倍fYn[0]=0.0;fSignal1+=fStepSignal1;if(fSignal1=f2PI)fSignal1-=f2PI;fSignal2+=fStepSignal2;if(fSignal2=f2PI)fSignal2-=f2PI;return(fXn[0]);}floatIIR(){floatfSum;//利用IIR低通滤波器的H(z)进行输入输出值的计算,从而实现滤波fSum=0.0;for(i=0;iIIRNUMBER;i++){fSum+=(fXn[i]*fAn[i]);fSum+=(fYn[i]*fBn[i]);}return(fSum);}实验频率改变后:将高频噪声的频率由10KHz变为12.5Khz,即将cos函数中参数的步值改为2*Pi/2,可以观察到更优的滤波图形如下:时域中的滤波波形变得更平滑,且从频域可以看出,噪声频率幅值很小而且频率更高!程序更改后:后来经过分析数字滤波器的滤波原理,即通过数值运算来实现滤波,发现IIR滤波子函数C语言中,应该缺少了一条语句,fYn[0]=fSum;放在return(fSum);之前。实际运行的贴图如下:滤波效果有较大提高,在输出波形的频域中可以看到,噪声的频谱被滤除了,故而验证了源程序有问题!汇编如下:IIR子程序反汇编:IIR:ADDBSP,#4MOVBAH,#0MOVBAL,#0MOVL*-SP[4],ACCMOVWDP,#0xFE00MOV@0,#0MOVAL,@0自己所编写的汇编程序:IIR的汇编子函数和实验1的汇编程序(1)IIR汇编子程序.defB1,B2,A1,X0,X1,Y0,Y1B1.set0X3D810;;H(z)的系数存放地址B2.set0X3D811;A1.set0X3D812;X0.set0X3D813;数组X[N]的首地址,依次存放X(n-1),X(n)X1.set0X3D814;由Input函数所得的X[n],并存放Y0.set0X3D815;数组Y[N]的首地址,由主函数存放Y1.set0X3D816;依次存放Y(n-1),Y(n)MOVWDP,#B1;用B1所在的页面装载DP指针;将小数化为二进制MOV@B1,#0E5Ch;B1=0.1122,B1地址中存放的数是0.1122MOV@B2,#0E5Ch;B2=0.1122,B2地址中存放的数是0.1122MOV@A1,#634Ah;A1=0.7757,A1地址中存放的数是0.7757MOVA,#0;A=0,A寄存器清零MPYP,@X0,#0E5Ch;P=B1*X(n-1)ADDA,P;A=A+PMPYP,@X1,#0E5Ch;P=B2*X(n)ADDA,P;A=A+PMPYP,@Y0,#634Ah;P=A1*Y(n-1)ADDA,P;A=A+PMOV@Y1,A;Y=B1*X(n-1)+B2*X(n)+A1*Y(n-1)RETI(2);计算z=(x-y)*w.defStartData_DP:;数据段指针x:.word1;初始化变量y:.word2w:.word3z:.word0.textStart:MOVW#Data_DP,DP;将Data_DP所在的页面