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

📄 fft.s54

📁 c5x中关于FFT的实验
💻 S54
字号:
;******************************************************************************
;               		SJTU DSP Tech. Center
;        Copyright (c) 2001 SJTU DSP Tech. Center. All Rights Reserved.
;
;  Description:
;  		TMS320C54x Program for Students Experiment
;
;  History:
;		Date		Authors			Changes
;		2001/12/01	Xu Sheng		Created.
;******************************************************************************

;Lab8== FFT experiment

STACK_ADDR		.set		0x0500
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    4		;128
K_FLY_COUNT_3     .set    4
K_FFT_SIZE        .set    32;1024   ;N=1024
K_LOGN            .set    5;10    ;LOG(N)

	.bss	FFT_Data, 2048		;make sure the data buffer match alignment
	.bss	Data_Input, 2048
	.bss	FFT_Output, 1024
	.bss	Sin, 512*2			;make sure the data buffer match alignment
	.bss	Cos, 512*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	main
	.include "coeff.inc"
;------------------------------------------------------------------------------
	.text
main:
	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		#512-1
	mvpd	Sin_Tab, *AR1+

	stm		#Cos, AR1
	rpt		#512-1
	mvpd	Cos_Tab, *AR1+

	;clear input data buffer
	stm		#Data_Input, AR1
	rptz	A, #2048-1
	stl		A, *AR1+
	;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:

;-------------------- 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		#Cos, 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
    squr    *AR2+, A
    squra   *AR2+, A
    sth     A, *AR4+
power_end:

dead_loop:
	nop
	nop
	nop
	nop
	b		dead_loop

;------------------------------------------------------------------------------
	.sect	"vectors"
int_RESET:
	b		main
	nop
	nop

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

⌨️ 快捷键说明

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