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

📄 3-10.asm

📁 《DSP嵌入式系统开发典型案例》此书的源代码
💻 ASM
字号:
				.mmregs
           		.ref     filter_start
K_DATA_SIZE 	    	.set     256           	;输入数据个数
K_BUFFER_SIZE 	.set     8				;缓冲大小,必须是大于a和b并且是2的整数次幂
K_STACK_SIZE 	.set     256			;堆栈大小
K_A             	.set     3              	;滤波器a参数的个数
K_B             	.set     4              	;滤波器b参数的个数
K_CIR           	.set    K_BUFFER_SIZE

STACK 			.usect	"stack",K_STACK_SIZE
SYSTEM_STACK  	.set 	K_STACK_SIZE+STACK

DATA_DP     		.usect "filter_vars",0
filterdata  			.usect "filter_vars",K_DATA_SIZE
bufferdatay 		.usect "filter_vars",K_BUFFER_SIZE*2
bufferdatax 		.usect "filter_vars",K_BUFFER_SIZE*2
          
           .data
           .global   inputdata

           .text
           .asg AR2,ORIGIN
           .asg AR3,INPUT
           .asg AR4,FILTER
           .asg AR5,OUTPUT
START:
           SSBX   FRCT
           SSBX   INTM
           LD     #DATA_DP,DP
           STM    #STACK,SP
           CALL   filter_start
           NOP
           NOP
           NOP
LOOP 
           B       LOOP                       

          .def    b1,b2,b3,a1,a2
          .def    filter_start
b1        .set    1456H        		;b1=0.1589 
b2        .set    3D07H        		;b2=0.4768  
b3        .set    3D07H       	 	;b3=0.4768
b4        .set    1456H       	 	;b4=0.1589 
a1        .set    -103AH      	 	;a1=-0.1268
a2        .set    430FH      	  	;a2=0.5239
a3        .set    -1016H      	 	;a3=-0.1257
          
          .text
filter_start:
          STM    #K_CIR,BK
          STM    #1,AR0               				;设置循环缓冲区大小和步长 
          STM    #inputdata,ORIGIN
          STM    #bufferdatax,INPUT
          STM    #bufferdatay,FILTER
          STM    #filterdata,OUTPUT
                                               	  	;初始化
     	 RPT    #K_A-1                             ;系数 a1,a2,a3 的个数
     	 MVDD  *ORIGIN+,*INPUT+0%       			;初始化头3 个Ys		  
     	 STM    #bufferdatax,INPUT
		  	                                  	  	;设置初始化滤波数据
     	 RPT    	#K_A-1                       	;系数a1,a2,a3的个数
     	 MVDD  *INPUT+0%,*FILTER+0%    	       		;初始化3 个Ys		  
		 STM    #bufferdatay,FILTER
          STM    #bufferdatax,INPUT
             									  	;滤波
          STM    #K_DATA_SIZE-3-1,BRC       	  	;设置块循环计数器
          RPTB   filter_end-1                      ;头3个值直接通过
          MVDD  *ORIGIN+,*INPUT         
     	 RPT    #K_B-1-1                     	  	;系数b1,b2,b3, b4的个数
     	 MAR   *INPUT-0%              		  		;调整输入到相应位置
          MPY    *INPUT+0%,#b4,B        		  	;计算B=b4*x(i) 
          LD     B,A
          MPY   *INPUT+0%,#b3,B        	       		;计算B=b3*x(i+1) 
          ADD    B,A
          MPY    *INPUT+0%,#b2,B        	       	;计算B=b2*x(i+2) 
          ADD     B,A
          MPY    *INPUT+0%,#b1,B        	       	;计算B=b1*x(i+3)
          ADD    B,A                      	       	;计算y(x+3)=A
          MPY    *FILTER+0%,#a3,B                   ;计算B=y(i)*a3
          ADD    B,A                      		  	;计算A=A+B  
          MPY    *FILTER+0%,#a2,B       			;计算B=y(i+1)*a2
          ADD    B,A                      	       	;计算A=A+B  
          MPY    *FILTER+0%,#a1,B                  	;计算B=y(i+2)*a1
          ADD    B,A                      	      	;计算y(x+3)=A+B
          STH    A,*FILTER-0%           	      	;为下一次滤波保存数据
          STH    A,*OUTPUT+       				 	;输出数据到OUTPUT的下一个单元
          MAR    *FILTER-0%       					;调整滤波器到相应位置
filter_end:  NOP     
          RET
          .end                       				 ;程序代码结束

⌨️ 快捷键说明

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