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

📄 cfft32c.asm

📁 TMS320F2812 FFT 源码,包括详细的应用文档
💻 ASM
📖 第 1 页 / 共 2 页
字号:
;========================================================================
;
; File Name     : cfft.asm
; 
; Originator    : Advanced Embeeded Control
;                 Texas Instruments Inc.
; 
; Description   : This file contain source code for complex FFT
;               
; Date          : 26/02/2002 (dd/mm/yyyy)
;========================================================================    
; Routine Type  : C Callable
; Description   :
; void FFTC_calc(FFTxxxx_handle) 
; This function implements complex FFT using radix-2 DIT algo
; 
; void FFT128C_init(void)
; This function copies the Twiddle factors from load time address to 
; its run time address
;========================================================================
; COMPLEX FFT MODULES               
;-----------------------------------------------------------------------
;    typedef struct {                
;       long *ipcbptr;
;       long *tfptr;               
;       int size;
;       int nrstage;             
;       long *magptr;
;       long *winptr; 
;       long peakmag;
;       int peakfrq;          
;       void (*init)(void);          
;       void (*izero)(void *);          
;       void (*calc)(void *);           
;       void (*mag)(void *);            
;       void (*win)(void *);              
;       }FFTxxxC;                        
;                                             
;========================================================================

                .include "sel_q.asm"
                .def    _CFFT32_calc

COS45K_LSW      .set    799Bh
COS45K_MSW      .set    5A82h
;===============================================================================
; FFT - Computation Routine  (FFT128R_calc)
;===============================================================================
;   * This routine takes the 128 point complex data sequence, in bit reversed form  
;   * It implements Decimation in time FFT algorithm
;   * Performs inplace computation
;   * Output in-order data "IPCB"----> Xr(0),Xi(0),Xr(1),Xi(1)...Xr(127)&Xi(127)
;===============================================================================            
;----------------------------------------------------
; MACRO 'ZEROI'     
; Number of WORDS/Number of Cycles 12
; USAGE: Called if the TWIDDLE FACTOR: 1
; 
; P=PR+jPI, Q=QR+jQI, W=WR-jWI
; P'=P+W*Q and Q'=P-W*Q
;
; POINTERS AT ENTRY
; AR6->(PR,PI,PR+1,PI+1,PR+2,PI+2,....)
; AR2->(QR,QI,QR+1,QI+1,QR+2,QR+2,....)
; COMPUTATION PERFORMED: INPLACE COMPUTATION
; AR6   ->      PR'=(PR+QR)/2 
; AR2   ->      QR'=(PR-QR)/2
; AR6+1 ->      PI'=(PI+QI)/2
; AR2+1 ->      QI'=(PI-QI)/2
; PR and PR', PI and PI', QR and QR', QI and QI' are
; stored in the same locations
; POINTERS AT EXIT
; AR6->(PR+1,PI+1,....) 
; AR2->(QR+1,QI+1,....)
;------------------------------------------------------
;                                                   (Content of REG after exec.)
ZEROI   .macro                      ;                   AR6     AR2              
            MOVL    ACC,*XAR6       ; ACC:=PR           PR      QR  
            SFR     ACC,#1          ; ACC:=PR/2         PR      QR
            MOVL    P,*XAR2         ; P=QR              PR      QR
            ADDL    ACC,P<<PM       ; ACC=PR+QR/2       PR      QR
            MOVL    *XAR6++,ACC     ; PR':=(PR+QR)/2    PI      QR  
            SUBL    ACC,P           ; ACC:=(PR-QR)/2    PI      QR  
            MOVL    *XAR2++,ACC     ; QR':=(PR-QR)/2    PI      QI  

            MOVL    ACC,*XAR6       ; ACC:=PI           PI      QI  
            SFR     ACC,#1          ; ACC:=PI/2         PI      QI
            MOVL    P,*XAR2         ; P=QI              PI      QI
            ADDL    ACC,P<<PM       ; ACC:=(PI+QI)/2    PI      QI 
            MOVL    *XAR6++,ACC     ; PI':=(PI+QI)/2    PR+1    QI  
            SUBL    ACC,P           ; ACC:=(PI-QI)/2    PR+1    QI  
            MOVL    *XAR2++,ACC     ; QR':=(PI-QI)/2    PR+1    QR+1     
        .endm

;----------------------------------------------------
; MACRO 'PBY2I'     
; Number of WORDS/Number of Cycles 12
; USAGE: Called if the TWIDDLE FACTOR: -j 
; 
; P=PR+jPI, Q=QR+jQI, W=WR-jWI
; P'=P+W*Q and Q'=P-W*Q
;
; POINTERS AT ENTRY
; AR6->(PR,PI,PR+1,PI+1,PR+2,PI+2,....)
; AR2->(QR,QI,QR+1,QI+1,QR+2,QR+2,....)
; COMPUTATION PERFORMED: INPLACE COMPUTATION
; AR6   ->      PR'=(PR+QI)/2 
; AR2   ->      QR'=(PR-QI)/2
; AR6+1 ->      PI'=(PI-QR)/2
; AR2+1 ->      QI'=(PI+QR)/2
; PR and PR', PI and PI', QR and QR', QI and QI' are
; stored in the same locations 
; POINTERS AT EXIT
; AR6->(PR+1,PI+1,....) 
; AR2->(QR+1,QI+1,....)
;------------------------------------------------------         
;                                                   (Content of REG after exec.)
PBY2I   .macro                      ;                   AR6     AR2  
            
            MOVL    XAR5,*XAR2++    ; XAR5=QR           PR      QI
            MOVL    ACC,*XAR6       ; ACC:=PR           PR      QI
            SFR     ACC,#1          ; ACC:=PR/2         PR      QI
            MOVL    P,*XAR2         ; P:=QI             PR      QI
            ADDL    ACC,P<<PM       ; ACC:=(PR+QI)/2    PR      QI  
            MOVL    *XAR6++,ACC     ; PR':=(PR+QI)/2    PI      QI     
            SUBL    ACC,P           ; ACC:=(PR-QI)/2    PI      QI     
            MOVL    *--XAR2,ACC     ; QR':=(PR-QI)/2    PI      QR
            ADDB    XAR2,#2         ;                   PI      QI
            
            MOVL    ACC,*XAR6       ; ACC:=PI           PI      QI
            SFR     ACC,#1          ; ACC:=PI/2         PI      QI
            MOVL    P,XAR5          ; P=QR              PI      QI
            SUBL    ACC,P<<PM       ; ACC=(PI-QR)/2     PI      QI
            MOVL    *XAR6++,ACC     ; ACC:=(PI-QR)/2    PR+1    QI    
            ADDL    ACC,P           ; ACC:=(PI+QR)/2    PR+1    QI 
            MOVL    *XAR2++,ACC     ; QI':=(PI+QR)/2    PR+1    QR+1
                              
        .endm  

;----------------------------------------------------
; MACRO 'PBY4I'          SPM set to 1bit right shift, XT=w
; Number of WORDS/Number of Cycles 16
; USAGE: Called if the TWIDDLE FACTOR: COS(45)-jSIN(45)=0.707-j0.707 
; 
; P=PR+jPI, Q=QR+jQI, W=WR-jWI
; P'=P+W*Q and Q'=P-W*Q
;
; POINTERS AT ENTRY
; TREG=W=|SIN(45)|=|COS(45)|=05a82h
; AR6->(PR,PI,PR+1,PI+1,PR+2,PI+2,....)
; AR2->(QR,QI,QR+1,QI+1,QR+2,QR+2,....)
; CALCULATION PERFORMED: INPLACE COMPUTATION
; AR6   ->      PR'=(PR+QI*W+QR*W)/2  
; AR2   ->      QR'=(PR-QI*W-QR*W)/2
; AR6+1 ->      PI'=(PI+QI*W-QR*W)/2
; AR2+1 ->      QI'=(PI-QI*W+QR*W)/2
; PR and PR', PI and PI', QR and QR', QI and QI' are
; stored in the same locations
; POINTERS AT EXIT
; AR6->(PR+1,PI+1,....) 
; AR2->(QR+1,QI+1,....)
;------------------------------------------------------         
;                                                           (Content of REG after exec.)
PBY4I   .macro                      ;                       PREG    AR6  AR2         
                                    ;                       -       PR   QR 
            MOVL    ACC,*XAR6       ; ACC=PR                -       PR   QR  
            SFR     ACC,#1          ; ACC=PR/2              -       PR   QR  
            QMPYL   P,XT,*XAR2      ; PREG=W*QR/2           W*QR/2  PR   QR  
            SUBL    ACC,P           ; ACC=(PR-W*QR)/2       W*QR/2  PR   QR
            MOVL    XAR5,P          ; XAR5=W*QR/2
            QMPYL   P,XT,*+XAR2[2]  ; ACC=(PR-W*QR)/2       W*QI/2  PR   QR
            SUBL    ACC,P           ; ACC=(PR-W*QI-W*QR)/2  W*QI/2  PR   QR 
            MOVL    *XAR2++,ACC     ; QR'=(PR-W*QI-W*QR)/2  W*QI/2  PR   QI
            NEG     ACC             ; ACC=-(PR-W*QI-W*QR)/2 W*QI/2  PR   QI
            ADDL    *XAR6++,ACC     ; PR'=(PR+W*QI+W*QR)/2  W*QI/2  PI   QI

            MOVL    ACC,*XAR6       ; ACC=PI                W*QI/2  PI   QI
            SFR     ACC,#1          ; ACC=PI/2              W*QI/2  PI   QI
            SUBL    ACC,P           ; ACC=(PI-W*QI)/2       W*QI/2  PI   QI
            ADDL    ACC,XAR5        ; ACC=(PI-W*QI+W*QR)/2  W*QR/2  PI   QI
            MOVL    *XAR2++,ACC     ; QI'=(PI-W*QI+W*QR)/2  W*QR/2  PI   QR+1
            NEG     ACC             ; ACC=-(PI-W*QI+W*QR)/2 W*QR/2  PI   QR+1
            ADDL    *XAR6++,ACC     ; PI'=(PI+W*QI-W*QR)/2  W*QR/2  PR+1 QR+1           
        .endm


;----------------------------------------------------
; MACRO 'P3BY4I'    SPM set to 1bit right shift, XT=w    
; Number of WORDS/Number of Cycles 16
; USAGE: Called if the TWIDDLE FACTOR: COS(90+45)-jSIN(90+45)=-0.707-j0.707 
; 
; P=PR+jPI, Q=QR+jQI, W=WR-jWI
; P'=P+W*Q and Q'=P-W*Q
;
; POINTERS AT ENTRY 
; TREG=W=|SIN(135)|=|COS(135)|=05a82h
; AR6->(PR,PI,PR+1,PI+1,PR+2,PI+2,....)
; AR2->(QR,QI,QR+1,QI+1,QR+2,QR+2,....)
; CALCULATION PERFORMED: INPLACE COMPUTATION
; AR6   ->      PR'=(PR+QI*W-QR*W)/2  
; AR2   ->      QR'=(PR-QI*W+QR*W)/2
; AR6+1 ->      PI'=(PI-QI*W-QR*W)/2
; AR2+1 ->      QI'=(PI+QI*W+QR*W)/2
; PR and PR', PI and PI', QR and QR', QI and QI' are
; stored in the same locations 
; POINTERS AT EXIT
; AR6->(PR+1,PI+1,....) 
; AR2->(QR+1,QI+1,....)
;------------------------------------------------------         
;                                                           (Content of REG after exec.)
P3BY4I  .macro                      ;                       AR5     PREG    AR6  AR2 
                                    ;                       -       PR   QR 
            MOVL    ACC,*XAR6       ; ACC=PR                -       PR   QR  
            SFR     ACC,#1          ; ACC=PR/2              -       PR   QR  
            QMPYL   P,XT,*XAR2      ; PREG=W*QR/2           W*QR/2  PR   QR 
            ADDL    ACC,P           ; ACC=(PR+W*QR)/2       W*QR/2  PR   QR
            MOVL    XAR5,P          ; XAR5=W*QR/2           W*QR/2  PR   QR
            QMPYL   P,XT,*+XAR2[2]  ; ACC=(PR+W*QR)/2       W*QI/2  PR   QR
            SUBL    ACC,P           ; ACC=(PR-W*QI+W*QR)/2  W*QI/2  PR   QR 
            MOVL    *XAR2++,ACC     ; QR'=(PR-W*QI+W*QR)/2  W*QI/2  PR   QI
            NEG     ACC             ; ACC=-(PR-W*QI+W*QR)/2 W*QI/2  PR   QI
            ADDL    *XAR6++,ACC     ; PR'=(PR+W*QI-W*QR)/2  W*QI/2  PI   QI

            MOVL    ACC,*XAR6       ; ACC=PI                W*QI/2  PI   QI
            SFR     ACC,#1          ; ACC=PI/2              W*QI/2  PI   QI
            ADDL    ACC,P           ; ACC=(PR+W*QI)/2       W*QI/2  PI   QI
            ADDL    ACC,XAR5        ; ACC=(PI+W*QI+W*QR)/2  W*QR/2  PI   QI
            NOP     *,ARP2
            MOVL    *0++,ACC        ; QI'=(PI+W*QI+W*QR)/2  W*QR/2  PI   QR+1
            NEG     ACC             ; ACC=-(PI+W*QI+W*QR)/2 W*QR/2  PI   QR+1
            ADDL    *XAR6,ACC       ; PI'=(PI-W*QI-W*QR)/2  W*QR/2  PI   QR+1
            NOP     *0++            ;                       W*QR/2  PR+1 QR+1
        .endm  


;----------------------------------------------------
; MACRO 'BFLY'       SPM set to 1bit right shift
; Number of WORDS/Number of Cycles 21
; USAGE: General Butterfly RADIX 2 -> TWIDDLE FACTOR W=WR-jWI 
; 
; P=PR+jPI, Q=QR+jQI, W=WR-jWI
; P'=P+W*Q and Q'=P-W*Q
;
; REGISTER USED: XAR0,XAR2,XAR3,XAR4,XAR5,XAR6,ACC,XT,P 
;
; POINTERS AT ENTRY
; AR6->(PR,PI,PR+1,PI+1,PR+2,PI+2,....)
; AR2->(QR,QI,QR+1,QI+1,QR+2,QR+2,....)
; AR3-> Real Part of Twiddle Factor: WR(COSx)
; AR4-> Imaginary Part of Twiddle Factor: WI(SINx)
; AR5-> Temporary Variable
; CALCULATION PERFORMED: INPLACE COMPUTATION 
; AR6   ->      PR'=(PR+QR*WR+QI*WI)/2  
; AR2   ->      QR'=(PR-QR*WR-QI*WI)/2
; AR6+1 ->      PI'=(PI+QI*WR-QR*WI)/2
; AR2+1 ->      QI'=(PI-QI*WR+QR*WI)/2
; PR and PR', PI and PI', QR and QR', QI and QI' are
; stored in the same locations
; POINTERS AT EXIT
; AR6->(PR+1,PI+1,....) 
; AR2->(QR+1,QI+1,....)
; AR3-> Real Part of Next Twiddle Factor
; AR4-> Imaginary Part ofNext Twiddle Factor
;------------------------------------------------------            
    
BFLY    .macro  p                   ;                         XT    AR6     AR2     AR3     AR4  
                                    ;                         -     PR      QR      WR      WI 
            MOVL    XT,*XAR3        ; XT=WR                   WR    PR      QR      WR      WI
            NOP     *0++            ;                         WR    PR      QR      WR+n    WI
            QMPYL   P,XT,*XAR2++    ; P=QR*WR                 WR    PR      QI      WR+n    WI
            QMPYL   ACC,XT,*,ARP4   ; ACC=QI*WR               WR    PR      QI      WR+n    WI
            MOVL    *-SP[TEMP],P    ; TEMP=QR*WR              WR    PR      QI      WR+n    WI

            MOVL    XT,*0++         ; XT=WI                   WR    PR      QI      WR+n    WI+n
            QMPYL   P,XT,*--XAR2    ; P=WI*QR                 WR    PR      QR      WR+n    WI+n
            SUBL    ACC,P           ; ACC=(QI*WR-QR*WI)       WR    PR      QR      WR+n    WI+n
            
            .if(TF_QFMAT==Q30)
            LSL     ACC,#1          ; ACC=(QI*WR-QR*WI) (Q30)
            .endif

            MOVL    XAR5,ACC        ; XAR5=(QI*WR-QR*WI) (Q30)
                        
            QMPYL   ACC,XT,*+XAR2[2]; ACC=WI*QI              WR    PR      QR      WR+n    WI+n
            ADDL    ACC,*-SP[TEMP]  ; ACC=(QR*WR+QI*WI)      WR    PR      QR      WR+n    WI+n

            .if(TF_QFMAT==Q30)
            LSL     ACC,#1          ; ACC=(QR*WR+QI*WI) in Q30
            .endif

            MOVL    P,*XAR6         ; P=PR                    WR    PR      QR      WR+n    WI+n

⌨️ 快捷键说明

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