📄 c2cx0128.asm
字号:
.file "c2cx0128.asm"
.title "0128 point DIT Radix-2, Complex FFT"
.width 120
N .set 128 ; NUMBER OF POINTS FOR FFT
******************************************************************************
* *
* 128 - POINT COMPLEX, RADIX-2 DIF FFT WITH THE TMS320C2x *
* ------------------------------------------------------- *
* *
* THE PROGRAM IS BASED ON THE BOOK 'DIGITAL SIGNAL PROCESSING APPLICATIONS' *
* FROM TEXAS INSTRUMENTS P. 69. IT IS OPTIMIZED FOR THE TMS320C5x INCLUDING *
* BIT REVERSAL ADDRESSING MODE. *
* *
* THE PROGRAM IS A MIXTURE OF LOOPED AND STRAIGHT FORWARD CODE TO OPTIMIZE *
* CODESIZE AND EXECUTION TIME. TWO OPTIMIZATION FACTORS FOR CODESIZE AND *
* EXECUTION TIME EVALUATION ARE POSSIBLE (divid = 2 and 4). *
* *
* WRITTEN BY: MANFRED CHRIST REVISION: 1.00 5. Sept. 90 *
* *
* COPYRIGHT TEXAS INSTRUMENTS INC. 1990 *
* *
******************************************************************************
* *
* USED REGISTER: AR0..AR7, ACCU, PREG, TREG, 2 STACKLEVEL, BLOCK B2 *
* *
* COEFFICIENTS : 16 BITS (Q15 Format) SCALING: 1/2^7=1/128 *
* *
* c25/e25/e26 320c25-50 only *
* ------------- ---------------- program twiddle *
* dsp divid cycles t-cyc=100ns t_cyc=80ns words words *
* ----- ----- ------- ------------- ---------------- ------- ----- *
* all 2 7,117 711.7 us 569.20 us 306 176 *
* all 4 6,887 688.7 us 550.96 us 548 176 *
* *
* all: 320c25/e25/c26 up,uc *
* *
* PROGRAMSEQUENCE: 0. INITIALISATION FOR FFT/COEFF ADD: 300H - 3..H *
* 1. INPUT NEW DATA INTO 'INPUT' ADD: 2000H - 20FFH *
* 2. CALL SUBROUTINE FFT ADD: 800H - 9..H *
* 2.1. BITREVERSAL FROM INPUT TO DATA ADD: 200H - 2FFH *
* 2.2. FFT WITH WORK SPACE DATA ADD: 200H - 2FFH *
* 3. OUTPUT THE RESULTS FROM DATA ADD: 200H - 2FFH *
* *
* INPUT DATA AT ADDRESS 2000h-21FFh: *
* ---------------------------------- *
* THE DATA ARE STORED IN 'INPUT' IN THE SEQUENCE: X(0),X(1),...,X(127) *
* Y(0),Y(1),...,Y(127) *
* *
* OUTPUT DATA AT ADDRESS 0200h-02ffh: *
* ----------------------------------- *
* THE DATA ARE STORED IN 'DATA' IN THE SEQUENCE: *
* X(0),Y(0),X(1),Y(1),... ... ,X(127),Y(127) *
******************************************************************************
* *
* THIS PROGRAM INCUDES FOLLOWING FILE: *
* ------------------------------------ *
* THE FILE 'TWIDDLES.Q15' CONSISTS OF TWIDDLE FACTORS IN Q15 FORMAT *
* THE FILE 'C2CXRAD2.MAC' macro files *
* THE FILE 'INIT_FFT.ASM' initialisation File *
* THE FILE 'DIVID.ASM' defines the optimisation (used in $loop repeat) *
******************************************************************************
.include divid.asm ; define optimization: 2 + 4 are tested
.include c2cxrad2.mac
;
.def TWIDLEN,FFTLEN,TWIDSTRT,INPUT,INIT,FFT
.def STAGE1,STAGE3,STAGE4,SINES4
;
.sect "twiddles"
; table of twiddle factors for the FFT
TWIDSTRT .set $
.include twiddles.q15
TWIDLEN .set $-TWIDSTRT
;
INPUT .usect "input",N*2 ; input data array
TWID .usect "twid",TWIDLEN ; reserve space for twiddles
DATA .data
.space N*2*16 ; working data array
;
.include init-fft.asm
;
.sect "fftprogram"
;
; FFT CODE WITH BIT-REVERSED INPUT SAMPLES / ARP=AR3 / DP=0
;
FFT: lar ar3,DATAADD ; TRANSFER 2*N WORDS FROM 'input' to 'data'
lar ar0,NN ; indexregister = N
rpt #N*2-1 ; 2*N-1 TIMES
bldd #INPUT,*BR0+
;
; FFT CODE for STAGES 1 and 2 / ARP=AR3
;
STAGE1: lar ar0,#7 ; indexregister = 7
lar ar1,DATAADD ; pointer to DATA r1,i1
lar ar2,DATA2 ; pointer to DATA + 2 r2,i2
lar ar3,DATA4 ; pointer to DATA + 4 r3,i3
lar ar4,DATA6 ; pointer to DATA + 6 r4,i4
COMBO2X 32 ; repeat 32 times
;
; FFT CODE FOR STAGE 3 / ARP=AR2
;
STAGE3: lar ar0,#9 ; index register = 9
lar ar1,DATAADD ; ar1 -> DATA
lar ar2,DATA8 ; ar2 -> DATA+8
stage3l 16 ; repeat 16 times
;
; FFT CODE FOR STAGE 4 / ARP=AR2
;
STAGE4: lar ar0,#16 ; index register = 16
sar ar0,TEMP+1 ; save index
lar ar1,DATAADD ; ar1 -> DATA
lar ar2,DATA16 ; ar2 -> DATA+16
lar ar6,#7 ; repat loop4 8 times
;
loop4: lar ar3,cos4 ; start of cosine in stage 4
lar ar4,sin4 ; start of sine in stage 4
do_btfly 8 ; setup for 8 butterflies
banz loop4,*-,ar2
;
; FFT CODE FOR STAGE 5 / ARP=AR2
;
STAGE5: lar ar0,#32 ; index register = 32
sar ar0,TEMP+1 ; save index
lar ar1,DATAADD ; ar1 -> DATA
lar ar2,DATA32 ; ar2 -> DATA+32
lar ar6,#3 ; repat loop5 4 times
;
loop5: lar ar3,cos5 ; start of cosine in stage 5
lar ar4,sin5 ; start of sine in stage 5
do_btfly 16 ; setup for 16 butterflies
banz loop5,*-,ar2
;
;
; FFT CODE FOR STAGE 6 / ARP=AR2
;
STAGE6: lar ar0,#64 ; index register = 64
sar ar0,TEMP+1 ; save index
lar ar1,DATAADD ; ar1 -> DATA
lar ar2,DATA64 ; ar2 -> DATA+64
lar ar6,#1 ; repat loop6 2 times
;
loop6: lar ar3,cos6 ; start of cosine in stage 6
lar ar4,sin6 ; start of sine in stage 6
do_btfly 32 ; setup for 32 butterflies
banz loop6,*-,ar2
;
; FFT CODE FOR STAGE 7 / ARP=AR2
;
STAGE7: lar ar1,DATAADD ; ar1 -> DATA
lar ar2,DATA128 ; ar2 -> DATA+128
;
lar ar3,cos7 ; start of cosine in stage 7
lar ar4,sin7 ; start of sine in stage 7
; the next two macros finish the FFT
do_loops 64 ; setup for 64 butterflies
ex_btfly ; execute the butterflies
FFTLEN .set $-FFT
.end
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -