📄 exp3d_iir.asm
字号:
;----------------------------------------------
;
; exp3d_IIR.asm
;
; 4th Order IIR filter
;
;----------------------------------------------
MASK .set 0xFFFF
.def _iir4
.def _init_iir4
;
; Original coefficients 0-1800Hz 4th order IIR LPF
; with sampling frequency 8000Hz
;
; int b[5]={0.0072, 0.00287, 0.0431, 0.0287, 0.0072};
; int a[5]={1.0000, -2.16860,2.0097,-0.8766, 0.1505};
;
.data
; Q13 formatted coefficients
;
coeff ; b0, b1, b2, b3, b4
.word 0x003B&MASK, 0x00EB&MASK
.word 0x0161&MASK, 0x00EB&MASK, 0x003B&MASK
; -a1, -a2, -a3, -a4
.word 0x4564&MASK, -0x404F&MASK
.word 0x1C0D&MASK, -0x04D1&MASK
.bss x,5 ; x delay line
.bss y,4 ; y delay line
.text
_init_iir4
pshboth XAR5
nop
nop
nop
amov #x,XAR5
rpt #4
mov #0,*AR5+
amov #y,XAR5
rpt #3
mov #0,*AR5+
popboth XAR5
ret
;
; 4th Order IIR filter
; Entry T0 = sample
; Exit T0 = filtered sample
;
_iir4
pshboth XAR5
pshboth XAR6
bset SATD
bset SXM
amov #x,XAR5
amov #y,XAR6
amov #coeff,XCDP
bset FRCT
|| mov T0,*AR5 ; x[0] = indata
;
; Perform IIR filter
;
mpym *AR5+,*CDP+,AC0 ; AC0=x[0]*bn[0]
|| rpt #3 ; i=1,2,3,4
macm *AR5+,*CDP+,AC0 ; AC0+=x[i]*bn[i]
rpt #3 ; i=0,1,2,3
macm *AR6+,*CDP+,AC0 ; AC0+=y[i]*an[i]
amov #y+2,XAR5
amov #y+3,XAR6
sfts AC0,#2 ; Scale to Q15 format
|| rpt #2
mov *AR5-,*AR6- ; Update y[]
mov hi(AC0),*AR6
|| mov hi(AC0),T0 ; Return y[0] in T0
amov #x+3,XAR5
amov #x+4,XAR6
bclr FRCT
|| rpt #3
mov *AR5-,*AR6- ; Update x[]
popboth XAR6
popboth XAR5
bclr SXM
bclr SATD
|| ret
.end
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -