⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 fir.asm

📁 dsp实现的FIR滤波器
💻 ASM
字号:
;一个FIR滤波器源程序  fir.asm

			.mmregs	;定义存储器映射寄存器的符号名,
					;这样就可以用AR0、PMST等助记符替换实际的存储器地址。
			.global start					;定义符号名
			.def  	start,_c_int00
			     				
INDEX 		.set 	1						;定义符号常量
KS			.set  	256 					;模拟输入数据缓冲区大小

N           .set    17 		            	
COFF_FIR	.sect  "COFF_FIR"				;FIR滤波器系数
			;
			;.word  0
			;.word  158
			;.word  264
			;.word  -290
			;.word  -1406
			;.word  -951
			;.word  3187
			;.word  9287
			;.word  12272
			;.word  9287
			;.word  3187
			;.word  -951
			;.word  -1406
			;.word  -290
			;.word  260
			;.word  158
			;.word  0
			;
			
			;;;;;;;;;;;
			.word  0
			.word  1
			.word  2
			.word  3
			.word  4
			.word  5
			.word  6
			.word  7
			.word  8
			.word  9
			.word  10
			.word  11
			.word  12
			.word  13
			.word  14
			.word  15
			.word  16
			;;;;;;;;;;
			
			
		    .data                          ;紧跟其后的是已初始化数据,.int或.word
INPUT	    .copy  	"firin.inc"            ;模拟输入在数据存储区0x2400。将指定数据复制到当前位置。
OUTPUT		.space	1024                   ;输出数据在数据区0x2500。以位为单位,空出n位存储空间。

;FIR_DP		.usect	"FIR_VARS",0
;D_FIN		.usect	"FIR_VARS",1
;D_FOUT		.usect	"FIR_VARS",1          

COFFTAB	    .usect	"FIR_COFF",N			;为未初始化变量保留存储空间的自定义段。
DATABUF		.usect	"FIR_BFR",N
BOS			.usect	"STACK",0Fh
TOS			.usect	"STACK",1 

			.text               ;源程序正文。
			
			.asg	AR0,INDEX_P ;定义替代符号。
			.asg	AR4,DATA_P	;输入数据x(n)循环缓冲区指针
			.asg	AR5,COFF_P	;FIR系数表指针
			.asg 	AR6,INBUF_P ;模拟输入数据指针
		 	.asg	AR7,OUTBUF_P;FIR滤波器输出数据指针
_c_int00
		b start 
		nop
		nop
start:  rsbx   FRCT
        ;ssbx  FRCT                  ;小数乘法编程时,设置小数方式位。
	
		STM 	#COFFTAB,COFF_P
		RPT 	#N-1 				;将FIR系数从程序存储器移动
		MVPD	#COFF_FIR,*COFF_P+	;到数据存储器
		
		STM		#INDEX,INDEX_P	
		STM		#DATABUF,DATA_P
		RPTZ	A,#N-1
		STL		A,*DATA_P+			;将数据循环缓冲区清零
		
		STM		#(DATABUF+N-1),DATA_P ;数据缓冲区指针指向x[n-(N-1)]
		STM		#COFFTAB,COFF_P		;系数表指针指向h(0)
FIR_TASK:
        STM		#INPUT,INBUF_P		;模拟输入数据指针指向第一个值。
        STM 	#OUTPUT,OUTBUF_P    ;FIR滤波器输出数据指针指向第一个输出。
        STM		#KS-1,BRC           ;定义块循环次数。
        RPTBD	LOOP-1         ;延时块循环命令,紧跟其后的一个两字节指令或两个单字节指令在块循环之前先执行。
        STM		#N,BK				;FIR循环缓冲区大小。BK:循环缓冲区大小,MMR。
        LD		*INBUF_P+,A			;装载输入数据
FIR_FILTER:
 		STL		A,*DATA_P+%         ;寻址结束后,ARx中的地址按循环加的方法加1。
 		RPTZ	A,N-1
 		MAC		*DATA_P+0%,*COFF_P+0%,A ;寻址结束后,按循环加的方法吧AR0的值加到ARx中。
 		;STH		A,*OUTBUF_P+
 		STL		A,*OUTBUF_P+
LOOP:
EEND	B 	EEND
 		.end
				

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -