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

📄 fft32.asm

📁 本光盘为《TMS320X240xDSP原理及应用开发指南》一书随书光盘。 本光盘包含两部分内容: 1. 《TMS320X240x DSP原理及应用开发指南》一书的前言; 2. 《TMS320X2
💻 ASM
📖 第 1 页 / 共 3 页
字号:
;=========================================================================
;文件名:		fft32.asm
;日期:      	2007年2月25日
;公司(作者):  
;描述和说明:	32点FFT汇编子程序
;=========================================================================

; Module definition for external referance
            .def    _FFT32C_calc       ;
            .def    _FFT32C_init       ; Copy Twiddle factor   
N           .set    32                 ; FFT Length    
NSTG        .set    5                   ; Number of Stage
COS45K      .set    05A82h              ; Constant for COS(45)

;第一个函数 
;===============================================================================
; FFT - Computation Routine  (FFT32R_calc)
;===============================================================================
;   * This routine takes the 32 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)
;===============================================================================            
;                                                   (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
;------------------------------------------------------         
;                                                   (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  
        
;------------------------------------------------------         
;                                                       (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
;------------------------------------------------------         
;                                                           (Content of REG after exec.)
P3BY4I  .macro  p,m                 ;                       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
            MPYA    *-              ;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
            APAC                    ;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    *:m:+,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    *:m:+,0,AR:p:   ;PI':=(PI-W*QI-W*QR)/2  W*QR/2  W*QI/2  PR+1 QR+1 :P: 
            
        .endm  

;------------------------------------------------------         
;                                                           (Content of REG after exec.)
BFLY    .macro  p                   ;                         TREG  AR6     AR2     AR3     AR4     ARP
                                   
            LT      *+,AR3          ;TREG:=QR                 QR    PR      QI      WR      WI      3
            MPY     *,AR2           ;PREG:=(QR*WR)/2          QR    PR      QI      WR      WI      2
            LTP     *-,AR4          ;ACC:=(QR*WR)/2           QI    PR      QR      WR      WI      4 
            MPY     *,AR3           ;PREG:=(QI*WI)/2          QI    PR      QR      WR      WI      3
            MPYA    *0+,AR2         ;ACC:=(QR*WR+QI*WI)/2     QI    PR      QR      WR+n    WI      2
                                    ;PREG:=QI*WR
            LT      *,AR5           ;TREG:=QR                 QR    PR      QR      WR+n    WI      5
            SACH    *,1,AR6         ;TEMP:=QR*WR+QI*WI        QR    PR      QR      WR+n    WI      6
            
            ADD     *,15            ;ACC:=(PR+QR*WR+QI*WI)/2  QR    PI      QR      WR+n    WI      6
            SACH    *+,AR5          ;PR':=(PR+QR*WR+QI*WI)/2  QR    PI      QR      WR+n    WI      5
            SUB     *,16,AR2        ;ACC:=(PR-QR*WR-QI*WI)/2  QR    PI      QR      WR+n    WI      2 
            SACH    *+,0,AR6        ;QR':=(PR-QR*WR-QI*WI)/2  QR    PI      QI      WR+n    WI      6 
            
            LACC    *,15,AR4        ;ACC:=PI/2                QR    PI      QI      WR+n    WI      4
            MPYS    *0+,AR2         ;ACC:=(PI-QI*WR)/2        QR    PI      QI      WR+n    WI+n    2
                                    ;PREG:=QR*WI
            APAC                    ;ACC:=(PI-QI*WR+QR*WI)/2  QR    PI      QR+1    WR+n    WI+n    2
            SACH    *+,0,AR6        ;QI':=(PI-QI*WR+QR*WI)/2  QR    PI      QR+1    WR+n    WI+n    6
            NEG                     ;ACC:=(-PI+QI*WR-QR*WI)/2 QR    PI      QR+1    WR+n    WI+n    6
            ADD     *,16            ;ACC:=(PI+QI*WR-QR*WI)/2  QR    PI      QR+1    WR+n    WI+n    6
            SACH    *+,0,AR:p:      ;PI':=(PI+QI*WR-QR*WI)/2  QR    PR+1    QR+1    WR+n    WI+n   :p:
        .endm
;------------------------------------------------------         
;                                                           (Content of REG after exec.)            
            
COMBO   .macro                  ;                           AR6 AR2 AR3 AR4 AR5 ARP 
            LACC    *,14,AR4    ;ACC:=R3/4                  R1  R2  R3  R4  T1  4
            SUB     *,14,AR5    ;ACC:=(R3-R4)/4             R1  R2  R3  R4  T1  5
            SACH    *+,1,AR4    ;T1:=(R3-R4)/2              R1  R2  R3  R4  T2  4  
            
            ADD     *+,15,AR5   ;ACC:=(R3+R4)/4             R1  R2  R3  I4  T2  5
            SACH    *,1,AR2     ;T2:=(R3+R4)/2              R1  R2  R3  I4  T2  2
            
            ADD     *,14,AR6    ;ACC:=(R2+R3+R4)/4          R1  R2  R3  I4  T2  6
            ADD     *,14        ;ACC:=(R1+R2+R3+R4)/4       R1  R2  R3  I4  T2  6
            SACH    *+,0,AR5    ;R1':=(R1+R2+R3+R4)/4       I1  R2  R3  I4  T2  5
            SUB     *,16,AR3    ;ACC:=(R1+R2-R3-R4)/4       I1  R2  R3  I4  T2  3
            SACH    *+,0,AR5    ;R3':=(R1+R2-R3-R4)/4       I1  R2  I3  I4  T2  5
            
            ADD     *,15,AR2    ;ACC:=(R1+R2)/4             I1  R2  I3  I4  T2  2
            SUB     *,15,AR3    ;ACC:=(R1-R2)/4             I1  R2  I3  I4  T2  3
            ADD     *,14,AR4    ;ACC:=(R1-R2+I3)/4          I1  R2  I3  I4  T2  4
            SUB     *,14,AR2    ;ACC:=(R1-R2+I3-I4)/4       I1  R2  I3  I4  T2  2
            SACH    *+,0,AR4    ;R2':=(R1-R2+I3-I4)/4       I1  I2  I3  I4  T2  2
            ADD     *-,15,AR3   ;ACC:=(R1-R2+I3+I4)/4       I1  I2  I3  R4  T2  2
            SUB     *,15,AR4    ;ACC:=(R1-R2-I3+I4)/4       I1  I2  I3  R4  T2  4
            SACH    *+,0,AR6    ;R4':=(R1-R2-I3+I4)/4       I1  I2  I3  I4  T2  6
            
            LACC    *,14,AR2    ;ACC:=I1/4                  I1  I2  I3  I4  T2  2
            SUB     *,14,AR5    ;ACC:=(I1-I2)/4             I1  I2  I3  I4  T2  5
            SACH    *,1,AR2     ;T2:=(I1-I2)/2              I1  I2  I3  I4  T2  2
            ADD     *,15,AR3    ;ACC:=(I1+I2)/4             I1  I2  I3  I4  T2  3
            ADD     *,14,AR4    ;ACC:=(I1+I2+I3)/4          I1  I2  I3  I4  T2  3
            ADD     *,14,AR6    ;ACC:=(I1+I2+I3+I4)/4       I1  I2  I3  I4  T2  6
            SACH    *0+,0,AR3   ;I1':=(I1+I2+I3+I4)/4       R5  I2  I3  I4  T2  3
            SUB     *,15,AR4    ;ACC:=(I1+I2-I3+I4)/4       R5  I2  I3  I4  T2  4
            SUB     *,15,AR3    ;ACC:=(I1+I2-I3-I4)/4       R5  I2  I3  I4  T2  3
            SACH    *0+,0,AR5   ;I3':=(I1+I2-I3-I4)/4       R5  I2  R7  I4  T2  5
            
            LACC    *-,15       ;ACC:=(I1-I2)4              R5  I2  R7  I4  T1  5
            SUB     *,15,AR2    ;ACC:=(I1-I2-R3+R4)/4       R5  I2  R7  I4  T1  2
            SACH    *0+,0,AR5   ;I2':=(I1-I2-R3+R4)/4       R5  R6  R7  I4  T1  5
            ADD     *,16,AR4    ;ACC:=(I1-I2+R3-R4)/4       R5  R6  R7  I4  T1  4 
            SACH    *0+,0,AR7   ;I4':=(I1-I2+R3-R4)/4       R5  R6  R7  R8  T1  7 
        .endm
                                
;----------------------------------------------------------------------
; FFT Computation Routine
;----------------------------------------------------------------------
__FFT32C_calc_frs  .set    00009h  ; Local frame size for this routine 

_FFT32C_calc:
            POPD    *+              ; Store the Return Address in stack
            SAR     AR6,*+          ; Entry On Save Register AR6
            SAR     AR7,*+          ; Entry On Save Registe AR7
            SAR     AR0,*+          ; Store the Caller's Frame Pointer
            SAR     AR1,*                 
            LAR     AR5,*           ; AR5=FP    
            LAR     AR0,#__FFT32C_calc_frs     
            LAR     AR0,*0+,AR7     ; Create Local frame 
            SETC    SXM
            SPM     #0    
            LAR     AR7,#0FFFBh     ; ARP=AR7, AR7=-5    
            MAR     *0+             ; ARP=AR7, AR7->FFT32C_handle->ipcbptr
            LAR     AR7,*           ; ARP=AR7, AR7->&ipcb[0]  

            LAR     AR6,*,AR5       ; ARP=AR5, AR5->ipcbptr(Stack), AR6=ipcbptr
            SAR     AR6,*           ; ARP=AR5, AR5->ipcbptr(Stack), ipcbptr(Stack)=ipcbptr
            ADRK    #6              ; ARP=AR5, AR5->T1
            MAR     *,AR7
;-----------------------------------------------------------------
; Stage 1 & 2 - Using the RADIX 4 COMBO Macro
;-----------------------------------------------------------------
                   
            LAR     AR6,*           ; ARP=AR7, AR7->&ipcb[0], AR6=&ipcb[0]
            LAR     AR0,*,AR2       ; ARP=AR2, AR2=xxxxh, AR7->&ipcb[0], AR0=&ipcb[0]
            LAR     AR2,#2          ; ARP=AR2, AR2=2

⌨️ 快捷键说明

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