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

📄 c2cx1024.asm

📁 TI2000系列DSP在CCS环境下实现快速傅立叶变化
💻 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 + -