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

📄 fft.asm

📁 tms320lf2407a 利用自带片上10位AD实现AD采样 执行FFT算法已经得到验证
💻 ASM
字号:
		.title "FFT()"
		.def 	fft
		.ref	ADCOUNT,nom,input,indatr,sintab
N		.set 		128
M		.set		7
		
		.text
		
fft:   
;   --------------------------------------
;   与C语言兼容的代码部分 
;   --------------------------------------      
		SST     #0,7Ch
        SST     #1,7Dh
		MAR		*,AR1
	   	POPD		*+   			;   存储返回地址ADDRESS
	   	SAR		AR6,*+          	;   存储 AR6
	   	SAR		AR7,*+          	;   存储 AR7
	   	SAR		AR0,*+          	;   存储 AR0
	   	SAR		AR1,*           	;   堆栈分布情况:ADDRESS/AR6/AR7/AR0/AR1
	   								;   ARP=AR1, AR1:AR1
	   	LAR		AR0,#08h           
	   	LAR		AR3,*0+,AR3   		;   AR3:FP, SP=SP+size(size=frame的长度)
	   					         	;   ARP=AR3
	   	LAR		AR2,*		     	;   AR2:AR1
        LAR		AR7,#nom		;   AR7 指向 _nom

;   -----------------------------------------
;   初始化一些寄存器
;   ----------------------------------------- 		
		SPLK	#(N-1),*+ 			
		SPLK	#(M-1),*+		          
							     ;   堆栈分布情况:ADDRESS/AR6/AR7
								 ;   /AR0/N/M/Y(其中Y为没有确定的量)
							     ;   ARP=AR3, AR2:N, AR3:Y
		SPLK	#1,*+,AR2		 ;   ID=1,ARP=AR2
							     ;   堆栈分布情况:ADDRESS/AR6/AR7/AR0/								
								 ;   N/M/ID/Y    ARP=AR2, AR2:N, AR3:
								 
	    
;   -----------------------------------------
;   FFT运算处理部分
;   -----------------------------------------									
 		SETC	OVM			      	;   使能溢出模式
		SETC	SXM				  	;   符号扩展使能
		SPM		1			        ;   PREG寄存器的输出左移一位,
									;   自动将两个Q15相乘后化为Q15的格式
		LACC	*+,AR3
		ADD		#1
		SACL	*+,1,AR2			;   IW=2*(N+1)
									;   堆栈分布情况:ADDRESS/AR6/AR7
							  	    ;   /AR0/N/M/ID/IW/Y   
									;   ARP:AR2, AR2:M, AR3:Y, 
		LAR	    AR5,*+			    ;   AR5=M,ARP:AR2, AR2:ID, 
									;   AR3:Y, AR5=M
LOOP3:	 
		LAR	 	AR6,#input 		    ;   AR6:input-->Ri ,ARP:AR2, 
									;   AR2:ID, AR3:Y, AR5=M, AR6:input  
		LACC	*,1
		SACL    *+					;   ID=ID*2,ARP:AR2,AR2:IW,
									;    AR3:Y, AR5=M, AR6:input
        LACC	*,15
        SACH	*				    ;   IW=IW/2
        LACC	*-,15,AR3
        SACH	*+,AR2		        ;   C2=IW/2
        							;   堆栈分布情况:ADDRESS/AR6/AR7/AR0/N/M/ID/IW/C2/Y
									;   ARP:AR2, AR2:ID, AR3:Y, AR5=M, AR6:input
		LAR		AR0,*			    ;   AR0=ID
LOOP2:	
		LAR		AR4,#sintab	    ;   AR4:sintab
									;  ARP:AR2,AR0=ID,AR2:ID, AR3:Y, AR4:sintab, AR5=M, AR6:input
		LACC	*+,15,AR3
		SACH	*+,AR6          	;   C1=ID/2=1
;   堆栈分布情况:ADDRESS/AR6/AR7/AR0/N/M/ID/IW/C2/C1/Y
;  ARP:AR6, AR0=ID, AR2:IW, AR3:Y, AR4:sintab, AR5=M, AR6:input
	  	MAR	*0+,AR4	
	  				
;  ARP:AR4,AR0=ID,AR2:IW,AR3:Y,AR4:sintab,AR5=M,AR6=AR6+ID-->Rj
LOOP1:	
		LACC	#0
		LT		*+,AR6                  ;   TREG=COSαlk
		MPY		*+,AR4		           ;   Rj* COSαlk,ARP=AR4,AR4:SINαlk,AR6:Ij
		LT		*,AR6
		MPYA 	*-,AR3		      ;   ACC=ACC+Rj*COSαlk, PREG=Ij*SINαlk
						      	  ;   ARP=AR3, AR4:SINαlk, AR6: Rj
		SPAC				      ;   ACC=ACC-Ij*SINαlk
		SACH    *+,AR4		      ;   XT=Rj*COSαlk-Ij*SINαlk
		
;   堆栈分布情况:ADDRESS/AR6/AR7/AR0/N/M/ID/IW/C2/C1/XT/Y
;   ARP:AR4, AR0=ID, AR2:IW, AR3:Y, AR4:SINX, AR5=M, AR6:Q.X

  		LACC	#0
  		LT		*-,AR6
  		MPY		*+,AR4			  ;   Rj*SINαlk,ARP=AR4,AR4:COSαlk,AR6:Ij
  		LT		*,AR6
  		MPYA	*-,AR3 			  ;   ACC=ACC+Rj*SINαlk, PREG=Ij*COSαlk
  								  ;   ARP=AR3, AR4:COSαlk, AR6:Rj
  		APAC	
  		SACH	*-,AR7			  ;   YT=Rj*SINαlk+Ij*COSαlk
  		
;   堆栈分布情况:ADDRESS/AR6/AR7/AR0/N/M/ID/IW/C2/C1/XT/YT
;   ARP:AR7, AR0=ID, AR2:IW, AR3:XT, AR4:COSX, AR5=M, AR6:Q.X 

		LACC	*,AR6
		BCND	D2,NEQ		       ;   当_nom不为0时,需要在运算过程中进
        

;   行归一化操作
;   ----------------------------------------
;   不进行归一化操作程序部分
;   ----------------------------------------
		MAR		*0-				  ;   AR6=AR6-ID-->Ri 
		LACC	*,AR3
		ADD		*,AR6
		SACL	*0+,AR3			  ;   Ri=Ri+XT
						    ;   ARP:AR3, AR0=ID, AR2:IW, AR3:XT, AR4:COSαlk, AR5=M, AR6:Rj
		SUB		*+,1,AR6
		SACL	*+				  ;   Rj= Ri+XT -XT*2=Ri-XT, AR6:Ij, AR3:YT
							;   ARP:AR6, AR0=ID, AR2:IW, AR3:YT, AR4:COSαlk , AR5=M, AR6:Ij
		MAR		*0-       			  ;   AR6:Ii
		LACC	*,AR3               
		ADD		*,AR6
		SACL	*0+,AR3			  ;   Ii= Ii +YT, AR6:Ij
							;   ARP:AR3, AR0=ID, AR2:IW, AR3:XT, AR4:COSαlk, AR5=M, AR6:Ij
		SUB		*-,1,AR6				
		SACL	*+,0,AR2	      ;   Ij= Ii +YT -YT*2=Ii-YT 
							;   STACK:ADDRESS/AR6/AR7/AR0/N/M/ID/IW/C2/C1/XT/YT
							;   ARP:AR2,AR0=ID,AR2:IW,AR3:XT,AR4:COSαlk,AR5=M,AR6:NEXT Ri
		B		D                    ;   AR6 指向下一个Ri
;   ---------------------------------------
;   归一化处理程序部分
;   ---------------------------------------
D2:		MAR		*0-				  ;   AR6-->Ri
		LAC		*,15,AR3
		ADD		*,15,AR6				
		SACH	*0+,AR3			   ;   Ri =( Ri +XT)/2
								   ;   ARP:AR3, AR0=ID, AR2:IW, AR3:XT, AR4:COSαlk, AR5=M, AR6:Rj	
	    SUB		*+,16,AR6
		SACH	*+				   ;   Rj=Ri-XT, AR6:Ij, AR3:YT
								   ;  ARP:AR6, AR0=ID, AR2:IW, AR3:YT, AR4:COSαlk, AR5=M, AR6:Ij
		MAR		*0-				   ;   AR6:Ii
		LACC	*,15,AR3
		ADD		*,15,AR6
		SACH	*0+,AR3            ;   Ii=(Ii+YT)/2, AR6:Ij
								   ;  ARP:AR3, AR0=ID, AR2:IW, AR3:YT, AR4:COSαlk, AR5=M, AR6:Ij
		SUB		*-,16,AR6
		SACH	*+,AR2		   ;   Ij=Ii-YT
							;   STACK:ADDRESS/AR6/AR7/AR0/N/M/ID/IW/C2/C1/XT/YT
							;   ARP:AR2,AR0=ID,AR2:IW,AR3:XT,AR4:COSαlk,AR5=M   ar6R:下一个Ri
D:		
		LAR		AR0,*-,AR4		    ;   AR0=IW
							;  ARP=AR4, AR0=IW, AR2:ID, AR3:XT, AR4:COSαlk, AR5=M,AR6NEXT Ri
		MAR		*0+,AR2			    ;   AR4=AR4+IW-->下一个COSαlk
		LAR		AR0,*			    ;   AR0=ID
		ADRK	#3				    ;   AR2:C1
							;  ARP=AR2, AR0=ID, AR2:C1, AR3:XT, AR4: 下一个COSαlk, AR5=M  AR6:Ri
	    LACC	*
	    SUB		#1
	    SACL	*-					    ;   C1=C1-1
							;   ARP=AR2, AR0=ID, AR2:C2, AR3:XT, AR4:COSαlk, AR5=M, AR6:Ri
	   	BCND	LOOP4,LEQ		    ;   跳转至LOOP4, IF C1<0
	   	MAR		*-,AR4			    ;   AR2:IW
							;   ARP=AR4, AR0=ID, AR2:IW, AR3:XT, AR4: 下一个COSαlk, AR=M  AR6:Ri
	   	B		LOOP1                


LOOP4:	
		LACC	*
		SUB		#1
		SACL	*-,AR3
		MAR     *-,AR2				
							;   ARP=AR2, AR0=ID, AR2:IW, AR3:C1, AR4: 下一个COSαlk, AR5=M, AR6:Ri
		MAR		*-
        BCND	LOOP2,GT
        MAR     *,AR3
        MAR		*-,AR5              
							;   ARP=AR5, AR0=ID, AR2:IW, AR3:C2, AR4下一个COSαlk, AR5=M, AR6:Ri
        BANZ	LOOP3,*-,AR2
;   ------------------------------------
;   与C语言兼容的代码部分
;   ------------------------------------
	    CLRC	OVM
	    SPM		0           
        MAR		*,AR1
        SBRK	#09
        LAR		AR0,*-
        LAR		AR7,*-
        LAR		AR6,*-
        PSHD	*
        LDP   #0
		LST   #1,7Dh
		LST   #0,7Ch
        RET

⌨️ 快捷键说明

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