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

📄 fft.asm

📁 次代码在传统fft的基础上
💻 ASM
字号:

STACK_ADDR		  .set	0x500
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_TBL_SIZE   .set    128
K_TWID_IDX_3      .set    32	     ;级数多少,K_TWID_TBL_SIZE	/4
K_FLY_COUNT_3     .set    4         ; Butterfly counter for Stage 3
K_FFT_SIZE        .set    256      ;与计算点数大小相同
K_LOGN            .set    8      ;点数的log2的低的值

	.bss	FFT_Data, 512		;make sure the data buffer match alignment
	.bss	Data_Input, 512
	.bss	FFT_Output, 512
	.bss	Sin, 192			;make sure the data buffer match alignment
	;.bss	Cos, 128*2			;make sure the data buffer match alignment

    .bss	d_twid_idx, 1
    .bss	d_data_idx, 1
    .bss	d_grps_cnt, 1
	.mmregs
	.global	_c_int00,start
	.include "coeff.inc"
;------------------------------------------------------------------------------
	.text
start:
	stm	 #STACK_ADDR,SP
	stm	 #0x00a8,PMST		;store IPTR
	stm	 #0x0000,SWWSR

	ssbx	FRCT
	ssbx	SXM

	;copy tables from program space to data space
	stm		#Sin, AR1
	rpt		#192-1
	mvpd	Sin_Tab, *AR1+

;	stm		#Cos, AR1
;	rpt		#128-1
;	mvpd	Cos_Tab, *AR1+
	stm		#Data_Input, AR2
	LD      #1050,A
	STM     #255,AR0		
wait:	stl   A,*AR2+
        LD   #0,A
    	stl   A,*AR2+
    	LD      #1050,A
	    banz  wait, *AR0-
	
	  
     ;clear input data buffer
	;add probe to read in data
	nop
;-------------------- Do bit-reverse -------------------
	stm 	#Data_Input,AR3	  ;AR3 original_data_ptr
	stm		#FFT_Data, AR2		;AR2 reordered_data_ptr
	stm		#K_FFT_SIZE-1, BRC
	rptbd	bit_rev_loop-1
	stm		#K_FFT_SIZE, AR0
	mvdd	*AR3+, *AR2+
	mvdd	*AR3-, *AR2+
	mar		*AR3+0B
bit_rev_loop:
    nop
;-------------------- Do FFT core -------------------
    .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  ***
    stm		#0, BK
    ld		#-1, ASM
    stm		#FFT_Data, PX
    stm		#FFT_Data+K_DATA_IDX_1,QX

    ld		*PX, 16, A					;AH=PX.x
    stm		#K_FFT_SIZE/2-1, BRC
    rptbd	stage1end-1
    stm 	#K_DATA_IDX_1+1, AR0

    sub		*QX, 16, A, B				;BH=PX.x-QX.x
    add		*QX, 16, A					;AH=PX.x+QX.x
    sth		A, ASM, *PX+
    st		B, *QX+
||	ld		*PX, A						;AH=PX.y
    sub		*QX, 16, A, B				;BH=PX.y-QX.y
    add		*QX, 16, A					;AH=PX.y+QX.y
    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

    ld		*PX,16, A					;AH=PX.x
    stm		#K_FFT_SIZE/4-1, BRC
    rptbd	stage2end-1
    stm		#K_DATA_IDX_2+1, AR0

	; 1st butterfly
    sub		*QX, 16, A, B				;BH=PX.x-QX.x
    add		*QX, 16, A					;AH=PX.x+QX.x
    sth		A, ASM, *PX+
    st		B, *QX+
||	ld		*PX, A						;AH=PX.y
    sub		*QX, 16, A, B				;BH=PX.y-QX.y
    add		*QX, 16, A					;AH=PX.y+QX.y
    sth		A, ASM, *PX+
    sth		B, ASM, *QX+

	;  2nd butterfly
    mar		*QX+
    add		*PX, *QX, A					;AH=PX.x+QX.y
    sub		*PX, *QX-, B				;BH=PX.x-QX.y
    sth		A, ASM, *PX+
    sub		*PX, *QX, A					;AH=PX.y-QX.x
    st		B, *QX
||	ld		*QX+, B						;BH=QX.x
    st		A, *PX
||	add		*PX+0%, A					;AH=PX.y+QX.x
    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		#Sin+64, WR
    stm		#Sin, 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						; T  :=  WR
    mpy		*QX+, A                     ; A  :=  QR*WR  || QX->QI

    macr	*WI+0%, *QX-, A             ; A  :=  QR*WR+QI*WI
                                        ; || QX->QR
    add		*PX, 16, A, B               ; B  := (QR*WR+QI*WI)+PR
    st		B, *PX                      ; PR':=((QR*WR+QI*WI)+PR)/2
||	sub		*PX+, B						; B=PR-(QR*WR+QI*WI)
										; || PX->PI
    st		B, *QX                      ; QR':= (PR-(QR*WR+QI*WI))/2
||	mpy		*QX+, A                     ; A  :=  QR*WI [T=WI]
                                        ; || QX->QI
    masr	*QX, *WR+0%, A              ; A  :=  QR*WI-QI*WR
    add		*PX, 16, A, B               ; B  := (QR*WI-QI*WR)+PI
    st		B, *QX+                     ; QI':=((QR*WI-QI*WR)+PI)/2
||	sub		*PX, B						; B=PI-(QR*WI-QI*WR)
    ld		*WR, T                      ; T  :=  WR
    st		B, *PX+                     ; PI':= (PI-(QR*WI-QI*WR))/2
||	mpy		*QX+, A                     ; || PX->PR
                                        ; A  :=  QR*WR  || QX->QI
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)
    mvdk	*(d_twid_idx), AR0
    banz	stage, *STAGE_COUNTER-
fft_end:

;***  Compute the power spectrum ***
    ssbx	OVM
    stm     #FFT_Data, AR2
    stm     #FFT_Output, AR4
    stm     #K_FFT_SIZE/2-1,BRC
    rptb    power_end-1
    nop
    squr    *AR2+, A
    nop
    squra   *AR2+, A
    stl     A, *AR4+
power_end:

dead_loop:
	nop
 	nop
	nop
	nop
	b		dead_loop

;------------------------------------------------------------------------------
	.sect	"vectors"
_c_int00:
	b		start
	nop
	nop

	.space	124*16
;------------------------------------------------------------------------------
;end of lab8.s54		

⌨️ 快捷键说明

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