⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 myfft.asm

📁 C54xDSP汇编实现的fft程序
💻 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 + -