fir.c.txt
来自「用C54X汇编语言实现的FIR滤波器程序」· 文本 代码 · 共 71 行
TXT
71 行
;------------------------------------------------------------------
;使用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 + =
减小字号Ctrl + -
显示快捷键?