📄 iir.c.txt
字号:
;四阶椭圆低通IIR滤波器
.mmregs
.include "main.inc"
iir_table_star .sect "iir_coff"
;第一个二阶基本节系数
.word -26778 ;a2
.word 29529 ;a1/2,对大于1的系数定标
.word 19381 ;b2
.word -23184 ;b1
.word 19381 ;b0
;第二个二阶基本节系数
.word -30497 ;a2
.word 31131 ;a1/2,对大于1的系数定标
.word 11363 ;b2
.word -20735 ;b1
.word 11363 ;b0
iir_table_end
iir_coff_table .usect "coff_iir",16
iir_d .usect "iir_vars",3*2
iir_y .usect "iir_vars",1
.def iir_init
.def iir_task
;初始化程序:用于初始化数据缓冲区和系数缓冲区
.sect "iir"
iir_init: STM #iir_coff_table,AR1 ;AR1指向iir_coff_table
RPT #K_IIR_SIZE-1 ;将系数移到数据存储器
MVPD #iir_table_start,*AR1+
STM #iir_d,AR2 ;AR2指向iir_d
RPTZ A,*AR2+ ;使w(n),w(n-1),w(n-2)为0
;IIR滤波器处理程序
.sect "iir"
iir_task STM #in_buf,AR3 ;AR3指向采样数据入口
STM #out_buf.AR4 ;AR4指向数据输出口
STM #K_FRAME_SIZE-1,BRC ;设置采样点的个数
RPTB iir_filter_loop-1 ;由采样点的个数进行滤波
LD *AR3+,8,A ;装载输入数据x(n)
iir_filter STM #iir_d+5,AR2 ;AR2指向w(n),w(n-1),w(n-2)
STM #iir_coff_table,AR1 ;AR1指向a2,a1/2,b2,b1,b0
STM #K_BIQUD-1,AR0 ;设定二阶基本节的个数
feedback_path: MAC *AR1+,*AR2-,A ;A=x(n)+a2*w(n-2)
MAC *AR1,*AR2,A ;A=x(n)+a2*w(n-2)+a1*w(n-1)/2
MAC *AR1+,*AR2-,A ;A=x(n)+a2*w(n-2)+a1*w(n-1)
STH A,*AR2+ ;w(n)=x(n)+a2*w(n-2)+a1*w(n-1)
MAR *AR2+
forward_path: MPY *AR1+,*AR2-,A ;A=b2*w(n-2)
MAC *AR1+,*AR2,A ;A=b2*w(n-2)+b1*w(n-1)
DELAY *AR2- ;w(n-2)=w(n-1)
eloop: BANZD feedback_path,*AR0- ;二阶基本节未计算完,则循环
MAC *AR1+,AR2,A ;A=b2*w(n-2)+b1*w(n-1)+b0*w(n)
DELAY *AR2- ;w(n-1)=w(n)
STH A,iir_y
LD iir_y,2,A ;定标输出数据
STL A,*AR4+ ;存储滤波结果y(n)
iir_filter_loop: RET
.end
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -