实验四IIR滤波器的DSP实现思考题:对照参考程序,编写实现四阶或更高阶数的低通、高通、带通、带阻IIR 数字滤波器的DSP程序并仿真。
提示:滤波器系数一般通过MATLAB仿真得到。
4阶低通:.title "IIR.asm".mmregs.def startx4 .usect "x",1x3 .usect "x",1x2 .usect "x",1x1 .usect "x",1x0 .usect "x",1COEF .usect "COEF",9Indata .usect "buffer",1outdata .usect "buffer",1*PA0 .set 10*PA1 .set 1.datatable.word 0 ;x(n-1).word 0 ;x(n-2).word 0;x(n-3).word 0;x(n-4).word 0 ;分子系数B3=0.word 15*32768/10000;B3=0.0015.word 78*32768/10000;分子系数B2=0.0078.word 25*32768/10000 ;分子系数B1=0.0025.word 0;分子系数B0=0.word 3783*32768/10000;分母系数A4=0.3783.word -6258*32768/10000 ;分母系数A3=-1.8776/3.word 88705*32768/100000 ;分母系数A2=3.5482/4.word -826775*32768/1000000;分母系数A1=-3.0372/4.textstart: SSBX FRCTSTM #x4,AR1RPT #3MVPD #table,*AR1+STM #indata,AR5STM #outdata,AR2STM #COEF,AR1RPT #8MVPD #table+2,*AR1+STM #x2,AR3STM #COEF+9,AR4;AR4-->A1MVMM AR4,AR1 ;保存地址值在AR1中STM #5,BK ;设置循环缓冲区长度STM #-1,AR0 ;设置变址寻址步长IIR2: ;PORTR PA1,*AR3;从PA1口输入数据x(n)MVDD *AR5,*AR3 ;在这里设置断点与探针LD *AR3+0%,16,A;计算反馈通道,A=x(n)MAC *AR3,*AR4,A;A=x(n)+A1*x1MAC *AR3,*AR4,A;A=x(n)+2A1*x1MAC *AR3,*AR4,A;A=x(n)+3A1*x1MAC *AR3+0%,*AR4-,A;A=x(n)+3*A1*x1+A1*x1MAC *AR3+0%,*AR4-,A ;A=x(n)+4*A1*x1+A2*x2MAC *AR3,*AR4,A;A=x(n)+4*A1*x1 +2*A2*x2MAC *AR3,*AR4,A;A=x(n)+4*A1*x1 +3*A2*x2MAC *AR3+0%,*AR4-,A ;A=x(n)+4*A1*x1+4*A2*x2MAC *AR3+0%,*AR4-,A;A=x(n)+4*A1*x1+4*A2*x2+A3*x3MAC *AR3,*AR4,A;A=x(n)+4*A1*x1+4*A2*x2+2*A3*x3MAC *AR3+0%,*AR4-,A ;A=x(n)+4*A1*x1+4*A2*x2+3*A3*x3MAC *AR3+0%,*AR4-,A ;A=x(n)+4*A1*x1+4*A2*x2+2*A3*x3+A4*x4 STH A,*AR3 ;保存x0MPY *AR3+0%,*AR4-,A;计算前向通道,A=B0*x0MAC *AR3+0%,*AR4-,A;A=B0*x0+B1*x1MAC *AR3+0%,*AR4-,A ;A=B0*x0+B1*x1+B2*x2MAC *AR3,*AR4-,A;B=B0*x0+B1*x1+B2*x2+B3*x3=y(n)STH A,*AR3 ;保存y(n)MVMM AR1,AR4 ;AR4重新指向A1BD IIR2 ;循环; PORTW *AR3,PA0;向PA0口输出数据MVDD *AR3,*AR2 ;在这里设置断点与探针nop.end高通:*用双操作数指令实现二阶高通IIR滤波器**反馈通道:x0=w(n)=x(n)+A1*x1+A2*x2+A3*x3+A4*x4 前向通道:y(n)=B0*x0+B1*x1+B2*x2+B3*x3+B4*x4 *.title "IIR2.asm".mmregs.def startx4 .usect "x",1x3 .usect "x",1x2 .usect "x",1x1 .usect "x",1x0 .usect "x",1COEF .usect "COEF",9indata .usect "buffer",1outdata .usect "buffer",1*PA0 .set 10*PA1 .set 1.datatable .word 0.word 0.word 0.word 0.word 0.word 2754*32768/10000 ;分子系数B4=0.2754.word -551*32768/1000;分子系数B3/2=-0.551.word 413*32768/1000 ;分子系数B2/4=0.413.word -551*32768/1000;分子系数B1/2=-0.551.word 2754*32768/10000 ;分子系数B0=0.2754.word -762*32768/10000;分母系数A4=-0.0762.word 7415*32768/10000 ;分母系数A3=0.4844.word -319*32768/1000;分母系数A2/4=-0.319.word 3925*32768/10000 ;分母系数A1/4=0.3925.textstart: SSBX FRCTSTM #x4,AR1RPT #4MVPD #table,*AR1+STM #indata,AR5STM #outdata,AR2STM #COEF,AR1RPT #8MVPD #table+5,*AR1+STM #COEF+8,AR4;AR4-->A1MVMM AR4,AR1 ;保存地址值在AR1中STM #5,BK ;设置循环缓冲区长度STM #-1,AR0 ;设置变址寻址步长STM #x4,AR3IIR2: ;PORTR PA1,*AR3 ;从PA1口输入数据x(n) MVDD *AR5,*AR3 ;在这里设置断点与探针LD *AR3+0%,16,A;计算反馈通道,A=x(n)RPT #2MAC *AR3,*AR4,A;3*A1*x1 ???MAC *AR3+0%,*AR4-,A ;A=x(n)+4*A1*x1RPT #2MAC *AR3,*AR4,A;4*A2*x2 ???MAC *AR3+0%,*AR4-,A ;A=x(n)+4*A1*x1+5*A2*x2MAC *AR3+0%,*AR4-,A;A=x(n)+4*A1*x1+5*A2*x2+4*A3*x3MAC *AR3+0%,*AR4-,A;A=x(n)+4*A1*x1+5*A2*x2+4*A3*x3+A4*x4STH A,*AR3 ;保存x0MPY *AR3+0%,*AR4-,A;计算前向通道,A=B0*x0MAC *AR3,*AR4,A ;3*B1*x1MAC *AR3+0%,*AR4-,A ;A=B0*x0+4*B1*x1RPT #2MAC *AR3,*AR4,A;4*A2*x2 ???MAC *AR3+0%,*AR4-,A ;A=B0*x0+4*B1*x1+5*B2*x2MAC *AR3,*AR4,A ;3*B3*x3MAC *AR3+0%,*AR4-,A;A=B0*x0+4*B1*x1+5*B2*x2+4*B3*x3MAC *AR3,*AR4,A;B=A=B0*x0+4*B1*x1+5*B2*x2+4*B3*x3+B4*x4=y(n)STH A,*AR3 ;保存y(n)MVMM AR1,AR4 ;AR4重新指向A1BD IIR2 ;循环; PORTW *AR3,PA0;向PA0口输出数据MVDD *AR3,*AR2 ;在这里设置断点与探针nop.end带阻:.title "IIR2.asm".mmregs.def startx4 .usect "x",1x3 .usect "x",1x2 .usect "x",1x1 .usect "x",1x0 .usect "x",1COEF .usect "COEF",9indata .usect "buffer",1outdata .usect "buffer",1*PA0 .set 10*PA1 .set 1.datatable .word 0.word 0.word 0.word 0.word 0.word 8004*32768/10000 ;分子系数B4=0.8004.word -6475*32768/10000;分子系数B3/4=-0.6475.word 924*32768/1000 ;分子系数B2/4=0.924.word -6475*32768/10000;分子系数B1/4=-0.6475.word 8004*32768/10000 ;分子系数B0=0.8004.word -6411*32768/10000;分母系数A4=-0.6411.word 575*32768/1000 ;分母系数A3/4=0.575.word -914*32768/1000;分母系数A2/4=-0.914.word 7202*32768/10000 ;分母系数A1/4=0.7202.textstart: SSBX FRCTSTM #x4,AR1RPT #4MVPD #table,*AR1+STM #indata,AR5STM #outdata,AR2STM #COEF,AR1RPT #8MVPD #table+5,*AR1+STM #COEF+8,AR4;AR4-->A1MVMM AR4,AR1 ;保存地址值在AR1中STM #5,BK ;设置循环缓冲区长度STM #-1,AR0 ;设置变址寻址步长STM #x4,AR3IIR2: ;PORTR PA1,*AR3;从PA1口输入数据x(n)MVDD *AR5,*AR3 ;在这里设置断点与探针LD *AR3+0%,16,A;计算反馈通道,A=x(n)RPT #2MAC *AR3,*AR4,A;3*A1*x1MAC *AR3+0%,*AR4-,A ;A=x(n)+4*A1*x1RPT #2MAC *AR3,*AR4,A;3*A2*x2 ???MAC *AR3+0%,*AR4-,A ;A=x(n)+4*A1*x1+4*A2*x2 RPT #2MAC *AR3,*AR4,A;3*A3*x3 ???MAC *AR3+0%,*AR4-,A ;A=x(n)+A1*x1+4*A2*x2+4*A3*x3MAC *AR3+0%,*AR4-,A;A=x(n)+A1*x1+4*A2*x2+4*A3*x3+A4*x4STH A,*AR3 ;保存x0MPY *AR3+0%,*AR4-,A;计算前向通道,A=B0*x0RPT #2MAC *AR3,*AR4,A;3*B1*x1 ???MAC *AR3+0%,*AR4-,A ;A=B0*x0+4*B1*x1RPT #2MAC *AR3,*AR4,A;3*B2*x2 ???MAC *AR3+0%,*AR4-,A ;A=B0*x0+4*B1*x1+4*B2*x2 RPT #2MAC *AR3,*AR4,A;3*B3*x3 ???MAC *AR3+0%,*AR4-,A;A=B0*x0+4*B1*x1+4*B2*x2+4*B3*x3MAC *AR3,*AR4,A;B=A=B0*x0+B1*x1+B2*x2+B3*x3+B4*x4=y(n)STH A,*AR3 ;保存y(n)MVMM AR1,AR4 ;AR4重新指向A1BD IIR2 ;循环; PORTW *AR3,PA0;向PA0口输出数据MVDD *AR3,*AR2 ;在这里设置断点与探针nop.end带通:.title "IIR2.asm".mmregs.def startx4 .usect "x",1x3 .usect "x",1x2 .usect "x",1x1 .usect "x",1x0 .usect "x",1 COEF .usect "COEF",9 indata .usect "buffer",1 outdata .usect "buffer",1 *PA0 .set 10*PA1 .set 1.datatable .word 0.word 0.word 0.word 0.word 0.word 201*32768/10000 ;分子系数B4=0.0201.word 0*32768/10000;分子系数B3=0.word -402*32768/10000 ;分子系数B2=-0.0402.word 0*32768/10000;分子系数B1=0.word 201*32768/10000 ;分子系数B0=0.0201.word -6411*32768/10000;分母系数A4=-0.6411.word 575*32768/10000 ;分母系数A3/4=0.575.word -914*32768/1000;分母系数A2/4=-0.914.word 7202*32768/10000 ;分母系数A1=0.7202.textstart: SSBX FRCTSTM #x4,AR1RPT #4MVPD #table,*AR1+STM #indata,AR5STM #outdata,AR2STM #COEF,AR1RPT #8MVPD #table+5,*AR1+STM #COEF+8,AR4;AR4-->A1MVMM AR4,AR1 ;保存地址值在AR1中STM #5,BK ;设置循环缓冲区长度STM #-1,AR0 ;设置变址寻址步长STM #x4,AR3IIR2: ;PORTR PA1,*AR3;从PA1口输入数据x(n)MVDD *AR5,*AR3 ;在这里设置断点与探针LD *AR3+0%,16,A;计算反馈通道,A=x(n)MAC *AR3+0%,*AR4-,A ;A=x(n)+A1*x1RPT #2MAC *AR3,*AR4,A;3*A2*x2 ???MAC *AR3+0%,*AR4-,A;A=x(n)+4*A1*x1+4*A2*x2RPT #2MAC *AR3,*AR4,A ;3*A3*x3MAC *AR3+0%,*AR4-,A;A=x(n)+A1*x1+4*A2*x2+4*A3*x3MAC *AR3+0%,*AR4-,A;A=x(n)+A1*x1+4*A2*x2+4*A3*x3+A4*x4STH A,*AR3 ;保存x0MPY *AR3+0%,*AR4-,A ;计算前向通道,A=B0*x0MAC *AR3+0%,*AR4-,A ;A=B0*x0+B1*x1MAC *AR3+0%,*AR4-,A ;A=B0*x0+B1*x1+B2*x2MAC *AR3+0%,*AR4-,A;A=B0*x0+B1*x1+B2*x2+B3*x3MAC *AR3,*AR4,A;B=A=B0*x0+B1*x1+B2*x2+B3*x3+B4*x4=y(n)STH A,*AR3 ;保存y(n)MVMM AR1,AR4 ;AR4重新指向A1BD IIR2 ;循环; PORTW *AR3,PA0;向PA0口输出数据MVDD *AR3,*AR2 ;在这里设置断点与探针nop.end。