|
****************************************************************** *** N(8-1024) points FFT Program *** ****************************************************************** .title "fft.asm" .mmregs .copy "coeff.inc" .def _c_int00 sine: .usect "sine",512 cosine: .usect "cosine",512
fft_data: .usect "fft_data",2048 d_input: .usect "d_input",2048 fft_out: .usect "fft_out",1024 STACK .usect "STACK",10 K_DATA_IDX_1 .set 2 K_DATA_IDX_2 .set 4 K_DATA_IDX_3 .set 8 K_TWID_TBL_SIZE .set 512 K_TWID_IDX_3 .set 128 K_FLY_COUNT_3 .set 4 *** N points FFT *** K_FFT_SIZE .set 16 ;N=8 K_LOGN .set 4 ;LOG(N)=LOG(8)=3
.bss d_twid_idx,1 .bss d_data_idx,1 .bss d_grps_cnt,1 .sect "fft_prg" ; *** Bit Reversal Routine *** .asg AR2,REORDERED .asg AR3,ORIGINAL_INPUT .asg AR7,DATA_PROC_BUF .text _c_int00: SSBX FRCT STM #STACK+10,SP NOP ;put a probe,input 2N data into d_input(dm) ;include Re and Im STM #sine,AR1 ;move sine1(512) into sine(dm) RPT #511 ; MVPD sine1,*AR1+
STM #cosine,AR1 ;move cosine1 into cosine RPT #511 ; MVPD cosine1,*AR1+
STM #d_input,ORIGINAL_INPUT STM #fft_data,DATA_PROC_BUF MVMM DATA_PROC_BUF,REORDERED ;RECORDERED point fft_data too STM #K_FFT_SIZE-1,BRC RPTBD bit_rev_end-1 STM #K_FFT_SIZE,AR0 ;this is double words order MVDD *ORIGINAL_INPUT+,*REORDERED+ ;Bit Reversal MVDD *ORIGINAL_INPUT-,*REORDERED+ MAR *ORIGINAL_INPUT+0B bit_rev_end: * * * * FFT Code * * * * * .asg AR1,GROUP_COUNTER .asg AR2,PX .asg AR3,QX .asg AR4,WR .asg AR5,WI .asg AR6,BUTTERFLY_COUNTER .asg AR7,STAGE_COUNTER * * * stage 1 * * * STM #0, BK ;why not=16? LD #0, ASM ;LD #-1, ASM ;protect flowover ,all output/2 STM #fft_data,PX LD *PX,16,A ;AH:=Re[x(0)] STM #fft_data+K_DATA_IDX_1,QX ;QX point Re[x(4)] STM #K_FFT_SIZE/2-1,BRC ;stage 1 is N/2-1 RPTBD stage1end-1 STM #K_DATA_IDX_1+1,AR0 SUB *QX,16,A,B ;BH=Re[x(0)]-Re[x(4)] ADD *QX,16,A ;AH=Re[x(0)]+ Re[x(4)] STH A,ASM,*PX+ ST B,*QX+ ||LD *PX,A SUB *QX,16,A,B ;BH=Im[x(0)]-Im[x(4)] ADD *QX,16,A ;AH=Im[x(0)]+Im[x(4)] STH A,ASM,*PX+0 ST B,*QX+0% ;BK=0 why here circle access ? ||LD *PX,A stage1end: * * * Stage 2 * * * STM #fft_data,PX STM #fft_data+K_DATA_IDX_2,QX STM #K_FFT_SIZE/4-1,BRC LD *PX,16,A ;AH=Re[x(0)]+ Re[x(4)],AH=1 RPTBD stage2end-1 STM #K_DATA_IDX_2+1,AR0 ;1st butterfly SUB *QX,16,A,B ;BH={Re[x(0)]+ Re[x(4)]}-{Re[x(2)]+ Re[x(6)]},BH=0 ADD *QX,16,A ;AH={Re[x(0)]+ Re[x(4)]}+{Re[x(2)]+ Re[x(6)]},AH=2 STH A,ASM,*PX+ ST B,*QX+ ||LD *PX,A SUB *QX,16,A,B ;BH={Im[x(0)]+ Im[x(4)]}-{Im[x(2)]+ Im[x(6)]},BH=0 ADD *QX,16,A ;AH={Im[x(0)]+ Im[x(4)]}+{Im[x(2)]+ Im[x(6)]},BH=0 STH A,ASM,*PX+ STH B,ASM,*QX+ ;2nd butterfly MAR *QX+ ADD *PX,*QX,A ;AH={Re[x(0)]-Re[x(4)]}+{Im[x(2)]-Im[x(6)]},=1 SUB *PX,*QX-,B ;BH={Re[x(0)]-Re[x(4)]}-{Im[x(2)]-Im[x(6)]},=1 STH A,ASM,*PX+ SUB *PX,*QX,A ;AH={Im[x(0)]-Im[x(4)]}-{Re[x(2)]-Re[x(6)]},=-1,note:sub ST B,*QX ||LD *QX+,B ;very important, " BH= {Re[x(2)]- Re[x(6)]} ",=1 ****************************************************************************************** ST A,*PX ; right!!! ||ADD *PX+0%,A ; note:this order include BH ST A,*QX+0% ; ||LD *PX,A ***************** my modify*************************************************************** ; ST A,*PX ; ||ADD *PX+0%,B ; ST B,*QX+0% ; ||LD *PX,A ***************************************************************************************** stage2end: * * * Stage 3 through Stage logN * * * STM #K_TWID_TBL_SIZE,BK ST #K_TWID_IDX_3,d_twid_idx STM #K_TWID_IDX_3,AR0 STM #cosine,WR STM #sine,WI STM #K_LOGN-2-1,STAGE_COUNTER ST #K_FFT_SIZE/8-1,d_grps_cnt STM #K_FLY_COUNT_3-1,BUTTERFLY_COUNTER ST #K_DATA_IDX_3,d_data_idx stage: STM #fft_data,PX LD d_data_idx,A ;A:=8 ADD *(PX),A ;A:=2008 STLM A,QX ;this time QX piont what? ;my thought:point the eighth space(ccs test) ;may relocate QX pointer MVDK d_grps_cnt,GROUP_COUNTER group: MVMD BUTTERFLY_COUNTER,BRC RPTBD butterflyend-1 LD *WR,T ;T:=1,cos0 MPY *QX+,A ;A=000001FFFC MACR *WI+0%,*QX-,A ;T=0,sin0,WI next piont 0.707,-1 ADD *PX,16,A,B ;B=0000040000,0000010000 ST B,*PX ;the first ouput:1/8*{...} ||SUB *PX+,B ;B=0000000000,0000010000 ST B,*QX ; ||MPY *QX+,A ;A=0000000000,000000B504 MASR *QX,*WR+0%,A ;T=0 ,WR next piont 0.707,0 ;SFTL A,4,A ADD *PX,16,A,B ;B=0000000000,OVB=1 ST B,*QX+ ||SUB *PX,B ;B=0000000000 ,00FFFE0000 LD *WR,T ;T:=0.707,0 ST B,*PX+ ; ||MPY *QX+,A ********************************************************* butterflyend: ; Update pointers for next group PSHM AR0 MVDK d_data_idx,AR0 MAR *PX+0 MAR *QX+0 BANZD group,*GROUP_COUNTER- POPM AR0 MAR *QX- ;Update counters and indices for next stage LD d_data_idx,A ;A:=8 SUB #1,A,B ;B:=7 STLM B,BUTTERFLY_COUNTER ;butterfly_counter:=7 STL A,1,d_data_idx ;d_data_idx:=4 LD d_grps_cnt,A ;A:=0(8/8-1) STL A,ASM,d_grps_cnt ;d_grps_cnt=A/2 LD d_twid_idx,A ;A:=128 STL A,ASM,d_twid_idx ;d_twid_idx=A/2 BANZD stage,*STAGE_COUNTER- ;stage_counter:=0 MVDK d_twid_idx,AR0 fft_end: * * * Compute the power spectrum * * * STM #fft_data,AR2 STM #fft_out,AR4 STM #K_FFT_SIZE-1,BRC NOP RPTB power_end-1 SQUR *AR2+,A SQURA *AR2+,A STL A,-1,*AR4+ power_end: nop here: B here .end
|