1、实验六 IIR滤波器一、 实验目的1. 熟悉IIR滤波器C54X实现的编程方法。2. 测试IIR滤波器的单位冲击响应曲线。3. 检查IIR滤波器的频率特性。二、 实验条件1. 已经设计出四阶IIR滤波器的参数如下:通带:0-200Hz过渡带宽:200Hz-500Hz通带内波动:0.5dB阻带衰减:-20dB采样频率Fs:3600Hz脉冲传递函数H(z): Hz=B0+B1Z-1+B2Z-2+B3Z-3+B4Z-41-A1Z-1-A2Z-2-A3Z-3-A4Z-4差分方程式为: y(n)=B0*x(n)+B1*x(n-1)+B2*x(n-2)+B3*x(n-3)+B4*x(n-4)+A1*y(n
2、-1)+A2*y(n-2)+A3*y(n-3)+A4*y(n-4) 其中:A1=-3.4647 A2=4.4615 A3=-2.8518 A4=0.6739 B0=0.0951 B1=-0.3139 B2=0.4460 B3=-0.3139 B4=0.0951生成正弦数据文件的高级语言程序。程序名为sin_flt.exe。2. 直接形式二阶IIR滤波器程序Lab6.asm以及链接命令文件Lab6.cmd。三、 实验内容1. 消化直接形式二阶滤波器程序iir3.asm以及链接命令文件iir3.cmd。2. 修改Lab6.asm。定义循环缓冲区:Y(n-4)X(n-4)X: Y: Y(n-3)X(
3、n-3)Y(n-2)X(n-2)Y(n-1)X(n-1)Y(n)X(n) AR2AR4A4B4 B: A:A3B3A2B2A1B1A0B0 AR5AR3相应的汇编命令为:X .usect X,5Y .usect Y,5B .usect B,5A .usect A,5修改系数表:初始值y(n-4)- y(n-1)以及x(n-4)- x(n-1)均设置为0。凡绝对值1的系数需化成绝对值1的系数。这样,系数表示为:.word 3116 ;B4=0.0951.word -10286 ;B3=-0.3139.word 14615 ;B2=0.4460.word -10286 ;B1=-0.3139.wo
4、rd 3116 ;B0=0.0951.word -22082 ;A4=-0.6739.word 31149 ;A3/3=2.8518/3.word -30484 ;A2/5=-4.6515/5.word 28383 ;A1/4=3.4647/4修改传送x的初始值、y的初始值、系数B、系数A的重复次数,分别为3、3、4、3。修改传送数据的起始地址:传送x MVPD #table,*AR1+传送y MVPD #table+4,*AR1+传送B MVPD #table+8,*AR1+传送A MVPD #table+13,*AR1+修改BK寄存器,BK=5。为循环缓冲区设初始指针:AR2 X+4 AR
5、4 Y+4AR5 B+4 AR3 A+4由于归一化成绝对值小于1的系数,因此反馈通道运算必须作相应的修正。对输入数据文件中的数据定标,右移4位,以防止运算中溢出。3. 修改Lab.cmd文件。将X、Y、B、A的循环缓冲区均改为align(8)。4. 汇编和链接5. 测试本实验IIR滤波器的单位冲击响应曲线6. 检查本实验IIR滤波器的频率特性曲线四、 实验程序;*;* lab6.ASM IIR Filter * ;* .title lab6.asm .mmregs .def start .bss in,1 ;给in分配一个存储单元 .bss out,1X .usect X,5 ;定义X的缓冲区
6、域Y .usect Y,5B .usect B,5A .usect A,5PA0 .set 0 ;I/O口地址赋值PA1 .set 1 .datatable: .word 0 ;X(N-4) ;为标号table开始的存储单元赋初值 .word 0 ;X(N-3) .word 0 ;X(N-2) .word 0 ;X(N-1) .word 0 ;Y(N-4) .word 0 ;Y(N-3) .word 0 ;Y(N-2) .word 0 ;Y(N-1) .word 3116 ;B4=0.0951 .word -10286 ;B3=-0.3139 .word 14615 ;B2=0.4460 .w
7、ord -10286 ;B1=-0.3139 .word 3116 ;B0=0.0951 .word -22082 ;A4=-0.6739 .word 31149 ;A3/3=2.8518/3 .word -30484 ;A2/5=-4.6515/5 .word 28383 ;A1/4=3.4647/4 .textstart: SSBX FRCT STM #X,AR1 ;AR1指向X的首地址 RPT #3 ;重复执行下条语句3次 MVPD #table,*AR1+ ;从table首址重复传递4个数据 STM #Y,AR1 RPT #3 MVPD #table+4,*AR1+ STM #B,AR
8、1 RPT #4 MVPD #table+8,*AR1+ STM #A,AR1 RPT #3 MVPD #table+13,*AR1+ STM #X+4,AR2 ;为循环缓冲区设初始指针 STM #Y+3,AR4 STM #B+4,AR5 STM #A+3,AR3 STM #5,BK ;将5赋值给BK STM #-1,AR0 ;将-1赋值给AR0STM #1000h,AR6 ;输出数据缓冲区首址为#1000hSTM #0200h-1,AR7 ;循环计算512个样本点LOOP: PORTR PA1,*AR2 ;x(n)/2,防止溢出;MVKD in,*AR2 LD *AR2,A ;将AR2的地址
9、加载到A累加器 STL A,-1,*AR2 ;A累加器低位右移1位送往AR2寄存器所指地址 MPY *AR2+0%,*AR5+0%,A ;作B0*X(n)+A=A运算,并将地址减一 MAC *AR2+0%,*AR5+0%,A MAC *AR2+0%,*AR5+0%,A MAC *AR2+0%,*AR5+0%,A MAC *AR2,*AR5+0%,A MAC *AR4,*AR3,A ;作A1/4*Y(n-1) MAC *AR4,*AR3,A MAC *AR4,*AR3,A MAC *AR4+0%,*AR3+0%,A ;运算四次后将寄存器地址减一 MAC *AR4,*AR3,A ; 作A2/5*Y
10、(n-2) MAC *AR4,*AR3,A MAC *AR4,*AR3,A MAC *AR4,*AR3,A MAC *AR4+0%,*AR3+0%,A ;运算五次后将寄存器地址减一 MAC *AR4,*AR3,A ;作 A3/3*Y(n-3) MAC *AR4,*AR3,A MAC *AR4+0%,*AR3+0%,A ;运算三次后将寄存器地址减一 MAC *AR4+0%,*AR3+0%,A ;作 A4*Y(n-4) MAR *AR3+0% STH A,*AR4 ;A累加器高位送往AR4寄存器所指地址 ;BD IIR;MVDK *AR4,out PORTW *AR4,PA0 ;输出y(n)STH A,*AR6+ ;保存y(n) BANZ LOOP,*AR7 ;循环512次-end B end .END五、 实验结果IIR滤波器的单位冲击响应曲线IIR滤波器的频率特性曲线(低通)六、 实验体会实验中了解到了程序中的运算数都是定点小数,所以大于一的系数要作小数处理;学习了如何编写数据文件,定义I/O端口的GEL参数,将数据文件与I/O口地址相关联;如何查看频率响应及幅频特性曲线。