📄 iir2.asm
字号:
*************************************
*用双操作数指令实现二阶IIR滤波器 *
*反馈通道:x0=w(n)=x(n)+A1*x1+A2*x2 *
*前向通道:y(n)=B0*x0+B1*x1+B2*x2 *
*************************************
.title "IIR2.asm"
.mmregs
.def start
x2 .usect "x",1
x1 .usect "x",1
x0 .usect "x",1
COEF .usect "COEF",5
indata .usect "buffer",1
outdata .usect "buffer",1
*PA0 .set 10
*PA1 .set 1
.data
table .word 0 ;x(n-1)
.word 0 ;x(n-2)
.word 676*32768/10000 ;B2=0.1
.word 1352*32768/10000 ;B1=0.2
.word 676*32768/10000 ;B0=0.3
.word -4142*32768/10000 ;A2=0.5
.word 707*32768/10000 ;A1=-0.4
.text
start: SSBX FRCT
STM #x2,AR1
RPT #1
MVPD #table,*AR1+
STM #indata,AR5
STM #outdata,AR2
STM #COEF,AR1
RPT #4
MVPD #table+2,*AR1+
STM #x2,AR3
STM #COEF+4,AR4 ;AR4-->A1
MVMM AR4,AR1 ;保存地址值在AR1中
STM #3,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*x1
MAC *AR3+0%,*AR4-,A ;A=x(n)+A1*x1+A1*x1
MAC *AR3+0%,*AR4-,A ;A=x(n)+2*A1*x1+A2*x2
STH A,*AR3 ;保存x0
MPY *AR3+0%,*AR4-,A ;计算前向通道,A=B0*x0
MAC *AR3+0%,*AR4-,A ;A=B0*x0+B1*x1
MAC *AR3,*AR4-,A ;B=B0*x0+B1*x1+B2*x2=y(n)
STH A,*AR3 ;保存y(n)
MVMM AR1,AR4 ;AR4重新指向A1
BD IIR2 ;循环
; PORTW *AR3,PA0 ;向PA0口输出数据
MVDD *AR3,*AR2
nop
.end
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -