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<