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

📄 fft_pgm.asm

📁 用于DSK5416的程序
💻 ASM
字号:
;_______________________________________________________________________
;
; Program Name: FFT8.asm
;
; Description:  This program implements an 8-point DIT FFT algorithm.  
;
; Author:       Avtar Singh, SJSU
;
;_______________________________________________________________________

        .mmregs
        .def _c_int00	
	
        .data
;-----------------------------------------------------------------------     
;  Transformed data
;-----------------------------------------------------------------------     

X0R     .word 0                 ; Real part of X0
X0I     .word 0                 ; Imag part of X0		
X1R     .word 0                 ; Real part of X1
X1I     .word 0                 ; Imag part of X1
X2R     .word 0                 ; Real part of X2
X2I     .word 0                 ; Imag part of X2
X3R     .word 0                 ; Real part of X3
X3I     .word 0                 ; Imag part of X3
X4R     .word 0                 ; Real part of X4
X4I     .word 0                 ; Imag part of X4
X5R     .word 0                 ; Real part of X5
X5I     .word 0                 ; Imag part of X5
X6R     .word 0                 ; Real part of X6
X6I     .word 0                 ; Imag part of X6
X7R     .word 0                 ; Real part of X6
X7I     .word 0                 ; Imag part of X7

;-----------------------------------------------------------------------     
; Input data. It should be replaced with the actual data for which
; the FFT is to be computed
;-----------------------------------------------------------------------

x0      .word 0
x1      .word 23170
x2      .word 32767
x3      .word 23170
x4      .word 0
x5      .word -23170
x6      .word -32767
x7      .word -23170

;-----------------------------------------------------------------------     
; Twiddle Factors (q15 numbers)
;-----------------------------------------------------------------------     

W08R    .word  32767            ; cos(0)
W08I    .word  0                ; -sin(0)
W18R    .word  23170            ; cos(pi/4)
W18I    .word  -23170           ; -sin(pi/4)
W28R    .word  0                ; cos(pi/2)
W28I    .word  -32767           ; -sin(pi/2)
W38R    .word  -23170           ; cos(3pi/4)
W38I    .word  -23170           ; -sin(3pi/4)

;-----------------------------------------------------------------------     
; Spectrum Data
;-----------------------------------------------------------------------     

S0      .word 0                 ; S0 = Freq 0.fs/8 contents
S1      .word 0                 ; S1 = Freq 1.fs/8 contents
S2      .word 0                 ; S2 = Freq 2.fs/8 contents
S3      .word 0                 ; S3 = Freq 3.fs/8 contents
S4      .word 0                 ; S4 = Freq 4.fs/8 contents
S5      .word 0                 ; S5 = Freq 5.fs/8 contents
S6      .word 0                 ; S6 = Freq 6.fs/8 contents
S7      .word 0                 ; S7 = Freq 7.fs/8 contents

;-----------------------------------------------------------------------     
; Butterfly scratch-pad locations
;-----------------------------------------------------------------------     

TMP1    .word 0
TMP2    .word 0


        .text
;-----------------------------------------------------------------------     
;
; Main Program 
; This program computes 8-point DFT using DIT FFT algorithm.
; It also computes signal spectrum using the transformed data.
;
;-----------------------------------------------------------------------   	

_c_int00:	
        SSBX	SXM             ; Select sign extension mode
        CALL _clear             ; Clear FFT data locations	   
        CALL _bitrev            ; Get bit-reversed input data

	   
; STAGE 1 Butterflies:

; Call BUTTERFLY with AR = X0R, AI = X0I, BR = X1R, BI = X1I 
; Replace X0R, X0I, X1R, X1I
   	
        STM  #X0R, AR1
        STM  #X1R, AR2
        STM  #W08R, AR3
        CALL _butterfly

; Call BUTTERFLY with AR = X2R, AI = X2I, BR = X3R, BI = X3I 
; Replace X2R, X2I, X3R, X3I 
   
        STM  #X2R, AR1
        STM  #X3R, AR2
        STM  #W08R, AR3
        CALL _butterfly

; Call BUTTERFLY with AR = X4R, AI = X4I, BR = X5R, BI = X5I 
; Replace X4R, X4I, X5R, X5I

        STM  #X4R, AR1
        STM  #X5R, AR2
        STM  #W08R, AR3
        CALL _butterfly

; Call BUTTERFLY with AR = X6R, AI = X6I, BR = X7R, BI = X7I 
; Replace X6R, X6I, X7R, X7I
   
        STM  #X6R, AR1
        STM  #X7R, AR2
        STM  #W08R, AR3
        CALL _butterfly

 
;STAGE 2 Butterflies:

; Call BUTTERFLY with AR = X0R, AI = X0I, BR = X21R, BI = X2I 
; Replace X0R, X0I, X2R, X2I
 	
        STM  #X0R, AR1
        STM  #X2R, AR2
        STM  #W08R, AR3
        CALL _butterfly
   	
; Apply Twiddle Factor W28 to X3R, X3I
; Call BUTTERFLY with AR = X1R, AI = X1I, BR = X3R, BI = X3I 
; Replace X1R, X1I, X3R, X3I
   
        STM  #X1R, AR1
        STM  #X3R, AR2
        STM  #W28R, AR3
        CALL _butterfly

; Call BUTTERFLY with AR = X4R, AI = X4I, BR = X6R, BI = X6I 
; Replace X4R, X4I, X6R, X6I
	
        STM  #X4R, AR1
        STM  #X6R, AR2
        STM  #W08R, AR3
        CALL _butterfly
   
; Apply Twiddle Factor W28 to X7R, X7I
; Call BUTTERFLY with AR = X5R, AI = X5I, BR = X7R, BI = X7I 
; Replace X5R, X5I, X7R, X7I
   	
        STM  #X5R, AR1
        STM  #X7R, AR2
        STM  #W28R, AR3
        CALL _butterfly
   

;STAGE 3 Butterflies:

; Call BUTTERFLY with AR = X0R, AI = X0I, BR = X4R, BI = X4I 
; Replace X0R, X0I, X4R, X4I

        STM  #X0R, AR1
        STM  #X4R, AR2
        STM  #W08R, AR3
        CALL _butterfly
   
; Apply Twiddle Factor W18 to X5R, X5I
; Call BUTTERFLY with AR = X1R, AI = X1I, BR = X5R, BI = X5I 
; Replace X1R, X1I, X5R, X5I

        STM  #X1R, AR1
        STM  #X5R, AR2
        STM  #W18R, AR3
        CALL _butterfly

; Apply Twiddle Factor W28 to X6R, X6I
; Call BUTTERFLY with AR = X2R, AI = X2I, BR = X6R, BI = X6I 
; Replace X2R, X2I, X6R, X6I

        STM  #X2R, AR1
        STM  #X6R, AR2
        STM  #W28R, AR3
        CALL _butterfly
   
; Apply Twiddle Factor W38 to X7R, X7I
; Call BUTTERFLY with AR = X3R, AI = X3I, BR = X7R, BI = X7I 
; Replace X3R, X3I, X7R, X7I

        STM  #X3R, AR1
        STM  #X7R, AR2
        STM  #W38R, AR3
        CALL _butterfly	 
   
;Spectrum computation
   
        STM  #X0R, AR1          ; AR1 points to transformed X0R
        STM  #S0, AR2           ; AR2 points to spectrum S0
        STM #7, AR3             ; AR3 = # of spectrum points-1	
   
        CALL _spectrum          ; Compute signal spectrum       
        nop
        nop

;-----------------------------------------------------------------------     
; This subroutine moves the data to the FFT memory.
; The data is written in bit-reversed order.
;-----------------------------------------------------------------------     

_bitrev:
        STM #x0, AR1            ; AR1 points to input sample x0
        STM #X0R, AR2           ; AR2 points to FFT data memory start
        STM #8, AR0             ; AR0 = FFT order = 8
        STM #7, AR3             ; AR3 = FFT order-1 = 7
loop:
        LD *AR1+, A             ; Get next input data sample 
        STL A, *AR2+0B          ; Store bit-reversed in FFT memory
        BANZ loop, *AR3-        ; Repeat for all input samples
        RET
        nop
        nop

;-----------------------------------------------------------------------     
;Clear FFT data memory routine
;-----------------------------------------------------------------------     

_clear:				
        STM #X0R, AR2           ; AR2 points to FFT data memory
        RPT #15                 ; Clear FFT memory
        ST #0, *AR2+		
        RET
        nop
        nop
	
;--------------------------------------------------------------------------     
; This subroutine implements the butterfly computation
;    
;       Use AR1 as pointer to first complex number.
;       Use AR2 as pointer to second complex number.
;       Use AR3 as pointer to twiddle factor.       
;
;       AR <= AR + BR*WR - BI*WI
;       AI <= AI + BR*WI + BI*WR
;       BR <= AR - BR*WR + BI*WI 
;       BI <= AI - BR*WR - BI*WI
;
;       Scale Factor = 1/4
;
;--------------------------------------------------------------------------
	
_butterfly:
        MVMM AR1, AR5           ; AR5 = AR1
        STM  #TMP1, AR4         ; AR4 points to TMP1
	
        LD *AR5, -2, A		
        STL A, *AR5+            ; Replace AR with AR/4
        LD *AR5, -2, A		
        STL A, *AR5-            ; Replace AI with AI/4
	
        LD *AR2, -2, A		
        STL A, *AR2+            ; Replace BR with BR/4
        LD *AR2, -2, A		
        STL A, *AR2-            ; Replace BI with BI/4
	
        LD *AR5+, A
        STL A, 1 , *AR4+        ; Store AR in TMP1
        LD *AR5-, A
        STL A, 1 , *AR4-        ; Store AI in TMP2
	
        ;AR <= AR + BR*WR - BI*WI
        LD #0, A                ; A = 0
        MPY *AR2+, *AR3+, A     ; A = BR*WR
        MAS *AR2-, *AR3, A      ; A = (BR*WR) - BI*WI
        ADD *AR5, 15, A         ; A = (BR*WR - BI*WI) + AR
        ADD #1,14,A             ; Round the result
        STH A, 1, *AR5+         ; Save computed AR
 
        ;AI <= AI + BR*WI + BI*WR
        LD #0, A                ; A = 0
        MPY *AR2+, *AR3-, A     ; A = BR*WI
        MAC *AR2-, *AR3, A      ; A = (BR*WI) + BI*WR
        ADD *AR5, 15, A         ; A = (BR*WI + BI*WR) + AI
        ADD #1,14,A             ; Round the result	
        STH A, 1, *AR5-         ; Save computed AI
	
        ;BR <= AR - (BR*WR - BI*WI)
        LD *AR4+, A             ; A = AR
        SUB *AR5+, A            ; A = AR-(BR*WR - BI*WI)
        STL A, *AR2+            ; Save computed BR

        ;BI <= AI - (BR*WI + BI*WR)
        LD *AR4-, A             ; A = AI
        SUB *AR5-, A            ; A = AI- (BR*WI + BI*WR)
        STL A, *AR2-            ; Save computed BI
        RET
        nop
        nop
	

;-----------------------------------------------------------------------     
; This subroutine computes the spectrum of the transformed data.
;
;       Use AR1 as pointer to the transformed data.
;       Use AR2 as pointer to the spectrum data.
;
;       S(k) = (1/N)*|X(k)|*|Conj(X(k))|
;
;-----------------------------------------------------------------------     
	
_spectrum:
        LD #0,A                 ; A = 0
        LD #0,B	                ; B = 0
        SQUR *AR1+,A            ; Square X(k) real
        SQUR *AR1+,B            ; Square X(k) imaginary
        ADD B,A                 ; A = |X(k)|.|Conj(X(k))|
        STH A,1,*AR2			
        LD *AR2,13,A            ; divide by 8
        STH A, *AR2+            ; Store the spectrum result
        BANZ _spectrum, *AR3-
        RET
        nop
        nop

        .end




⌨️ 快捷键说明

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