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

📄 fft.asm

📁 一个ti dsp平台上验证过的fft的汇编程序.供大家参考
💻 ASM
字号:
*******************************************************************************
***         N(8-1024)points FFT Program                                     ***
*******************************************************************************
						.title 		"fft.asm"
						.mmregs
						
						.def        _c_int00,start
						
k_stack_size    		.set 		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
K_FFT_SIZE              .set  		32		;N=32
K_LOGN                  .set  		5			;log(N)=log(32)=5
PA0                     .set  		0
PA1                     .set  		1

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
k_stack     			.usect  	"STACK",k_stack_size
k_stack_bottorm    		.set    	k_stack+k_stack_size

 		.bss 		d_twid_idx,1
		.bss  		d_data_idx,1
		.bss  		d_grps_cnt,1
		;.sect 		"fft_prg"
		.text
		.copy       "coeff.inc"
* * * * Bit Reversal Routine * * * *
		.asg 		AR2,REORDERED
		.asg 		AR3,ORIGINAL_INPUT
		.asg 		AR7,DATA_PROC_BUF
		;----------------------------------------
_c_int00:
start:
		SSBX 	FRCT
		STM 	#k_stack_bottorm,SP
		STM 	#d_input,AR1	;从PA1口输入2N个数据
		RPT 	#2*K_FFT_SIZE-1
		PORTR 	PA1,*AR1+		;这部分改为伪采样数据
		;-----------------------
		STM 	#sine,AR1
		RPT 	#511
		MVPD 	sinel,*AR1+
		STM 	#cosine,AR1
		RPT 	#511
		MVPD 	cosinel,*AR1+
		;-----------------------
		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:
* * * * 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
* * * * 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 	stage1end-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
stage1end:
* * * * 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 	stage2end-1
		STM 	#K_DATA_IDX_2+1,AR0
;1st butterfly
		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+
		STH 	B,ASM,*QX+
;2nd butterfly		
		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
stage2end:
* * *   stage3 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
		ADD 	*(PX),A
		STLM 	A,QX
		MVDK 	d_grps_cnt,GROUP_COUNTER
group:
		MVMD 	BUTTERFLY_COUNTER,BRC
		RPTBD 	butterflyend-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
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
		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:
*** Compute the power spectrum ***
		STM 	#fft_data,AR2
		STM 	#fft_data,AR3
		STM 	#fft_out,AR4		;运算结果在fft_out[]
		STM 	#K_FFT_SIZE*2-1,BRC
		RPTB 	power_end-1
		SQUR 	*AR2+,A
		SQURA 	*AR2+,A
		STH 	A,*AR4+
power_end:
		NOP
		;STM 	#fft_out,AR4
		;RPT 	#K_FFT_SIZE-1
		;PORTW 	*AR4+,PA0
 		B 		$
		
		.end
		

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -