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

📄 fft.asm

📁 2407DSP开发应用程序实例(有14个常用模块程序)
💻 ASM
字号:
;-------------------------------------------------------------------------------------------------
;重庆大学DSP实验室
;函数名:void fft(void)
;功能:实现32、64或128采样点的快速傅立叶变换
;入口条件:Q15	
;	_sintab	存放FFT运算中用到的sin
;			和cosin函数值	
;	_input	存放FFT运算中用到的数据,
;			包括实部和虚部,按二进制
;			反序排列
;			注意:由于“*BR0+”间接寻
;			址方式对_input的地址有特殊
;			的要求,所以最好将数组_input
;			放置在一个独立的块中,如B1块。
;	_nom	当_nom=0时,本函数将不对运算
;			结果进行归一化。反之,将对每
;			一步运算结果进行归一化处理,
;			避免溢出,但是,它会使运算精度降低。
;	N		常数,参与FFT运输的点数,用户
;			可根据需要选择,例如,需要进行
;			128点FFT时,请在本函数中做出如
;			下选择:
;				N	.set	128
;				M	.set	7
;			依此类推。
;出口条件:Q15
;	_input		存放FFT的运算结果
;本函数可供C调用,请用户在C主程序前作以下声明:
;	extern	void fft(void);
;	const	int sintab[N]={...};		N为128、64或32
;	extern	int _input[2*N];
;	extern	int nom;
;程序员:冼成瑜
;2002.3.24
;--------------------------------------------------------------------------------------------------



		.def	_fft

;128 points DIT Radix-2 complex FFT
;N		.set	128					;number of points
;M		.set	7   				;N=2**M
;64 points DIT Radix-2 complex FFT
;N		.set	64                  ;number of points
;M		.set	6                   ;N=2**M
;32 points DIT Radix-2 complex FFT  
N		.set	32                  ;number of points
M		.set	5                   ;N=2**M

_input	.usect  ".usect",2*N    ;INPUT DATA        
;		.bss	_sintab,N			;SIN AND COSIN TABLE				
		.bss	_nom,1              ;WHEN _nom=1, FFT IMPLEMENT NORMALIZATION
		.global	_fft
		.global	_sintab
		.global	_input 
		.global _nom
_adresult	.usect ".ad",16
		.global _adresult
		
		.text     
_fft:   
;--------------------------------------
;C COMPATIBLE
;--------------------------------------
	   	POPD	*+   				;STORE RETURN ADDRESS
	   	SAR		AR6,*+              ;STORE AR6
	   	SAR		AR7,*+              ;STORE AR7
	   	SAR		AR0,*+              ;STORE AR0
	   	SAR		AR1,*               ;STACK:ADDRESS/AR6/AR7/AR0/AR1
	   								;ARP=AR1, AR1:AR1
	   	LAR		AR0,#08h           
	   	LAR		AR3,*0+,AR3         ;AR3:FP, SP=SP+size of frame
	   								;ARP=AR3
	   	LAR		AR2,*		        ;AR2:AR1
	   	LAR		AR7,#_nom			;AR7 POINT TO _nom
;-----------------------------------------
;INITIALIZING AUTO REGISTER
;----------------------------------------- 		
		SPLK	#(N-1),*+ 			;N=127
		SPLK	#(M-1),*+		    ;M=6  
									;STACK:ADDRESS/AR6/AR7/AR0/N/M/Y
									;ARP=AR3, AR2:N, AR3:Y
		SPLK	#1,*+,AR2			;ID=1
									;STACK:ADDRESS/AR6/AR7/AR0/N/M/ID/Y
									;ARP=AR2, AR2:N, AR3:
;-----------------------------------------
;IMPLEMENTATION OF FFT
;-----------------------------------------									
		SETC	OVM					;OVERFLOW MODE ENABLE
		SETC	SXM					;SIGN EXTENTION
		SPM		1					;PREG OUTPUT SHIFT 1
		LACC	*+,AR3
		ADD		#1
		SACL	*+,1,AR2			;IW=2*(N+1)=256
									;STACK:ADDRESS/AR6/AR7/AR0/N/M/ID/IW/Y
									;ARP:AR2, AR2:M, AR3:Y, 
		LAR		AR5,*+				;AR5=M=6		
		                            ;ARP:AR2, AR2:ID, AR3:Y, AR5=M
FFT3	LAR		AR6,#_input 		;AR6:input-->P.X    
									;ARP:AR2, AR2:ID, AR3:Y, AR5=M, AR6:input
		LACC	*,1
		SACL    *+					;ID=ID*2=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
        							;STACK:ADDRESS/AR6/AR7/AR0/N/M/ID/IW/C2/Y
        							;ARP:AR2, AR2:ID, AR3:Y, AR5=M, AR6:input
		LAR		AR0,*				;AR0=ID
FFT2	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
									;STACK: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-->Q.X
FFT1	LACC	#0
		LT		*+,AR6              ;TREG=COSX
		MPY		*+,AR4				;Q.X*COSX
									;ARP=AR4, AR4:SINX, AR6:Q.Y
		LT		*,AR6
		MPYA	*-,AR3				;ACC=ACC+Q.X*COSX, PREG=Q.Y*SINX
									;ARP=AR3, AR4:SINX, AR6:Q.X
		SPAC						;ACC=ACC-Q.Y*SINX
		SACH    *+,AR4				;XT=Q.X*COSX-Q.Y*SINX
						            ;STACK: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				;Q.X*SINX
  									;ARP=AR4, AR4:COSX, AR6:Q.Y
  		LT		*,AR6
  		MPYA	*-,AR3 				;ACC=ACC+Q.X*SINX, PREG=Q.Y*COSX
  									;ARP=AR3, AR4:COSX, AR6:Q.X
  		APAC	
  		SACH	*-,AR7				;YT=Q.X*SINX+Q.Y*COSX
  									;STACK: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	FFT6,NEQ			;NORMALIZATION WHEN _nom ISN'T ZERO
;----------------------------------------
;DON'T NORMALIZATION
;----------------------------------------


		MAR		*0-					;AR6=AR6-ID-->P.X 
		LACC	*,AR3
		ADD		*,AR6
		SACL	*0+,AR3				;P.X=P.X+XT
									;ARP:AR3, AR0=ID, AR2:IW, AR3:XT, AR4:COSX, AR5=M, AR6:Q.X
		SUB		*+,1,AR6
		SACL	*+					;Q.X=P.X-XT*2, AR6:Q.Y, AR3:YT
									;ARP:AR6, AR0=ID, AR2:IW, AR3:YT, AR4:COSX, AR5=M, AR6:Q.Y
		MAR		*0-       			;AR6:P.Y
		LACC	*,AR3               
		ADD		*-,AR6
		SACL	*0+,AR3				;P.Y=P.Y+YT, AR6:Q.Y
									;ARP:AR3, AR0=ID, AR2:IW, AR3:XT, AR4:COSX, AR5=M, AR6:Q.Y
		SUB		*,1,AR6				
		SACL	*+,0,AR2			;Q.Y=P.Y-YT*2 
									;STACK:ADDRESS/AR6/AR7/AR0/N/M/ID/IW/C2/C1/XT/YT
									;ARP:AR2, AR0=ID, AR2:IW, AR3:XT, AR4:COSX, AR5=M, AR6:NEXT Q.X
		B		FFT5                   ;AR6 POINT TO NEXT Q.X
;---------------------------------------
;NORMALIZATION
;---------------------------------------
FFT6	MAR		*0-					;AR6-->P.X
		LAC		*,15,AR3
		ADD		*,15,AR6				
		SACH	*0+,AR3				;P.X=(P.X+XT)/2
									;ARP:AR3, AR0=ID, AR2:IW, AR3:XT, AR4:COSX, AR5=M, AR6:Q.X
		SUB		*+,16,AR6
		SACH	*+					;Q.X=P.X-XT, AR6:Q.Y, AR3:YT
									;ARP:AR6, AR0=ID, AR2:IW, AR3:YT, AR4:COSX, AR5=M, AR6:Q.Y
		MAR		*0-					;AR6:P.Y
		LACC	*,15,AR3
		ADD		*,15,AR6
		SACH	*0+,AR3             ;P.Y=(P.Y+YT)/2, AR6:Q.Y
									;ARP:AR3, AR0=ID, AR2:IW, AR3:YT, AR4:COSX, AR5=M, AR6:Q.Y
		SUB		*-,16,AR6
		SACH	*+,0,AR2			;Q.Y=P.Y-YT
									;STACK:ADDRESS/AR6/AR7/AR0/N/M/ID/IW/C2/C1/XT/YT
									;ARP:AR2, AR0=ID, AR2:IW, AR3:XT, AR4:COSX, AR5=M, AR6:NEXT Q.X

FFT5	LAR		AR0,*-,AR4			;AR0=IW
									;ARP=AR4, AR0=IW, AR2:ID, AR3:XT, AR4:COSX, AR5=M, AR6:NEXT Q.X
		MAR		*0+,AR2				;AR4=AR4+IW-->NEXT COSX
		LAR		AR0,*				;AR0=ID
		ADRK	#3					;AR2:C1
									;ARP=AR2, AR0=ID, AR2:C1, AR3:XT, AR4:NEXT COSX, AR5=M, AR6:Q.X
	    LACC	*
	    SUB		#1
	    SACL	*-					;C1=C1-1
	   								;ARP=AR2, AR0=ID, AR2:C2, AR3:XT, AR4:COSX, AR5=M, AR6:Q.X
	   	BCND	FFT4,LEQ			;JUMP FFT4, IF C1<0
	   	MAR		*-,AR4				;AR2:IW
	   	                            ;ARP=AR4, AR0=ID, AR2:IW, AR3:XT, AR4:NEXT COSX, AR5=M, AR6:Q.X
	   	B		FFT1                
FFT4	LACC	*
		SUB		#1
		SACL	*-,AR3
		MAR     *-,AR2				;ARP=AR2, AR0=ID, AR2:IW, AR3:C1, AR4:NEXT COSX, AR5=M, AR6:P.X
		MAR		*-
        BCND	FFT2,GT
        MAR     *,AR3
        MAR		*-,AR5              ;ARP=AR5, AR0=ID, AR2:IW, AR3:C2, AR4:NEXT COSX, AR5=M, AR6:P.X
        BANZ	FFT3,*-,AR2
;------------------------------------
;C COMPATIBLE
;------------------------------------
		CLRC	OVM
		SPM		0           
        MAR		*,AR1
        SBRK	#09
        LAR		AR0,*-
        LAR		AR7,*-
        LAR		AR6,*-
        PSHD	*
        RET
	

		
									
		
		
		
					
		


		
		
		 


⌨️ 快捷键说明

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