📄 fir.asm
字号:
.mmregs
.global begin
K_FIR_INDEX .set 1 ;索引计数器
K_FIR_BFFR .set 37 ;FIR缓冲器大小
K_FRAME_SIZE .set 256 ;一帧数据大小
.data
OUTPUT .space K_FRAME_SIZE*16
INPUT .copy firinput2.txt
;36阶FIR滤波器系数
COFF_FIR_START .sect "COFF_FIR" ;输入FIR滤波器系数
.word -79
.word -101
.word 0
.word 179
.word 255
.word 68
.word -306
.word -524
.word -250
.word 443
.word 974
.word 664
.word -566
.word -1831
.word -1718
.word 652
.word 4734
.word 8635
.word 10240
.word 8653
.word 4734
.word 652
.word -1718
.word -1831
.word -566
.word 664
.word 974
.word 443
.word -250
.word -524
.word -306
.word 68
.word 255
.word 179
.word 0
.word -101
.word -79
COFF_FIR_END
;STACK .usect "STACK",20h ;allocate space for stack
FIR_DP .usect "FIR_VARS",0
D_FILIN .usect "FIR_VARS",1
D_FILOUT .usect "FIR_VARS",1
FIR_COFF .usect "FIR_COFF",20
D_DATA_BUFFER .usect "FIR_BFR",40 ;滤波器缓冲器大小
.def FIR_INIT ;初始化FIR滤波器
.def FIR_TASK ;执行FIR滤波程序
; .include "init_c54.inc"
.text
;功能说明:下面这段程序对输入数据和滤波器系数的循环缓冲器
;大小进行初始化
.asg AR0,FIR_INDEX_P
.asg AR4,FIR_DATA_P
.asg AR5,FIR_COFF_P
begin:
; CALL init_54
FIR_INIT:
STM #FIR_COFF,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 ;装载最新的采样值地址
RPTZ A,#K_FIR_BFFR
STL A,*FIR_DATA_P+ ;使缓冲器复位
STM #(D_DATA_BUFFER+K_FIR_BFFR-1),FIR_DATA_P
STM #FIR_COFF,FIR_COFF_P
;功能说明:下面这段程序完成FIR滤波功能
;累加器A的内容(即滤波器输出数据)=H(N)*X(N-1) FOR i=0,1,...36
.asg AR6,INBUF_P
.asg AR7,OUTBUF_P
.asg AR4,FIR_DATA_P
.asg AR5,FIR_COFF_P
FIR_TASK:
STM #INPUT,INBUF_P
STM #OUTPUT,OUTBUF_P
STM #K_FRAME_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;FIR滤波
STH A,*OUTBUF_P+ ;代替最旧的缓冲器的值
FIR_FILTER_LOOP
EEND: B EEND
;init_54:
; STM #K_SWWSR,SWWSR
; STM #K_BSCR,BSCR
; STM #K_ST0,ST0
; STM #K_ST1,ST1
; RETD
; STM #K_PMST,PMST
.end
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -