www.pudn.com > x28x_FFT.rar > rfft32s.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:             
            ASP                     ; Align Stack Pointer 
            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<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<