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

📄 cfft128c.asm

📁 在采样的基础上实现数码管显示和利用TI公司的FFT算法进行运算
💻 ASM
📖 第 1 页 / 共 3 页
字号:
;============================================================================
;
; File Name     : cfft128c.asm
; 
; Originator    : Digital Control Systems Group 
;                 Texas Instruments 
; 
; Description   : This file contain source code for 128-point complex FFT
;               
; Date          : 26/4/2001 (dd/mm/yyyy)
;===========================================================================    
; Routine Type  : C Callable
; Description   :
; void FFT128C_calc(FFTxxxx_handle) 
; This function implements 128-point 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                   | REAL FFT MODULES
;---------------------------------------|-------------------------------
;    typedef struct {                   |  typedef struct {
;       int *ipcbptr;                   |   int *ipcbptr;   
;       int *magptr;                    |   int *magptr;    
;       int peakmag;                    |   int peakmag; 
;       int peakfrq;                    |   int peakfrq;  
;       int normflag;                   |   int normflag;   
;       int size;                       |   int size; 
;       int *winptr;                    |   int *winptr;  
;       void (*init)(void);             |   void (*init1)(void); 
;       void (*izero)(void *);          |   void (*init2)(void); 
;       void (*calc)(void *);           |   void (*calc)(void *); 
;       void (*mag)(void *);            |   void (*split)(void *);
;       void (*win)(void *);            |   void (*mag)(void *);   
;       }FFTxxxC;                       |   void (*win)(void *); 
;                                       |   }FFTxxxR;       
;=====================================================================

 

; Module definition for external referance
            .def    _FFT128C_calc       ;
            .def    _FFT128C_init       ; Copy Twiddle factor   
            .global _FFT128C_calc
            .global _FFT128C_init
N           .set    128                 ; FFT Length    
NSTG        .set    7                   ; Number of Stage
COS45K      .set    05A82h              ; Constant for COS(45)

    
;===============================================================================
; 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 10
; 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
; ARP=2
; 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
; ARP=2
; AR6->(PR+1,PI+1,....) 
; AR2->(QR+1,QI+1,....)
;------------------------------------------------------
;                                                   (Content of REG after exec.)
ZEROI   .macro                  ;                   AR6     AR2     ARP
            
            LACC    *,15,AR6    ;ACC:=QR/2          PR      QR      6
            ADD     *,15        ;ACC:=(PR+QR)/2     PR      QR      6
            SACH    *+,0,AR2    ;PR':=(PR+QR)/2     PI      QR      2 
            SUB     *,16        ;ACC:=(PR-QR)/2     PI      QR      2
            SACH    *+          ;QR':=(PR-QR)/2     PI      QI      2
            
            LACC    *,15,AR6    ;ACC:=QI/2          PI      QI      6
            ADD     *,15        ;ACC:=(PI+QI)/2     PI      QI      6
            SACH    *+,0,AR2    ;PI':=(PI+QI)/2     PR+1    QI      2
            SUB     *,16        ;ACC:=(PI-QI)/2     PR+1    QI      2
            SACH    *+          ;QI':=(PI-QI)/2     PR+1    QR+1    2
        
        .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
; ARP=2
; 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
; ARP=2
; AR6->(PR+1,PI+1,....) 
; AR2->(QR+1,QI+1,....)
;------------------------------------------------------         
;                                                   (Content of REG after exec.)
PBY2I   .macro                  ;                   AR6     AR2     ARP
            
            LACC    *+,15,AR5   ;                   PR      QI      5
            SACH    *,1,AR2     ;TMP:=QR            PR      QI      2
            
            LACC    *,15,AR6    ;ACC:=QI/2          PR      QI      6
            ADD     *,15        ;ACC:=(PR+QI)/2     PR      QI      6
            SACH    *+,0,AR2    ;PR':=(PR+QI)/2     PI      QI      2 
            SUB     *-,16       ;ACC:=(PR-QI)/2     PI      QR      2
            SACH    *+,0,AR6    ;QR':=(PR-QI)/2     PI      QI      2
            
            LACC    *,15,AR5    ;ACC:=PI/2          PI      QI      5
            SUB     *,15,AR6    ;ACC:=(PI-QR)/2     PI      QI      6
            SACH    *+,0,AR5    ;PI':=(PI-QR)/2     PR+1    QI      2
            ADD     *,16,AR2    ;ACC:=(PI+QR)/2     PR+1    QI      2
            SACH    *+          ;QI':=(PI+QR)/2     PR+1    QR+1    2
        
        .endm  
        
        
;----------------------------------------------------
; MACRO 'PBY4I'     
; 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
; ARP=2
; 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
; ARP=2
; AR6->(PR+1,PI+1,....) 
; AR2->(QR+1,QI+1,....)
;------------------------------------------------------         
;                                                       (Content of REG after exec.)
PBY4I   .macro                  ;                       AR5     PREG    AR6  AR2 ARP
                        
            MPY     *+,AR5      ;PREG:=W*QR/2           -       W*QR/2  PR   QI   5   
            SPH     *,AR6       ;TMP:=W*QR/2            W*QR/2  W*QR/2  PR   QI   6
            
            LACC    *,15,AR2    ;ACC:=PR/2              W*QR/2  W*QR/2  PR   QI   2
            MPYS    *-          ;ACC:=(PR-W*QR)/2       W*QR/2  W*QI/2  PR   QR   2
            SPAC                ;ACC:=(PR-W*QI-W*QR)/2  W*QR/2  W*QI/2  PR   QR   2
            SACH    *+,0,AR6    ;QR':=(PR-W*QI-W*QR)/2  W*QR/2  W*QI/2  PR   QI   6
            SUB     *,16        ;ACC:=(-PR-W*QI-W*QR)/2 W*QR/2  W*QI/2  PR   QI   6
            NEG                 ;ACC:=(PR+W*QI+W*QR)/2  W*QR/2  W*QI/2  PR   QI   6
            SACH    *+          ;PR'=(PR+W*QI+W*QR)/2   W*QR/2  W*QI/2  PI   QI   6                                                            
                                                                               
            LACC    *,15,AR5    ;ACC:=PI/2              W*QR/2  W*QI/2  PI   QI   5
            SPAC                ;ACC:=(PI-W*QI)/2       W*QR/2  W*QI/2  PI   QI   5
            ADD     *,16,AR2    ;ACC:=(PI-W*QI+W*QR)/2  W*QR/2  W*QI/2  PI   QI   2 
            SACH    *+,0,AR6    ;QI':=(PI-W*QI+W*QR)/2  W*QR/2  W*QI/2  PI   QR+1 2
            SUB     *,16        ;ACC:=(-PI-W*QI+W*QR)/2 W*QR/2  W*QI/2  PI   QR+1 2
            NEG                 ;ACC:=(PI+W*QI-W*QR)/2  W*QR/2  W*QI/2  PI   QR+1 2
            SACH    *+,0,AR2    ;PI':=(PI+W*QI-W*QR)/2  W*QR/2  W*QI/2  PR+1 QR+1 2 
            
        .endm

                                                                 
;----------------------------------------------------
; MACRO 'P3BY4I'        
; 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
; ARP=2
; 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

⌨️ 快捷键说明

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