|
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: 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
|