DSP试验汇报软件试验1无限冲激响应滤波器(IIR)算法一.试验目的1.掌握设计IIR数字滤波器的原理和措施。2.熟悉IIR数字滤波器特性。3.理解IIR数字滤波器的设计措施。二.试验设备PC兼容机一台,操作系统为Windows(或Windows98,WindowsXP,如下默认为Windows),安装CodeComposerStudio2.21软件。三.试验原理1.无限冲激响应数字滤波器的基础理论。2.模拟滤波器原理(巴特沃斯滤波器、切比雪夫滤波器、椭圆滤波器、贝塞尔滤波器)。3.数字滤波器系数确实定措施。4.根据规定设计低通IIR滤波器:规定:低通巴特沃斯滤波器在其通带边缘1kHz处的增益为-3dB,12kHz处的阻带衰减为30dB,采样频率25kHz。设计:-确定待求通带边缘频率fp1Hz、待求阻带边缘频率fs1Hz和待求阻带衰减-20logδsdB。模拟边缘频率为:fp1=1000Hz,fs1=1Hz阻带边缘衰减为:-20logδs=30dB-用Ω=2πf/fs把由Hz表达的待求边缘频率转换成弧度表达的数字频率,得到Ωp1和Ωs1。Ωp1=2πfp1/fs=2π1000/25000=0.08π弧度Ωs1=2πfs1/fs=2π1/25000=0.96π弧度-计算预扭曲模拟频率以防止双线性变换带来的失真。由w=2fstan(Ω/2)求得wp1和ws1,单位为弧度/秒。wp1=2fstan(Ωp1/2)=6316.5弧度/秒ws1=2fstan(Ωs1/2)=794727.2弧度/秒-由已给定的阻带衰减-20logδs确定阻带边缘增益δs。由于-20logδs=30,因此logδs=-30/20,δs=0.03162-计算所需滤波器的阶数:因此,一阶巴特沃斯滤波器就足以满足规定。-一阶模拟巴特沃斯滤波器的传播函数为:H(s)=wp1/(s+wp1)=6316.5/(s+6316.5)由双线性变换定义s=2fs(z-1)/(z+1)得到数字滤波器的传播函数为:因此,差分方程为:y[n]=0.7757y[n-1]+0.1122x[n]+0.1122x[n-1]。5.程序流程图:四.试验环节1.试验准备:-设置软件仿真模式-启动CCS2.打动工程,浏览程序,工程目录为C:\ICETEK\VC5416AES61\VC5416AES61\Lab0502-IIR\IIR.pjt。3.编译并下载程序。4.打开观测窗口:*选择菜单View->Graph->Time/Frequency…进行如下图所示设置。*选择菜单View->Graph->Time/Frequency…,进行如下设置:5.清除显示:在以上打开的窗口中单击鼠标右键,选择弹出式菜单中“CleAeDisplay”功能。6.设置断点:在程序iir.c中有注释“breakpoint”的语句上设置软件断点。7.运行并观测成果:⑴选择“Debug”菜单的“Animate”项,或按F12键运行程序。⑵观测“IIR”窗口中时域图形;观测滤波效果。8.退出CCS五.试验成果输入波形为一种低频率的正弦波与一种高频的余弦波叠加而成。如图:通过观测频域和时域图,得知:输入波形中的低频波形通过了滤波器,而高频部分则被衰减。试验代码:#include#defineIIRNUMBER2#defineSIGNAL1F1000#defineSIGNAL2F4500#defineSAMPLEF10000#definePI3.1415926floatInputWave();floatIIR();floatfBn[IIRNUMBER]={0.0,0.7757};floatfAn[IIRNUMBER]={0.1122,0.1122};floatfXn[IIRNUMBER]={0.0};floatfYn[IIRNUMBER]={0.0};floatfInput,fOutput;floatfSignal1,fSignal2;floatfStepSignal1,fStepSignal2;floatf2PI;inti;floatfIn[256],fOut[256];intnIn,nOut;main(){nIn=0;nOut=0;fInput=fOutput=0;f2PI=2*PI;fSignal1=0.0;fSignal2=PI*0.1;//fStepSignal1=2*PI/30;//fStepSignal2=2*PI*1.4;fStepSignal1=2*PI/50;fStepSignal2=2*PI/2.5;while(1){fInput=InputWave();fIn[nIn]=fInput;nIn++;nIn%=256;fOutput=IIR();fOut[nOut]=fOutput;nOut++;//breakpointif(nOut>=256){nOut=0;}}}floatInputWave(){for(i=IIRNUMBER-1;i>0;i--){fXn[i]=fXn[i-1];fYn[i]=fYn[i-1];}fXn[0]=sin((double)fSignal1)+cos((double)fSignal2)/6.0;fYn[0]=0.0;fSignal1+=fStepSignal1;if(fSignal1>=f2PI)fSignal1-=f2PI;fSignal2+=fStepSignal2;if(fSignal2>=f2PI)fSignal2-=f2PI;return(fXn[0]);}floatIIR(){floatfSum;fSum=0.0;for(i=0;i