1、实验无限冲激响应滤波器IIR算法实验实验 3 : 无限冲激响应滤波器(IIR)算法实验一、实验目的1. 熟悉IIR 数字滤波器特性;2.掌握IIR数字滤波器的设计过程;3.掌握 IIR 数字滤波器性能测试方法。二、实验设备1.PC 兼容机2.WIN7 操作系统3.Code Composer Studio v5 三、实验内容1.掌握IIR数字滤波器的基础理论;2.基于MATLAB的IIR数字滤波器参数确定方法; 3.采用C语言编程实现低通 IIR 滤波器;4.掌握基于CCS的波形观察方法;观察滤波前后的波形变化。四实验原理分析要求:使用低通巴特沃斯滤波器,设计通带截止频率fp为1kHz、增益为-
2、3dB,阻带截止频率fst为12kHz、衰减为30dB,采样频率fs为25kHz。设计:通带截止频率为: fp = 1000Hz, fst = 12000Hz(一)、滤波器参数计算 模拟预畸变通带截止频率为: wp = 2fstan(2fp/(2fs) = 6316.5 弧度/秒 模拟预畸变阻带截止频率为:wst = 2fstan(2fst/(2fs) = 794727.2 弧度/秒 N = 0.714,则:一阶巴特沃斯滤波器就足以满足要求。一阶模拟巴特沃斯滤波器的传输函数为: H(s)=wp/(s+wp)=6316.5/(s+6316.5)由双线性变换定义 s=2fs(z-1)/(z+1)得
3、到数字滤波器的传输函数为:因此,差分方程为: yn=0.7757yn-1+0.1122xn+0.1122xn-1。(二)、基于MATLAB的滤波器参数求解(1)IIR数字滤波器阶次的选择的MATLAB函数N,wc = buttord(wp,wst,Rp,As);N,wc = cheb1ord(wp,wst,Rp,As);N,wc = cheb2ord(wp,wst,Rp,As);N,wc = ellipord(wp,wst,Rp,As);对低通滤波器,必须有wp wst对带通滤波器,必须有 ws1 wp1 wp2 ws2对带阻滤波器,必须有 wp1 ws1 ws2 Graph-Dual Tim
4、e,进行如下设置:Dual Time 参数设置*选择菜单 Tools-Graph-FFT Magnitude, 新建 2 个观察窗口,分别进行如下设置:5.设置断点:在有注释“break point”的语句设置软件断点。使用菜单的 View-Break points,打开断点观察窗口,在刚才设置的断点上右键-Breadk point properties 调出断点的属性设置界面,设置 Action 为 Refresh All windows。则程序每次运行到断点,所有的观察窗口值都会被刷新。其中,输入波形:一个低频正弦波与一个高频正弦波的叠加;输出波形:经过低通滤波后的低频正弦波。6运行并观察
5、结果: F8 键运行程序。 观察“IIR”窗口中时域图形;观察滤波效果。7退出 CCS六.实验结果输入波形为一个低频率的正弦波与一个高频的余弦波叠加而成。如图:通过观察频域和时域图,得知:输入波形中的低频波形通过了滤波器,而高频部分则被衰减。六问题与思考基本任务:1.试微调(0.0001)改变程序中 fU 的取值,观察步长因子在自适应算法中所起的作用。2.确定程序中的信号频率,试选用设计不同的信号、噪声组合,基于MATLAB设计不同的类型的滤波器,并基于CCS实现,并观察实验的结果。3.分析实验程序,细化算法流程图。4.结合CCS的使用,分析实验结果提高任务:5.尝试使用信号源生成组合信号,经
6、过A/D采样后,送IIR滤波器实现。源代码:#includemath.h#define IIRNUMBER 2 /*典范性的滤波器阶数*/#define SIGNAL1F 1000 /*正弦信号频率,代码中没有使用*/#define SIGNAL2F 4500 /*正弦信号频率,代码中没有使用*/#define SAMPLEF 10000 /*采样频率,代码中没有使用*/#define PI 3.1415926float InputWave(); /*输入给IIR滤波器的信号,每次输出一个点*/float IIR(); /*IIR滤波,每次输出一个点*/*滤波器的设计采用了案例的结果,应该重新
7、设计*/float fBnIIRNUMBER= 0.0,0.7757 ; /*IIR滤波器的分子多项式系数,有错*/float fAnIIRNUMBER= 0.1122,0.1122 ; /*IIR滤波器的分母多项式系数*/float fXnIIRNUMBER= 0.0 ; /*IIR滤波器的迭代初始值*/float fYnIIRNUMBER= 0.0 ; /*IIR滤波器的输出值*/float fInput,fOutput; /*输入点和输出点*/float fSignal1,fSignal2; /*信号1、2的初始相位*/float fStepSignal1,fStepSignal2; /
8、*信号1、2的相位步长*/float f2PI;int i;float fIn256,fOut256;int nIn,nOut;main() 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; /*信号1的相位步长:f1/fs = 1/50*/ fStepSignal2=2*PI/2.5; /*信号2的相位步长:f1/fs = 1/2.5*/ while ( 1 ) fInput=InputWa
9、ve(); fInnIn=fInput; nIn+; nIn%=256; fOutput=IIR(); fOutnOut=fOutput; nOut+; /* 请在此句上设置软件断点 */ if ( nOut=256 ) nOut=0; float InputWave() for ( i=IIRNUMBER-1;i0;i- ) fXni=fXni-1; fYni=fYni-1; fXn0=sin(fSignal1)+cos(fSignal2)/6.0; fYn0=0.0; fSignal1+=fStepSignal1; if ( fSignal1=f2PI ) fSignal1-=f2PI; fSignal2+=fStepSignal2; if ( fSignal2=f2PI ) fSignal2-=f2PI; return(fXn0);float IIR() float fSum; fSum=0.0;/* yn=0.7757yn-1+0.1122xn+0.1122xn-1 */ for ( i=0;iIIRNUMBER;i+ ) fSum+=(fXni*fAni); fSum+=(fYni*fBni); return(fSum);