📄 fft.asm
字号:
******************************************************************
*** 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
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -