?? 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 + -