📄 c2cx1024.asm
字号:
.file "c2cx1024.asm"
.title "1024 point DIT Radix-2, Complex FFT"
.width 120
N .set 1024 ; NUMBER OF POINTS FOR FFT
******************************************************************************
* *
* 256 - POINT COMPLEX, RADIX-2 DIT 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^10=1/1024 *
* *
* c25/e25/e26 320c25-50 only *
* ------------- ---------------- program twiddle *
* dsp divid cycles t-cyc=100ns t_cyc=80ns words words type *
* ----- ----- ------- ------------- ---------------- ------- ----- ---- *
* e/c25 2 109,467 10,947.7 us 8,757.36 us 425 1516 mc *
* e/c25 2 112,539 11,253.9 us 9,003.12 us 425 1516 mp *
* c26 2 107,397 10,739.7 us ------- 425 1516 mp *
* e/c25 4 106,491 10,649.1 us 8,519.28 us 667 1516 mc *
* e/c25 4 109,491 10,956.3 us 8,765.04 us 667 1516 mp *
* c26 4 104,421 10,442.1 us ------- 667 1516 mp *
* *
* PROGRAMSEQUENCE: 0. INITIALISATION FOR FFT/COEFF ADD: 400H - 5..H *
* 1. INPUT NEW DATA INTO 'INPUT' ADD: 2000H - 27ffH *
* 2. CALL SUBROUTINE FFT ADD: 800H - 9..H *
* 2.1. BITREVERSAL FROM INPUT TO DATA ADD: 800H - fffH *
* 2.2. FFT WITH WORK SPACE DATA ADD: 800H - fffH *
* 3. OUTPUT THE RESULTS FROM DATA ADD: 800H - fFFH *
* *
* INPUT DATA AT ADDRESS 2000h-23FFh: *
* ---------------------------------- *
* THE DATA ARE STORED IN 'INPUT' IN THE SEQUENCE: X(0),X(1),...,X(511) *
* Y(0),Y(1),...,Y(511) *
* *
* OUTPUT DATA AT ADDRESS 0200h-03FFh: *
* ----------------------------------- *
* THE DATA ARE STORED IN 'DATA' IN THE SEQUENCE: *
* X(0),Y(0),X(1),Y(1),... ... ,X(511),Y(511) *
******************************************************************************
* *
* 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 ; macro file
;
.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
BUFFER .usect "buffer",N*2 ; reserve space for bit reversal buffer
DATA .data
.space N*2*16 ; working data array
TWID .usect "twid",TWIDLEN ; reserve space for twiddles
;
.include init-fft.asm
;
.sect "fftprogram"
;
; FFT CODE WITH BIT-REVERSED INPUT SAMPLES / ARP=AR3 / DP=0
;
; transfer 2*N input data from 'INPUT' to 'BUFFER'
;
FFT: lar ar3,#BUFFER
lar ar0,NN ; indexregister = N
rpt #255
bldd #INPUT,*BR0+
rpt #255
bldd #INPUT+100h,*BR0+
rpt #255
bldd #INPUT+200h,*BR0+
rpt #255
bldd #INPUT+300h,*BR0+
rpt #255
bldd #INPUT+400h,*BR0+
rpt #255
bldd #INPUT+500h,*BR0+
rpt #255
bldd #INPUT+600h,*BR0+
rpt #255
bldd #INPUT+700h,*BR0+
;
;
; transfer 2nd part of fftdata
;
fft1q: lar ar3,DATAADD
rpt #255
bldd #BUFFER+200h,*+
rpt #255
bldd #BUFFER+300h,*+
call fft256,*,ar3 ; arp=3 for combo2x
mar *,ar2
lar ar2,#DATA+200h ; returns with arp=ar2
rpt #255
bldd #DATA,*+
rpt #255
bldd #DATA+100h,*+
;
; transfer 3rd part of fftdata
;
fft2q: lar ar2,DATAADD
rpt #255
bldd #BUFFER+400h,*+
rpt #255
bldd #BUFFER+500h,*+
call fft256,*,ar3
mar *,ar2
lar ar2,#DATA+400h
rpt #255
bldd #DATA,*+
rpt #255
bldd #DATA+100h,*+
;
; transfer 4th part of fftdata
;
fft3q: lar ar2,DATAADD
rpt #255
bldd #BUFFER+600h,*+
rpt #255
bldd #BUFFER+700h,*+
call fft256,*,ar3
mar *,ar2
lar ar2,#DATA+600h
rpt #255
bldd #DATA,*+
rpt #255
bldd #DATA+100h,*+
;
; transfer 1st part of fftdata
;
fft0q: lar ar2,DATAADD
rpt #255
bldd #BUFFER,*+
rpt #255
bldd #BUFFER+100h,*+
call fft256,*,ar3
mar *,ar2
;
; FFT CODE FOR STAGE 9 / ARP=AR2
;
STAGE9: lar ar0,#512 ; index register = 512
sar ar0,TEMP+1 ; save ar0
lar ar1,DATAADD ; ar1 -> DATA
lar ar2,DATA512 ; ar2 -> DATA+512
lar ar6,#1 ; repeat loop9 2 times
;
loop9: lar ar3,cos9 ; start of cosine in stage 9
lar ar4,sin9 ; start of sine in stage 9
do_btfly 256 ; setup for 256 butterflies
banz loop9,*-,ar2
;
; FFT CODE FOR STAGE 10 / ARP=AR2
;
STAGE10: lar ar1,DATAADD ; ar1 -> DATA
lar ar2,#DATA+1024 ; ar2 -> DATA+1024
;
lar ar3,cos10 ; start of cosine in stage 10
lar ar4,sin10 ; start of sine in stage 10
do_brnch 512 ; setup for 512 butterflies
;
; Execute 256 point FFT'S
;
fft256: .set $
;
; 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 64 ; repeat 64 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 32 ; repeat stage3 32 times
;
; FFT CODE FOR STAGE 4 / ARP=AR2
;
STAGE4: lar ar0,#16 ; index register = 16
sar ar0,TEMP+1 ; save ar0
lar ar1,DATAADD ; ar1 -> DATA
lar ar2,DATA16 ; ar2 -> DATA+16
lar ar6,#15 ; repeat loop4 16 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 ar0
lar ar1,DATAADD ; ar1 -> DATA
lar ar2,DATA32 ; ar2 -> DATA+32
lar ar6,#7 ; repeat loop5 8 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 ar0
lar ar1,DATAADD ; ar1 -> DATA
lar ar2,DATA64 ; ar2 -> DATA+64
lar ar6,#3 ; repeat loop6 4 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 ar0,#128 ; index register = 128
sar ar0,TEMP+1 ; save ar0
lar ar1,DATAADD ; ar1 -> DATA
lar ar2,DATA128 ; ar2 -> DATA+128
lar ar6,#1 ; repeat loop7 2 times
;
loop7: lar ar3,cos7 ; start of cosine in stage 7
lar ar4,sin7 ; start of sine in stage 7
do_btfly 64 ; setup for 64 butterflies
banz loop7,*-,ar2
;
; FFT CODE FOR STAGE 8 / ARP=AR2
;
STAGE8: lar ar1,DATAADD ; ar1 -> DATA
lar ar2,DATA256 ; ar2 -> DATA+256
;
lar ar3,cos8 ; start of cosine in stage 8
lar ar4,sin8 ; start of sine in stage 8
; the next two macros finish the FFT
do_loops 128 ; setup for 128 butterflies
ex_btfly ; execute the butterflies
FFTLEN .set $-FFT
.end
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -