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

📄 fft.asm

📁 傅里叶变换
💻 ASM
字号:
		.title		"cFFT.asm"
		.mmregs
		.global		_cFFT
		.global     _fft_out
		.ref        sine
        .ref        cosine
		
fft_data    .usect      "fft_data",2048
d_input     .usect      "d_input",2048
_fft_out     .usect     "fft_out",2048

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
 

		.bss		d_twid_idx,1
		.bss		d_data_idx,1
		.bss		d_grps_cnt,1
        .bss        k_logn,1
        .bss        k_fft_size,1
		.text			
		
_cFFT:
		PSHM		AR1
		PSHM		AR6
		PSHM		AR7
		SSBX            SXM
		SSBX		OVM
		SSBX		FRCT

		STLM		A,AR2
		STM         #d_input,AR3
;		STL         A,*(input_ptr)
		LD          04h,A
		STL         A,*(k_logn)
		LD          *(k_logn),ASM
		LD          #1,B
		LD          #-1,A
		STL         B,ASM,*(k_fft_size)
        MAC         *(k_fft_size),#1,A
        NOP
        RPT         *(AL)
;        RPT         #2*K_FFT_SIZE-1
        MVDD        *AR2+,*AR3+
        nop
        
        .asg        AR2,REORDERED
        .asg        AR3,ORIGINAL_INPUT
        .asg        AR7,DATA_PROC_BUF
        
		LD      #-1,B
        ADD     *(k_fft_size),B
        STLM    B,BRC
        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
        MVDM        *(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
;    stage 1
        LD      #-1,B
        ADD     *(k_fft_size),-1,B
        STLM    B,BRC
		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:
;    stage 2
		STM		#fft_data,PX
		STM		#fft_data+K_DATA_IDX_2,QX
;		STM		#K_FFT_SIZE/4-1,BRC
        LD      #-1,B
        ADD     *(k_fft_size),-2,B
        STLM    B,BRC
		LD		*PX,16,A
		RPTBD		stage2end-1
		STM		#K_DATA_IDX_2+1,AR0
;	1st bufferfly
		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		A,ASM,*QX+
;	2st bufferfly
		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:
;    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
        LD      *(k_logn),B
        ADD     #-3,B
        STLM    B,STAGE_COUNTER
;		STM		#K_LOGN-2-1,STAGE_COUNTER
		LD      #-1,B
        ADD     *(k_fft_size),-3,B
        STL     B,*(d_grps_cnt)
;		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
		MVDM		*(d_grps_cnt),GROUP_COUNTER
group:
		MVMD		BUTTERFLY_COUNTER,BRC
		NOP
		RPTB		bufferflyend-1
		LD		*WR,T
		MPY		*QX+,A
		NOP
		MACR		*WI+0%,*QX-,A
		ADD		*PX,16,A,B
		NOP
		NOP
		ST		B,*PX
		||SUB		*PX+,B
		NOP
		NOP
		ST		B,*QX
		||MPY		*QX+,A
		NOP
		NOP
		MASR		*QX,*WR+0%,A
		ADD		*PX,16,A,B
		NOP
		NOP
		ST		B,*QX+
		||SUB		*PX,B
		NOP
		NOP
		LD		*WR,T
		ST		B,*PX+
		||MPY		*QX,A
bufferflyend:
;	Update pointers for next group
		PSHM		AR0
		MVDM		*(d_data_idx),AR0
        NOP
		MAR		*PX+0
		MAR		*QX+0
		BANZD		group,*GROUP_COUNTER-
		POPM		AR0
		nop
;		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)
;		NOP
		LD		*(d_grps_cnt),A
		NOP
		STL		A,ASM,*(d_grps_cnt)
		LD		*(d_twid_idx),A			
		STL		A,ASM,*(d_twid_idx)
		nop
		BANZD		stage,*STAGE_COUNTER-
		MVDM		*(d_twid_idx),AR0
		
fft_end:
		LD      #-1,B
        ADD     *(k_fft_size),B
        STLM    B,BRC
;		STM		#K_FFT_SIZE-1,BRC
		STM		#fft_data,AR2
		STM     #_fft_out,AR4
;		RSBX    FRCT
		RPTB	power_end-1
		SQUR	*AR2+,A
		SQURA	*AR2+,A
;		SFTA    A,-10
;        EXP     A
;        NOP
;        ST      T,*AR4+
		DST		A,*AR4+
;        NOP
;		LD      *AR4,16,A
;		STH     A,-1,*AR4+
		
;        MVDD    *AR2+,*AR4+
;        MAR     *AR2+

power_end:
		RSBX		OVM
		RSBX		FRCT
		POPM		AR7
		POPM		AR6
		POPM		AR1
		RET		
		
		
				
				
														

⌨️ 快捷键说明

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