.title "rfft_task.asm"
.mmregs
.copy "coeff.inc"
.def rfft_task
sine: .usect "sine",512
cosine: .usect "cosine",512
fft_data: .usect "fft_data",2048
d_input .copy yuyindata
STACK .usect "STACK",10
K_DATA_IDX_1 .set 2
K_DATA_IDX_2 .set 4
K_DATA_IDX_3 .set 8
K_FLY_COUNT_3 .set 4
K_TWID_TBL_SIZE .set 512
K_TWID_IDX_3 .set 128
K_FFT_SIZE .set 32
K_LOGN .set 5
.bss d_twid_idx,1
.bss d_data_idx,1
.bss d_grps_cnt,1
.sect "rfft_prg"
rfft_task:
SSBX FRCT
STM #STACK+10,SP
STM #sine,AR1
RPT #K_TWID_TBL_SIZE-1
MVPD sine1,*AR1+
STM #cosine,AR1
RPT #K_TWID_TBL_SIZE-1
MVPD cosine1,*AR1+
CALL bit_rev
CALL fft
CALL power
RET
.asg AR2,REORDERED
.asg AR3,ORIGINAL_INPUT
.asg AR7,DATA_PROC_BUF
.sect "rfft_prg"
bit_rev:
STM #d_input,ORIGINAL_INPUT
STM #fft_data,DATA_PROC_BUF
MVMM DATA_PROC_BUF,REORDERED
STM #K_FFT_SIZE-1,BRC
RPTBD bit_rev_end-1
STM #K_FFT_SIZE,AR0
MVDD *ORIGINAL_INPUT+,*REORDERED+
MVDD *ORIGINAL_INPUT-,*REORDERED+
MAR *ORIGINAL_INPUT+0B
bit_rev_end:
RET
.asg AR1,GROUP_COUNTER
.asg AR2,PX
.asg AR3,Qx
.asg AR4,WR
.asg AR5,WI
.asg AR6,BUTTERFLY_COUNTER
.asg AR7,STAGE_COUNTER
.asg "rfft_prg"
fft:
********************第1级蝶形运算stage1********************
STM #0,BK
LD #-1,ASM
STM #fft_data,PX
LD *PX,16,A
STM #fft_data+K_DATA_IDX_1,QX
STM #K_FFT_SIZE/2-1,BRC
RPTBD stage1_end-1
STM #K_DATA_IDX_1+1,AR0
SUB *QX,16,A,B
ADD *QX,16,A
STH A,ASM,*PX+
ST B,*QX
||LD *PX,A
SUB *QX,16,A,B
ADD *QX,16,A
STH A,ASM,*PX+0
ST B.=QX+0%
||LD *PX.A
Stage1_end;
********************第2级蝶形运算stage2********************
STM #fit_data,PX
STM #fit_data+k_DATA_IDX_2,QX
STM #K_FFT_SIZE/4-1,BRC
LD *PX,16,A
RPTBD stage2_end-1
STM #k_DATA_IDX_2+1,AR0
;第1个蝶形运算
SUB *QX,16,A,B
ADD *QX,16,A
STH A,ASM,*PX+
ST B,*QX+
||LD *PX,A
SUB *QX,16,A
STH A,ASM,*PX+
STH A,ASM,*QX+
;第2个蝶形运算
MAR *QX+
ADD *PX,*QX,A
SUB *PX,*QX_,B
STH A,ASM,*PX+
SUB *PX,*QX,A
ST B,*QX
||LD *QX+,B
ST A,*PX
||ADD *PX+0%,A
ST A,*QX+0%
||LD *PX,A
Stage2_end;
********************第3级到log2N级蝶形运算Stage3********************
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
ST #K_DATA_IDX_3,d_data_idx
Stage:
SIM #fit_data,PX
LD d_data_idx,A
ADD *(PX),A
STLM A,QX
MVDK d_grps_cnt,GROUP_COUNTER
group:
MVMD BUTTERFLY_COUNTER,BRC
RPTBD buttery_end-1
LD *WR,T
MPY *QX+,A
MACR *WI+0%,*QX-,A
ADD *PX,16,A,B
ST B,*PX
||SUB *PX+,B
ST B,*QX
||MPY *QX+,A
MASR *QX,*WR+0%,A
ADD *PX,16,A,B
ST B,*QX+
||SUB *PX+,B
LD *WR,T
ST B,*PX+
||MPY *QX+,A
Buttery_end:
;为下一组更新指针
PSHM AR0
MVDK d_data_idx,AR0
MAR *PX+0
MAR *QX+0
BANID group,*GROUP_COUNTER
POPM AR0
MAR *QX-
;为下一级更新计数器和索引值
LD d_data_idx,A
SUB #1,A,B
STLM B,BUTTERFLY_COUNTER
STL A,1,d_data_idx
LD d_grps_cent,A
STL A,ASM,d_grps_cent
LD d_twid_idx,A
STL A,ASM,d_twid_idx
BANZD stage,*STAGE_COUNTER-
MVDK d_twid_idx,AR0
Fft_end;
RET ; 返回主程序rfft_task
********************功率谱计算程序power********************
.set “rfft_prg”
Power:
STM #fft_data,AR2
STM #fft_out,AR4
STM #K_FFT_SIZE*2-1,BRC
RPTB power_end-1
SQUR *AR2+,A
SQURA *AR2+,A
STH A,*AR4+
Power_end;
RET ;返回主程序rfft_task
.end
连接命令文件rfft_task.cmd清单:
/ *连接命令清单fft.cmd */
vectors.obj
rfft_task.obj
-o rfft_task.obj
-m rfft_task.map
-e rfft_task
MEMORY
{
PAGE0:
EPROM: org=0E000H len=1000H
VECS: org=0FF80H len=0080H
PAGE1:
SPRAM: org=0060H len=0020H
DARAM: org=0400H len=0600H
RAM: org=8000H len=1400H
}
SECTION
{
sine1 :>EPROM PAGE0
cosine1 :>EPROM PAGE0
fft_prg :>EPROM PAGE0
.bss :>SPRAM PAGE1
sine : align(512){}>DRAM PAGE1
cosine : align(512){}>DRAM PAGE1
d_input :>RAM PAGE1
fft_data:>RAM PAGE1
fft_out :>RAM PAGE1
STACK :>STACK PAGE1
.vectors:>VECS PAGE0
}