📄 myfft.asm
字号:
.title "myfft.asm"
.mmregs
.copy "sine1.asm"
.def rfft_task
sine: .usect "sine",512
cosine: .usect "cosine",512
fft_data: .usect "fft_data",2048
d_input: .usect "d_input",2048
.copy "sindata.asm" ;从sindata.asm文件复制输入数据
fft_out: .usect "fft_out",1024
STACK .usect "STACK",10
K_DATA_IDX_1 .set 2 ;第1级运算时各组蝶形的地址增量
K_DATA_IDX_2 .set 4 ;第2级运算时各组蝶形的地址增量
K_DATA_IDX_3 .set 8 ;第3级运算时各组蝶形的地址增量
K_FLY_COUNT_3 .set 4 ;第1级运算时每组蝶形的地址增量
K_TWID_TBL_SIZE .set 512 ;表的大小
K_TWID_IDX_3 .set 128
K_FFT_SIZE .set 128 ;N=32,复数点数
K_LOGN .set 7 ;蝶形级数log2N=log2(32)=5
.bss d_twid_idx,1
.bss d_data_idx,1
.bss d_grps_cnt,1
.bss d_tmp,1
.sect "rfft_prg"
rfft_task: ;主程序
SSBX FRCT
STM #STACK+10,SP
STM #d_input,AR1
STM #2,AR0
RPT #K_FFT_SIZE-1
MVPD #d_input128rect,*AR1+0
d_input_end:
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
end: B end
***********位码倒置子程序bit_rev*****************
.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 ;AR0=缓冲区大小的一半
MVDD *ORIGINAL_INPUT+,*REORDERED+
MVDD *ORIGINAL_INPUT-,*REORDERED+
MAR *ORIGINAL_INPUT+0B ;位翻转寻址
bit_rev_end:
RET
************FFT算法子程序fft********************
.asg AR1,GROUP_COUNTER
.asg AR2,PX
.asg AR3,QX
.asg AR4,WR
.asg AR5,WI
.asg AR6,BUTTERFLY_COUNTER
.asg AR7,STAGE_COUNTER
.sect "rfft_prg"
fft:
************第1级蝶形运算stage1*******************
STM #0,BK ;?
LD #-1,ASM ;每一级输出除以2,防止溢出
STM #fft_data,PX ;PX指向第1个蝶形运算输入
LD *PX,16,A
STM #fft_data+K_DATA_IDX_1,QX ;QX指向第2个蝶形运算输入
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 #fft_data,PX
STM #fft_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 ;B=real(PX)-real(QX)
ADD *QX,16,A ;A=real(PX)+real(QX)
STH A,ASM,*PX+
ST B,*QX+
||LD *PX,A
SUB *QX,16,A,B ;B=img(PX)-img(QX)
ADD *QX,16,A ;A=img(PX)+img(QX)
STH A,ASM,*PX+
STH B,ASM,*QX+
;第2个蝶形运算
MAR *QX+ ;QX先虚后实=QX*-j,WN=-j
ADD *PX,*QX,A ;A=real(PX)+img(QX)
SUB *PX,*QX-,B ;B=real(PX)-img(QX)
STH A,ASM,*PX+ ;real(PX)=A=real(PX)+img(QX)
SUB *PX,*QX,A ;A=img(PX)-real(QX)
ST B,*QX ;real(QX)=B=real(PX)-img(QX);带ASM
||LD *QX+,B ;B=real(QX)
ADD *PX,16,B ;原为A? B=img(PX)+real(QX)
STH A,ASM,*PX+0% ;img(PX)=A=img(PX)-real(QX);带ASM
ST B,*QX+0% ;原为A? img(QX)=B=img(PX)+real(QX)
||LD *PX,A
stage2_end:
***********第3级蝶形运算stage3********************
STM #K_TWID_TBL_SIZE,BK ;BK=512
ST #K_TWID_IDX_3,d_twid_idx
STM #K_TWID_IDX_3,AR0 ;AR0=128
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 ;PX和QX的间隔8
stage:
STM #fft_data,PX
LD d_data_idx,A
ADD *(PX),A
STLM A,QX
MVDK d_grps_cnt,GROUP_COUNTER
group:
MVMD BUTTERFLY_COUNTER,BRC
RPTB butterfly_end-1
LD *WR,T
MPY *QX+,A
MACR *WI,*QX-,A ;?A=real(QX*WN)
ADD *PX,16,A,B
SUB *PX,16,A
STH B,ASM,*PX+ ;real(PX)=B=real(PX)+real(QX*WN);带ASM
; ST B,*PX ;real(PX)=B=real(PX)+real(QX*WN);带ASM
; ||SUB *PX+,A ;有问题,工作不如预想
NEG A ;A=-A=real(PX)-real(QX*WN)
LD *WI+0%,T
ST A,*QX ;real(QX)=A=real(PX)-real(QX*WN);带ASM
||MPY *QX+,A
NEG A
MACR *QX,*WR,A ;A=img(QX*WN)
LD *WR+0,T
ADD *PX,16,A,B ;B=img(PX)+img(QX*WN)
ST B,*PX ;img(PX)=B=img(PX)+img(QX*WN);带ASM
||LD *PX+,B
SUB A,B ;B=img(PX)-img(QX*WN)
STH B,ASM,*QX+ ;img(QX)=B=img(PX)-img(QX*WN);带ASM
butterfly_end:
;为下一组更新指针
PSHM AR0
MVDK d_data_idx,AR0
MAR *PX+0
MAR *QX+0
STM #cosine,WR
STM #sine,WI
BANZD group,*GROUP_COUNTER-
POPM AR0
; MAR *QX-
NOP
;为下一级更新计数器和索引值
LD d_data_idx,A
SUB #1,A,B
STLM B,BUTTERFLY_COUNTER
STL A,1,d_data_idx
LD d_grps_cnt,A
STL A,ASM,d_grps_cnt
LD d_twid_idx,A
STL A,ASM,d_twid_idx
BANZD stage,*STAGE_COUNTER-
MVDK d_twid_idx,AR0
fft_end:
RET
************功率谱计算子程序power********************
.sect "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
.end
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -