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

📄 rfft32s.asm

📁 TMS320F2812 FFT 源码,包括详细的应用文档
💻 ASM
字号:
;============================================================================
;
; File Name     : rfft128sc.asm
; 
; Originator    : Advanced Embeeded Control 
;                 Texas Instruments 
; 
; Description   : This file contain source code of split function for Real FFT
;               
; Date          : 26/2/2002 (dd/mm/yyyy)
;===========================================================================    
; Routine Type  : C Callable        
;
; Description   :
; void FFT128R_split(FFTxxxx_handle) 
; This function perfroms split operation to obtain 65 spectran bins of
; 128-point real valued sequence from the 64-point complex FFT output
; 
; void FFT128R_init(void)
; This function copies the Twiddle factors for split function from 
; load time address to its run time address 
;
;======================================================================
; REAL FFT MODULES
;----------------------------------------------------------------------
;typedef struct {   
;       long *ipcbptr;
;       long *tfptr;               
;       int size;
;       int nrstage;             
;       long *magptr;
;       long *winptr; 
;       long peakmag;
;       int peakfrq;
;       int ratio;     
;       void (*init)(void);
;       void (*calc)(void *);
;       void (*split)(void *);
;       void (*mag)(void *);
;       void (*win)(void *);
;       }FFTxxxR;
;===============================================================================
; Computation Buffer  for k=1:(N/2)-1) & N=64
;==============================================================================         
;
; Non Bitrev I/P    COMPLEX FFT(N) O/P    E/O SEPERATION                Final FFT output
; ___________       ______________        ____________                  ___________
; |__g(0)____|      |__R(0)______|        |___RP(0)__| =R(0)            |__GR(0)__| = {RP(0)+IP(0)}/2
; |__g(1)____|      |__I(0)______|        |___IP(0)__| =I(0)            |__GI(0)__| = 0
; |__g(2)____|      |__R(k)______|        |___RP(k)__|                  |_________|
; |__g(3)____|      |__I(k)______|        |___IM(k)__|                  |_________|
; |__________|      |____________|        |__________|                  |_________|
; |__________|      |____________|        |__________|                  |_________|
; |__________|      |____________|        |__________|                  |_________|
; |__________|      |__R(N/2)____|        |_RP(N/2___| =R(N/2)          |_GR(N/2)_| =RP(N/2)/2
; |__________|      |__R(N/2)____|        |_IP(N/2)__| =I(N/2)          |_GI(N/2)_| =-IP(N/2)/2
; |__________|      |____________|        |__________|                  |_________|
; |__________|      |____________|        |__________|                  |_________|
; |__________|      |____________|        |__________|                  |_________|
; |__________|      |____________|        |__________|                  |_________|
; |__________|      |___R(N-k)___|        |___RM(k)__|                  |_GR(N-1)_|
; |_g(2*N-1)_|      |___I(N-k)___|        |___IP(k)__|                  |_GI(N-1)_|
;                                                                       |__GR(N)__|={RP(0)-IP(0)}/2
;                                                                       |__GI(N)__|=0
;
;===========================================================================
;                      Note:   IM(0)=RM(0)=0
;                              RM(N/2)=IM(N/2)=0                            
;===========================================================================
; EVEN/ODD FFT SEPERATION
;===========================================================================
; RP(K) = [R(K) +  R(N-k)]/2
; RM(K) = [R(K) -  R(N-K)]/2
; IP(K) = [I(K) + I(N-K)]/2 
; IM(K) = [I(K) - I(N-K)]/2    K=1:N/2
;=========================================================================
; EVEN/ODD FFT MERGE
;========================================================================= 
; GR(K)={RP(K) - WI(K)*RM(K) + WR(K)*IP(K)}/2
; GI(K)={IM(K) - WI(K)*IP(K) - WR(K)*RM(K)}/2
; GR(N-K)={RP(K) + WI(K)*RM(K) - WR(K)*IP(K)}/2
; GI(N-K)={-IM(K) - WI(K)*IP(K) - WR(K)*RM(K)}/2 
; 
; WR(k) <-- Cosine table (AR5)
; WI(K) <-- Sine table   (AR2)     
;======================================================================                       
        .include "sel_q.asm"

                    .def   _RFFT32_split   ; Function External Reference
                    
_RFFT32_split:            
            PUSH    XAR1            ; Context Save
            PUSH    XAR2
            PUSH    XAR3 
           
            SETC    SXM
            SPM     -1

            MOV     ACC,*+XAR4[4]<<2; ACC=4*size
            MOVL    XAR2,*XAR4      ; XAR2=ipcbptr ----->R(0)
            ADDL    ACC,*XAR4       ; XAR3=ipcbptr+4*size
            MOVL    XAR3,ACC        ; XAR3 ------>GR(N)
        
            MOVL    XAR5,*+XAR4[2]  ; XAR5=tfptr -----> WI
            MOVL    XAR6,*+XAR4[2]  ; XAR6=tfptr    
            
            MOV     T,*XAR4         ; T=size

            MOV     ACC,*+XAR4[4]<<15  ; AH=size/2
            MOVZ    AR7,AH          ; XAR7=size/2
            SUBB    XAR7,#2         ; XAR7=(size/2)-2
            ADDB    XAR4,#13        
            MOV     T,*XAR4         ; T=ratio
            MOVZ    AR0,*XAR4       ; AR0=ratio
            SUBB    XAR4,#13        
            MPY     ACC,T,AH        ; ACC=ratio*size/2
            ADDL    ACC,*+XAR4[2]   ; 
            MOVL    XAR6,ACC        ; WRWIOST=tfptr+ratio*N/2 ----> COS(Angle)
            
            NOP     *,ARP5          ; XAR5 ----> WI SIN(Angle)--->increment
            NOP     *0++
            NOP     *,ARP6
            NOP     *0--            ; XAR6 ----> WR COS(Angle)--->decrement
                
            MOV     TL,#0
            MOV     T,#0
; DC and Nyquist Bins
            ZAPA                    ; ACC=0,P=0
            MOVL    ACC,*XAR2       ; ACC=RP(0), where RP(0)=R(0)
            SFR     ACC,#1          ; ACC=RP(0)/2
            MOVL    P,*+XAR2[2]     ; P=IP(0), where IP(0)=I(0)
            SUBL    ACC,P<<PM       ; ACC={RP(0)-IP(0)}/2 in Q31
            MOVL    *XAR3++,ACC     ; GR(N)={RP(0)-IP(0)}/2 in Q31
            MOVL    *XAR3++,XT      ; GI(N)=0
            SUBB    XAR3,#8         ; XAR3->R(N-K)

            ADDL    ACC,P           ; ACC={RP(0)+IP(0)}/2 in Q31
            MOVL    *XAR2++,ACC     ; GR(0)={RP(0)+IP(0)}/2
            MOVL    *XAR2++,XT      ; XAR2->R(k), GI(0)=IM(0)-RM(0), Where IM(0)=RM(0)=0            
            
; Rest of bins                              
nextbin:                            ; XAR2->R(k), Where k=1:N/2-1 
            MOVL    ACC,*XAR2       ; ACC=R(k)
            SFR     ACC,#1          ; ACC=R(k)/2
            MOVL    P,*XAR3         ; P=R(N-k)
            SUBL    ACC,P<<PM       ; ACC={R(k)-R(N-k)}/2
            
            MOVL    *XAR3,ACC       ; R(k)=RM(k)={R(k)-R(N-k)}/2
            ADDL    ACC,P           ; ACC={R(k)+R(N-k)}/2
            MOVL    *XAR2,ACC       ; R(N-k)=RP(k)={R(k)+R(N-k)}/2
            
            MOVL    ACC,*+XAR2[2]   ; ACC=I(k)
            SFR     ACC,#1          ; ACC=I(k)/2
            MOVL    P,*+XAR3[2]     ; P=I(N-k)
            SUBL    ACC,P<<PM       ; ACC={I(k)-I(N-k)}/2
            
            MOVL    *+XAR2[2],ACC   ; I(k)=IM(k)={I(k)-I(N-k)}/2
            ADDL    ACC,P           ; ACC={I(k)+I(N-k)}/2
            MOVL    *+XAR3[2],ACC   ; I(N-k)=IP(k)={I(k)+I(N-k)}/2
            
            MOVL    XT,*XAR5        ; XT=WI(k)
            NOP     *0++
            QMPYL   ACC,XT,*+XAR3[2]; ACC=WI(k)*IP(k)
            QMPYL   P,XT,*XAR3      ; P=WI(k)*RM(k)
            MOVL    XAR1,ACC        ; XAR1=WI(k)*IP(k)

            MOVL    XT,*XAR6        ; XT=WR(k)
            NOP     *0--
            QMPYL   ACC,XT,*+XAR3[2]; P=WR(k)*IP(k)
            SUBL    ACC,P           ; ACC=WR(k)*IP(k)-WI(k)*RM(k)
            
            .if(TF_QFMAT==Q30)
            LSL     ACC,#1          
            .endif

            MOVL    P,*XAR2         ; P=RP(k)
            ADDL    ACC,P<<PM       ; ACC=RP(k)+WR(k)*IP(k)-WI(k)*RM(k) in Q30
            MOVL    *XAR2++,ACC     ; GR(k)={RP(k)+WR(k)*IP(k)-WI(k)*RM(k)}/2 in Q31
            NEG     ACC             ;
            ADDL    ACC,P           ; ACC=GR(N-k)=RP(k)-WR(k)*IP(k)+WI(k)*RM(k) in Q30
            QMPYL   P,XT,*XAR3      ; P=WR(k)*RM(k)         
            MOVL    *XAR3,ACC       ; ACC=GR(N-k)={RP(k)-WR(k)*IP(k)+WI(k)*RM(k)}/2 in Q31
            
            MOVL    ACC,XAR1        ; ACC=WI(k)*IP(k)
            NEG     ACC             ; ACC=-WI(k)*IP(k)
            SUBL    ACC,P           ; ACC=-WI(k)*IP(k)-WR(k)*RM(k)

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

            MOVL    P,*XAR2         ; P=IM(k)
            ADDL    ACC,P<<PM       ; ACC=IM(K)-WI(k)*IP(k)-WR(k)*RM(k) in Q30
            MOVL    *XAR2++,ACC     ; GI(k)={IM(k)-WI(k)*IP(k)-WR(k)*RM(k)}/2 in Q31
            SUBL    ACC,P           ; ACC=-IM(K)-WI(k)*IP(k)-WR(k)*RM(k) in Q30
            MOVL    *+XAR3[2],ACC   ; GI(N-k)={-IM(k)-WI(k)*IP(k)-WR(k)*RM(k)}/2 in Q31
            SUBB    XAR3,#4         
            BANZ    nextbin,AR7--   
            
            MOVL    ACC,*XAR2       ; ACC=R(N/2)
            SFR     ACC,#1          ; ACC=R(N/2)/2
            MOVL    *XAR2,ACC       ; GR(N/2)=R(N/2)/2

            MOVL    ACC,*+XAR2[2]   ; ACC=I(N/2)
            NEG     ACC             ; ACC=-I(N/2)
            SFR     ACC,#1          ; ACC=-I(N/2)/2
            MOVL    *+XAR2[2],ACC   ; GI(N/2)=-I(N/2)/2         

            SPM     0               
            POP     XAR3            ; Context Restore
            POP     XAR2
            POP     XAR1 
            LRETR
 
  
            
            
            
            
            
              
            
            
            
            
                                                       
            
                                        
            
            
            
            
            
               
            





⌨️ 快捷键说明

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