📄 fir.c.txt
字号:
;------------------------------------------------------------------
;使用MAC指令实现FIR滤波器
;-----------------------------------------------------------------
.mmergs
.include "main.inc"
;16个FIR系数
COFF_FIR_START .sect "coff_fir" ;滤波器系数
.word 6Fh
.word 0F3h
.word 269h
.word 50Dh
.word 8A9h
.word 0C99h
.word 0FF8h
.word 11EBh
.word 11EBh
.word 0EF8h
.word 0C99h
.word 8A9h
.word 50Dh
.word 269h
.word 0F3h
.word 6Fh
COFF_FIR_END
FIR_DP .usect "fir_vars",0
d_filin .usect "fir_vars",1
d_filout .usect "fir_vars",1
fir_coff_table .usect "fir_coff",20
d_data_buffer .usect "fir_bfr",40 ;滤波器缓冲区大小
.def fir_init ;初始化FIR滤波器
.def fir_task ;执行FIR滤波
;------------------------------------------------------
;下面的程序段的功能是为数据和系数初始化循环缓冲区
;------------------------------------------------------
.asg AR0,FIR_INDEX_P
.asg AR4,FIR_DATA_P
.asg AR5,FIR_COFF_P
.sect "fir_prog"
fir_init:
STM #fir_coff_table,FIR_COFF_P
RPT #K_FIR_BFFR-1 ;将FIR系数从程序区移到数据区
MVPD #COFF_FIR_START,*FIR_COFF_P+
STM #K_FIR_INDEX,FIR_INDEX_P
STM #d_data_buffer,FIR_DATA_P ;将最近的采样加载到cir_bfr地址
RPTZ A,#K_FIR_BFFR
STL A,*FIR_DATA_P+ ;复位缓冲区
STM #(d_data_buffer+KFIR_BFFR-1),FIR_DATA_P
RETD
STM #fir_coff_table,FIR_COFF_P
;-----------------------------------------------------
;下面的子程序的功能为使用MAC指令执行FIR滤波
;累加器A(滤波器输出)=h(n)*x(n-i),i=0,1,2,3.....15
;------------------------------------------------------
.asg AR6,INBUF_P
.asg AR7,OUTBUF_P
.asg AR4,FIR_DATA_P
.asg AR5,FIR_COFF_P
.sect "fir_porg"
fir_task:
LD #FIR_DP,DP
STM #K_FPAME_SIZE-1,BRC ;重复256次
RPTBD fir_filter_loop-1
STM #K_FIR_BFFR,BK ;FIR循环缓冲区大小
LD *INBUF_P+,A ;加载输入值
fir_filter:
STL A,*FIR_DATA_P+% ;
RPTZ A,(K_FIR_BFFR-1)
MAC *FIR_DATA_P+0%,FIR_COFF_P+0%,A ;
STH A,*OUTBUF_P+ ;
fir_filter_loop
RET
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -