?? rfft128sc.asm
字號:
;============================================================================
;
; File Name : rfft128sc.asm
;
; Originator : Digital Control Systems Group
; Texas Instruments
;
; Description : This file contain source code of split function for
; 128-point Real FFT
;
; Date : 26/4/2001 (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 {
; int *ipcbptr;
; int *magptr;
; int peakmag;
; int peakfrq;
; int normflag;
; int size;
; int *winptr;
; void (*init1)(void);
; void (*init2)(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)
;
;======================================================================
; Function Local Frame
;======================================================================
; |_______|
; |_______|<- Stack Pointer (FP+1) <---AR1
; |_______|<- Reg to Reg Tfr (FP) <---AR7
; |_______|<- Old FP (AR0) (FP-1)
; |_______|<- Context Save of AR7 (FP-2)
; |_______|<- Context Save of AR6 (FP-3)
; |_______|<- Return Address of the Caller (FP-4)
; |_______|<- Module Handle (FP-5)
;
;===================================================================
;
;======================================================================
TWON .set 128
__FFTR_split_frs .set 00001h ; Local frame size for this routine
.def _FFT128R_split ; Function External Reference
.def _FFT128R_init ;
_FFT128R_split:
POPD *+ ; Store the Return Address in stack
SAR AR0,*+ ; Store the Caller's Frame Pointer
SAR AR6,*+ ; AR6 Context Save
SAR AR7,*+ ; AR7 Context Save
SAR AR1,*
LAR AR7,*
LAR AR0,#__FFTR_split_frs
LAR AR0,*0+,AR2 ; Create Local frame
SETC SXM
SPM #0
LAR AR2,#0FFFBh ; ARP=AR2, AR2=-5
MAR *0+ ; ARP=AR2, AR2->module handle
LAR AR2,* ; ARP=AR2, AR2->ipcbptr
LAR AR3,* ; ARP=AR2, AR2->ipcbptr, AR3=ipcbptr
LAR AR4,*,AR4 ; ARP=AR4, AR4=ipcbptr
LAR AR0,#(TWON)
MAR *0+,AR3 ; ARP=AR3, AR3->R(0), AR4->GR(N)
LAR AR5,#(TWID-1+TWON/4); COS(Angle)--->decrement
LAR AR6,#(TWID+1) ; SIN(Angle)--->increment
LAR AR0,#(TWON/4)-2
LACC *+,15 ; ARP=AR3, AR3->I(0), ACC=RP(0), Where RP(0)=R(0)
SUB *,15,AR4 ; ARP=AR4, AR4->GR(N), ACC=RP(0)-IP(0), Where IP(0)=I(0)
SACH *+ ; ARP=AR4, AR4->GI(N), GR(N)={RP(0)-IP(0)}/2 in Q15
SPLK #0,*- ; ARP=AR4, AR4-GR(N), GI(N)=0
MAR *-,AR3 ; ARP=AR3, AR3->I(0), AR4->I(N-k)
ADD *-,16 ; ARP=AR3, AR3->R(0), ACC=RP(0)+IP(0), Where IP(0)=I(0)
SACH *+ ; ARP=AR3, AR3->I(0), GR(0)={RP(0)+IP(0)}/2 in Q15
SPLK #0,*- ; ARP=AR3, AR3->R(0), GI(0)=IM(0)-RM(0), Where IM(0)=RM(0)=0
SPLITFN: ADRK #3 ; ARP=AR3, AR3->I(k), Where k=1:
LACC *,15,AR4 ; ARP=AR4, AR4->I(N-k), ACC=I(k)/2
SUB *,15,AR3 ; ARP=AR3, AR3->I(k), ACC={I(k)-I(N-k)}/2
SACH *-,0,AR4 ; ARP=AR4, AR4->I(N-k), AR3->R(k), I(k)=IM(k)={I(k)-I(N-k)}/2
ADD *,16 ; ARP=AR4, AR4->I(N-k), ACC={I(k)+I(N-k)}/2
SACH *-,0,AR3 ; ARP=AR3, AR3->R(k), AR4->R(N-k), I(N-k)=IP(k)={I(k)+I(N-k)}/2
LACC *,15,AR4 ; ARP=AR4, AR4->R(N-k), ACC=R(k)/2
ADD *,15,AR3 ; ARP=AR3, AR3->R(k), ACC={R(k)+R(N-k)}/2
SACH *,0,AR4 ; ARP=AR4, AR4->R(N-k), AR3->R(k), R(k)=RP(k)={R(k)-R(N-k)}/2
SUB *,16 ; ARP=AR4, AR4->R(N-k), ACC={R(k)-R(N-k)}
SACH *+,0,AR5 ; ARP=AR5, AR5->WR(k), AR4->I(N-k), R(N-k)=RM(k)={R(k)+R(N-k)}/2
; TREG AR6 AR5 AR3 AR4 ARP
LT *,AR4 ; TREG=WR(k) WR(k) WI(k) WR(k) RP(k) IP(k) 4
MPY *-,AR6 ; PREG=WR(k)*IP(k) WR(k) WI(k) WR(k) RP(k) RM(k) 6
LTP *+,AR4 ; ACC=WR(k)*IP(k) WI(k) WI(k+1) WR(k) RP(k) RM(k) 4
MPY *+ ; PREG=WI(k)*RM(k) WI(k) WI(k+1) WR(k) RP(k) IP(k) 4
MPYS *-,AR7 ; ACC=WR(k)*IP(k)-WI(k)*RM(k)
; PREG=WI(k)*IP(k) WI(k) WI(k+1) WR(k) RP(k) RM(k) 7
SACH *,1,AR3 ; T1=WR(k)*IP(k)-WI(k)*RM(k) WI(k) WI(k+1) WR(k) RP(k) RM(k) 3
ADD *,15 ; ACC=RP(k)+WR(k)*IP(k)-WI(k)*RM(k)
SACH *+,0,AR7 ; GR(k)={RP(k)+WR(k)*IP(k)-WI(k)*RM(k)}/2 in Q15
; WI(k) WI(k+1) WR(k) IM(k) RM(k) 7
SUB *,16,AR4 ; ACC={RP(k)-WR(k)*IP(k)+WI(k)*RM(k)}/2 in Q15
; WI(k) WI(k+1) WR(k) IM(k) RM(k) 4
LT * ; TREG=RM(k) RM(k) WI(k+1) WR(k) IM(k) RM(k) 4
SACH *+,0,AR5 ; GR(N-k)={RP(k)-WR(k)*IP(k)+WI(k)*RM(k)}/2 in Q15
; RM(k) WI(k+1) WR(k) IM(k) IP(k) 5
PAC ; ACC=WI(k)*IP(k) RM(k) WI(k+1) WR(k) IM(k) IP(k) 5
MPY *-,AR7 ; PREG=WR(k)*RM(k) RM(k) WI(k+1) WR(k+1) IM(k) IP(k) 7
APAC ; ACC=WI(k)*IP(k)+WR(k)*RM(k) RM(k) WI(k+1) WR(k+1) IM(k) IP(k) 5
SACH *,1,AR3 ; T1=WI(k)*IP(k)+WR(k)*RM(k) RM(k) WI(k+1) WR(k+1) IM(k) IP(k) 3
LACL #0 ; ACC=0 RM(k) WI(k+1) WR(k+1) IM(k) IP(k) 3
SUB *,15,AR7 ; ACC=-IM(k) RM(k) WI(k+1) WR(k+1) IM(k) IP(k) 7
SUB *,15,AR4 ; ACC=-IM(k)-WI(k)*IP(k)-WR(k)*RM(k)
; RM(k) WI(k+1) WR(k+1) IM(k) IP(k) 4
SACH *-,0,AR3 ; GI(N-k)={-IM(k)-WI(k)*IP(k)-WR(k)*RM(k)}/2 in Q15
; RM(k) WI(k+1) WR(k+1) IM(k) RM(k) 3
ADD *,16 ; ACC=IM(k)-WI(k)*IP(k)-WR(k)*RM(k)
SACH *-,0,AR4 ; GI(k)={IM(k)-WI(k)*IP(k)-WR(k)*RM(k)}/2 in Q15
; RM(k) WI(k+1) WR(k+1) RP(k) RM(k) 4
MAR *-,AR0 ; RM(k) WI(k+1) WR(k+1) RP(k) I(N-k) 4
BANZ SPLITFN,*-,AR3 ;
LACL #0
MAR *,AR4
SUB *,15
SACH *- ; GI(TWON/4)=-I(4)/2
LACC *,15
SACH *,0,AR1 ; GR(TWON/4)=R(4)/2
SBRK #(__FFTR_split_frs+1) ; Clear the local frame
LAR AR0,*- ; Retrive Caller's frame pointer
LAR AR7,*-
LAR AR6,*-
PSHD * ; Push the return address to TOS
RET ; Return to the caller
;================================================================================
; TWIDDLE FACTOR INITIALISATION
;===============================================================================
; Twiddle factor Initialisation
_FFT128R_init:
POPD *+
LAR AR2,#TWID ; Copy the twiddle factor from ROM to RAM
LACC #TF_LOAD_STRT_ADR
MAR *,AR2
LAR AR3, #(TF_LOAD_END_ADR-TF_LOAD_STRT_ADR-1)
loop1: TBLR *+,AR3
ADD #1
BANZ loop1,*-,AR2
MAR *,AR1
SBRK #1
PSHD * ; Push the return address to TOS
RET
;--------------------------------------------------------------------------
; TWIDDLE FOR 128 Real FFT split function(32 ENTRIES)
;--------------------------------------------------------------------------
.sect "FFTtf"
.label TF_LOAD_STRT_ADR
TWID: .word 0,1608,3212,4808,6393,7962,9512,11039,12540,14010
.word 15447,16846,18205,19520,20788,22006,23170,24279,25330,26320
.word 27246,28106,28899,29622,30274,30853,31357,31786,32138,32413
.word 32610,32729
.label TF_LOAD_END_ADR
?? 快捷鍵說明
復(fù)制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -