📄 fft_pgm.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 + -