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

📄 cplxfft32b.s

📁 Mplab C30编译器
💻 S
📖 第 1 页 / 共 2 页
字号:
			MOV		[w12--],[w10--]			

			MOV		[w13++],w2				; (w2,w3)=(Pi3-Pi4)/4
			MOV		[w13--],w3				
;---------------------------------
;---------------------------------	  
;---------- (Pi1,Pi3)
			LAC		[++w8],B				; B=(Pi1+Pi2)/4	
			MOV		[--w8],[w13]
			
			LAC		[++w10],A				; A=(Pi3+Pi4)/4	
			MOV		[--w10],[w12]

			ADD		A						; A=(Pi1+Pi2+Pi3+Pi4)/4
	
			SFTAC	B,#-1
			SUB		B						; B=(Pi1+Pi2-Pi3-Pi4)/4

			MOV		[w12++],[W8++]			; Pi1=(Pi1+Pi2+Pi3+Pi4)/4
			MOV		[w12--],[w8--]			

			MOV		[w13++],[W10++]			; Pi3=(Pi1+Pi2-Pi3-Pi4)/4
			MOV		[w13--],[w10--]			  

;---------- (Pr1,Pr3)
			LAC		[--w8],B				; B=(Pr1+Pr2)/4	
			MOV		[--w8],[w13]
			
			LAC		[--w10],A				; A=(Pr3+Pr4)/4	
			MOV		[--w10],[w12]

			ADD		A						; A=(Pr1+Pr2+Pr3+Pr4)/4
	
			SFTAC	B,#-1
			SUB		B						; B=(Pr1+Pr2-Pr3-Pr4)/4

			MOV		[w12++],[W8++]			; Pr1=(Pr1+Pr2+Pr3+Pr4)/4
			MOV		[w12--],[w8--]			

			MOV		[w13++],[W10++]			; Pr3=(Pr1+Pr2-Pr3-Pr4)/4
			MOV		[w13--],[w10--]			  

;---------- (Pi2,Pi4)
			LAC		[++w9],B				; B=(Pi1-Pi2)/4	
			MOV		[--w9],[w13]
			
			LAC		w1,A					; A=(Pr3-Pr4)/4	
			MOV		w0,[w12]

			ADD		A						; A=(Pi1-Pi2+Pr3-Pr4)/4
	
			SFTAC	B,#-1
			SUB		B						; B=(Pi1-Pi2-Pr3+Pr4)/4

			MOV		[w13++],[W9++]			; Pi2=(Pi1-Pi2-Pr3+Pr4)/4
			MOV		[w13--],[w9--]			

			MOV		[w12++],[W11++]			; Pi4=(Pi1-Pi2+Pr3-Pr4)/4
			MOV		[w12--],[w11--]			  

;----------(Pr2,Pr4)
			LAC		[--w9],B				; B=(Pr1-Pr2)/4	
			MOV		[--w9],[w13]
			
			LAC		w3,A					; A=(Pi3-Pi4)/4	
			MOV		w2,[w12]

			ADD		A						; A=(Pr1-Pr2+Pi3-Pi4)/4
	
			SFTAC	B,#-1
			SUB		B						; B=(Pr1-Pr2-Pi3+Pi4)/4

			MOV		[w12++],[W9++]			; Pr2=Pr1-Pr2+Pi3-Pi4)/4
			MOV		[w12--],[w9--]			

			MOV		[++w13],[--W11]			; Pr4=(Pr1-Pr2-Pi3+Pi4)/4
			MOV		[--w13],[--w11]			  	

	.endm



; Local Stack Frame
;............................................................................
;   |_______|
;   |_______|<- Stack Pointer                          	SP 
;   |_______|<- Buffer Pointer			                FP+18
;   |_______|<- Wr Pointer								FP+16
;   |_______|<- Wi Pointer                           	FP+14 
;   |_______|<- Stage Counter				            FP+12
;   |_______|<- Block Counter			                FP+10
;   |_______|<- Butterfly Counter		                FP+8
;   |_______|<- Block INDEX     						FP+6
;   |_______|<- Butterfly INDEX	              			FP+4
;   |_______|<- Temp                               		FP                                              
;............................................................................

	.equ	BUF_PTR,	18
	.equ	WR_PTR,		16
	.equ	WI_PTR,		14
	.equ	STG_CNTR,   12
	.equ 	BLK_CNTR,   10
	.equ	BFL_CNTR,   8
	.equ 	BLK_INDX, 	6
	.equ	BFL_INDX,  	4
	.equ	TEMP,		0
 

;............................................................................
; Complex FFT Calculation
;............................................................................
_FFTComplex32bIP:
;............................................................................
; Context Save
			PUSH.D	w8						; {w8,w9} to TOS
			PUSH.D	w10						; {w10,w11} to TOS
			PUSH.D	w12						; {w12,w13} to TOS
			PUSH	CORCON
			PUSH	PSVPAG
			LNK     #20
;............................................................................
;;	PSVPAG = __builtin_psvpage(&twiddleFactor);
;;	CORCONbits.PSV = 1;	
			MOV		w3,PSVPAG
			BSET	CORCON,#2

; Store Input Parameters
			MOV		w1,[w14+BUF_PTR]	
			MOV		w2,[w14+WI_PTR]			; Wi = SIN(*)
			MOV		#TF_FFT_SIZE,W8
			ADD		w2,w8,w2
			MOV		w2,[W14+WR_PTR]			; Wr = COS(*)
			MOV		w0,[w14+STG_CNTR]
	

			MOV		#ACCAL,w12
			MOV		#ACCBL,w13

; Stage 1 to 2 unrolled for cycle efficiency
;............................................................................ 
			MOV		w1,w8
			ADD		w1,#8,w9
			ADD		w1,#16,w10
			ADD		w1,#24,w11
                                                                                        
     
			MOV		#1,w2		
			SL		w2,w0,w2				; N = 1<<logN2
			LSR		w2,#2,w2
			DEC		w2,w2

            MOV     #32,w0        			; w0=32
			MOV		w0,[w14+BFL_INDX]  

; Loop over butterflies in a block
;............................................................................
			DO      w2,STG12_END         
STG12_START:  

			STG12_MACRO
			MOV		[w14+BFL_INDX],w0
			ADD		w8,w0,w8				; Next Data Set
			ADD		w9,w0,w9				; Next Data Set
			ADD		w10,w0,w10				; Next Data Set
STG12_END:	ADD		w11,w0,w11				; Next Data Set
 ;............................................................................


; Stage 3 to LOG2N 
;............................................................................ 
; Butterfly counter for each block, Block counter for each stage and Stage Counter
; Block Index between P & Q inputs of Butterfly for Stage 3
; Twiddle Index for stage 3  
	
			MOV		#4,w0
			MOV		w0,[w14+BFL_CNTR]		; BFL_CNTR=4
			MOV		[w14+STG_CNTR],w1
			MOV		#1,w2		
			SL		w2,w1,w2				; N = 1<<logN2
			LSR		w2,#3,w2				; N/8
			MOV		w2,[w14+BLK_CNTR]		; BLK_CNTR=N/8	
		
			MOV		#(TF_FFT_SIZE/2),w2		
			MOV		w2,[w14+BFL_INDX]

			MOV		#32,w0
			MOV		w0,[w14+BLK_INDX]

			SUB		w1,#2,w1				; STG_CNTR=STG_CNTR-1
			MOV		w1,[w14+STG_CNTR]	


; Stage 1 to LOG2N 
;............................................................................ 
;			MOV		#1,w0
;			MOV		w0,[w14+BFL_CNTR]		; BFL_CNTR=1
;			MOV		[w14+STG_CNTR],w1
;			MOV		#1,w2		
;			SL		w2,w1,w2				; N = 1<<logN2
;			LSR		w2,#1,w2				; N/2
;			MOV		w2,[w14+BLK_CNTR]		; BLK_CNTR=N/2
;
;			MOV		#(TF_FFT_SIZE*2),w2		
;			MOV		w2,[w14+BFL_INDX]
;
;			MOV		#8,w0
;			MOV		w0,[w14+BLK_INDX]

	
; Loop over stages
;............................................................................
STG_START:                        
			MOV		[w14+BUF_PTR],w8		; Next Butterfly Block (Pr)
			MOV		[w14+BLK_INDX],w9	
			ADD		w8,w9,w9				; Next Butterfly Block (Qr)


			MOV		[w14+BLK_CNTR],w0		; Block loop count
			DEC 	w0,w0


; Loop over blocks in a stage
;............................................................................
			DO      w0,BLK_END
BLK_START:	
			MOV		[w14+WR_PTR],w10		; Initialise Twiddle Factor (Wr) pointer
			MOV		[w14+WI_PTR],w11		; Initialisae Twiddle Factor (Wi) pointer
			MOV		[w14+BFL_CNTR],w0		; Butterfly loop count
			DEC 	w0,w0
; Loop over butterflies in a block
;............................................................................
			DO      w0,BFL_END       
BFL_START:  
			BFLY_MACRO
			MOV		[w14+BFL_INDX],w0
			ADD		w10,w0,w10				; Next Twiddle Factor (Wr)
BFL_END:	ADD		w11,w0,w11				; Next Twiddle Factor (Wi)
;............................................................................            
			MOV		[w14+BLK_INDX],w0
			ADD		w8,w0,w8				; Next Butterfly Block (Pr)
BLK_END:	ADD		w9,w0,w9				; Next Butterfly Block(Qr)
 
;............................................................................      
			ADD		W14,#BFL_INDX,W0


			LAC		[w0],#1,A				; BFL_INDX = BFL_INDX/2
			SAC		A,[w0++]

			LAC		[w0],#-1,A				; BLK_INDX = BLK_INDX * 2
			SAC		A,[w0++]	



			LAC		[w0],#-1,A				; BFL_CNTR = BFL_CNTR * 2
			SAC		A,[w0++]	

			LAC		[w0],#1,A				; BLK_CNTR = BLK_CNTR/2
			SAC		A,[w0++]
			
			DEC		[w0],[w0]				; STG_CNTR = STG_CNTR - 1
			BRA     NZ,STG_START        
	
;............................................................................
; Context Restore
			ULNK
			POP		PSVPAG
			POP		CORCON
			POP.D	w12						; {w12,w13} from TOS
			POP.D	w10						; {w10,w11} from TOS
			POP.D	w8						; {w8,w9} from TOS
;............................................................................
			RETURN	

⌨️ 快捷键说明

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