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

📄 example 3-45.asm

📁 《基于TI DSP的通用算法实现》程序代码
💻 ASM
字号:

; Example 3 - 45. FCT ASM Listing for the TMS320C3x DSP


*
* A PPENDIX E1
*
* A FAST COSINE TRANSFORM
*
* BASED ON THE ALGORITHM OUTLINED BY BYEONG GI LEE IN THIS ARTICLE, FCT - A
* FAST CISUBE TRANSFORM, PUBLISHED IN THE PROCEEDING OF THE IEEE INTER-
* NATIONAL CONFERENCE ON ACOUSTIC, SPEECH, AND SIGNAL PROCESSING, SAN 
* DIEGO, CA, MARCH 1984, P28A.3/1-4 VOL. 2,(CH1954-5/84/0000-0299).
*
* LEE'S ALGORITHM HAS BEEN MODIFIED TO ALLOW NATURAL ORDER TIME DOMAIN 
* COEFFICIENTS RATHER THAN THE LESS ORDERED IMPUT SUGGESTED IN HIS ARTICLE.
*
* THE FREQUENCY DOMAIN COEFFICNENT ARE IN BIT REVERSE ORDER. THIS IS AN
* PLACE CALCULATION
*
* AUTHER: PAUL WILHELM
*
*
	.global FCT	; FAST COSINE TRANSFORM ENTRY POINT.
	.global M		; LENGTH OF DATA ENTRY.
	.global COS_TAB	; TABLE OF COSINE COEFFICIENTS.
	.global COEFF	; TABLE OF INPUT DATA.
*
	.text
*
FCTSIZE	.word	M
_COS	.word	COS_TAB
_DATA	.word	COEFF
*
FCT:
	LDI	@FCTSIZE, ARO	; LOAD DATA LENGTH
	LDI	@FCTSIZE, BK	; SET BLOCK SIZE FOR CIRCULAR
*				; ADDRESS
	LDI	@_DATA, AR6	; LOAD DATA POINTER.
	LDI	@_COS, AR7	; LOAD COSINE TABLE POINTER.
	LDI	ARO, IRI		; INITIALIZE INDEX REGISTERS FOR FIRST
	LDI	-1, IRO		; BUTTERFLY SERIES.
	LDI	AR6, AR1		; INITIALIZE DATA POINTERS.
	ADDI3	AR6, AR0, AR2	
	SBUI	1, AR2
	LSH3	IRO, ARO, AR3
	LDI	1, AR5		; INITIALIZE 2'S POWER COUNTER.
	ADDI	AR6, AR3		; FINISH DATA POINTER INITIALIZATION.
	ADDI3	IRO, AR3,AR4
	ADDI3	IRO, AR5, RC	; RC SHOULD BE ONE LESS THAN COUNT
*				: DISIRED
*
* FIRST LOOP SERIES
*
* THIS LOOP SERIES DOES ALL THE BUTTERFLY STAGES EXCEPT THE FINAL ONE.
*
	RPTB	END_COUNTER_LOOP
*
OUTSIDE_LOOP:			; TWO BUTTERFLIES ARE CALCULATED AT
MIDDLEL_OOP:			; THE SAME TIME.
*
	LDF	*AR2, R2		; GET LOWER HALF OF EACH BUTTERFLY.
||	LDF	*AR3, R3		; (THIS ALLOWS FOR MORE PARALLEL
*				; COMMANDS LATER)
	SUBF3	*AR3, *AR4, R1	; SUBTRACT SECOND BUTTERFLY DATA.
	SUBF3	*AR2, AR1, R0	; SUBTRACT FIRST BUTTERFLY DATA.
	MPYF3	R1, *++AR7, R1	; MULTIPLY 2ND SUBTRACTION RESULT BY
||	ADDF3  	R3, *AR4, R3	; BOSINE COEFFICIENT. ADD SECOND
*				; BUTTERFLY DATA.
	MPYF3	R0, *--AR7, R0	; MULTIPLY 1ST SUBTRACTION RESULT BY
||	ADDF3	R2, *AR1,R2	; COSINEFFICIENT. ADD FIRST
*				; BUTTERFLY DATA
	STF	R1, *AR2++(IR1)%	;SAVE 2ND MULTIPLY RESULT IN LOWER
||	STF	R3, *AR4++(IR1)%	; HALF IF BUTTERFLY. SAVE 2ND
*				; ADDITION IN UPPER 2ND BUTTERFLY.
END-CENTER-LOOP:
*
	STF	R0, *AR3++(IR1)%	; SAVE 1ST MULTIPLY IN LOWER HALF OF
||	STF	R2, *AR1++(IR1)%	; 2ND BUTTERFLY. SAVE 1ST ADDITION
*				; IN UPPER 1ST BUTTERFLY.
* END OF CENTER LOOP OF FIRST LOOP SERIES.
*
	ADDI3	IR0, AR5, RC	; UPDATE REPEAT COUNTER FOR NEXT BLOCK
*				: REPEAT,
	ADDF3	*AR3++, *AR2__, R0; UPDATE DATA POINTERS.
	CMPI	AR3, AR2		; HAVE BUTTERFLIES BEEN COMPLETE?
	BGTD	MIDDLE_LOOP	; DELAYED BRANCH, IF NOT.
	ADDF3	*AR1++, *AR4__,R0	; UPDATE FINAL TWO POINTERS FOR NEXT
*				; REPEAT.
	ADDI	2, AR7		; UPDATE COSINE COEFFICIENT POINTER.
	OR	0100H, ST	; SET REPEAT MODE. (FASTER THAN USING
*				: RPTB WHEN START AND END ADDRESS
*				; ARE STILL GOOD)
*
* DELAY BRANCH FROM HERE TO MIDDLE_LOOP.
*
	LSH	-1, IR1		; UPDATE INDEX REGISTER. (DEVIDED BY 2)
	LDI	AR6,AR1		; REINITIALIZE DATA POINTERS.
	ADDI	IR0, AR6, AR2	
	ADDU	IR1, AR2
	CMPI	2, IR1		; IS FIRST BUTTERFLY SERIES COMPLETE?
	BGTD	OUTSIDE_LOOP	; DELAY BRANCH, IF NOT.
	KSG	1, AR5		; MULTIPLY 2'S POWER COUNTER BY 2.
	SUBI3	IR0, AR4, AR3	; CONTINUE REINITIALIZING DATA
*				; POINTERS
	ADDI3 	IR0, AR5, RC	; SET REPEAT COUNTER FOR REPEAT BLOCK.
*
* END OF FIRST LOOP SERIES.
*
* FINAL BUTTERFLY STAGE LOOP.
*
* INCLUDES LAST BUTTERFLIES AND FIRST STAGE OF BIT REVERSE ADDITIONS.
*
	LDI 4, IR1			; INITIALIZE INDEX REGISTER.
	ADDI	1, AR3		; SET UP DATA POINTERS.
	LSH	-1. AR5
	ADDI	3, AR4
	ADDI3	IR0, AR5, RC	; INITIALIZE REPEAT COUNTER.
	MPYF3	*AR7, ++AR7, R4	; CALCULATE (2/M)*COS(PI/4).
*				; <I.E.-> (SQRT(2))/N THIS VALUE IS
*				; CALLED, S, BELOW,)
	RPTB	END_2ND_LOOP	; TWO BUTTERFLIES ARE CALCULATED PER
*				; LOOP
*	
*	SUBF3	*AR2, *AR1, R0	; SUBTRACT 1ST BUTTERFLY DATA
	SUBF3 	*AR4, *AR3, R1	; SUBTRACT 2ND BUTTERFLY DATA
	MPYF3	R0, R4, R0	; MULTIPLY 1ST SUBTRACTION RESULT
||	ADDF3	*AR3++*(IR1), *AR4++(IR1), R3	; BY S. AND 2ND BUTTERFLY
*				; DATA
	MPYF3	R1, R4, R1	; MULTIPLY 2ND SUBTRACTION RESULT
||	ADDF3	*AR1++(IR1), *AR2++(IR1), R2		; BY S. ADD 1ST BUTTERFLY
*				; DATA
	MPYF3	R3, *+AR7, R3	; MULTIPLY 2ND ADDITION RESULT BY
||	STF	R0, *-AR2(IR1)	; 7071. SAVE 1ST SUBTRACTION IN
				; LOWER 1/2 OF 1ST BUTTERFLY.
	MPYF3	R2, *+AR7, R2	;MULTIPLY 1ST ADDITION RESULT BY
::	STF	R1, *-AR4(IR1)	; .7071 SAVE 2ND SUBTRACTION IN
*				; LOWER 1/2 OF 2ND BUTTERFLY.
	ADDF3	R3, R1, R3	; ADD 2ND SUBTRACTION MULTIPLY TO 2ND
*				: ADDITION MULTIPLY.
	STF	R2, *-AR1(IR1)	; SAVE 1ST ADDITION MULTIPLY IN UPPER
*				; 1/2 OF BUTTERFLY.
*
END_2ND_LOOP:
*
	STF	R3, *-AR3(IR1)	; SAVE 2ND ADDITION MULTPLY IN UPPER
*				: 1/2 OF UPPER BUTTERFLY.
*
* END OF FINAL BUTTERFLY STAGE LOOP.
*
* BIT REVERSE ADDITION LOOP SERIES.
*
* THIS LOOPSERIES DOES ALL OF THE BIT REVERSE ADDITION AT THE END OF FAST
* COSINE TRANSFORM
*
	LDI	2, IR0		; INITIALIZE INDEX REGISTERS AND DATA
	LDI	AR6, AR1		; POINTERS FOR FINAL ADDITION
	ADDI	4, AR1		; SERIES
	LDI	AR1, AR2
	LDI	8, IR1
*
LAST_OUTSIDE_LOOP:
*	LDI 	AR2, AR4		; UPDATE POINTERS AND COUNTERS.
	LSH 	-1, AR5
	LDI	AR5, RC		; SET UP REPEAT COUNTER.
	ADDF3	*AR2++(IR0)b, *AR4++(IR0)R, R0	; DATA POINTER UPDATE.
	LDI	AR1,R4		; USE INITIAL AR1 VALUE AS INNER LOOP
*				; CONTROL.
	SUBI	1, RC
	NOP	*AR4++(IR0)B	; CONTINUE UPDATING POINTERS.
	LDI 	AR2, AR3
*
	RPTB	END_INSIDE	; TWO ADDITIONS ARE DONE IN EACH LOOP.
*
LAST_INSIDE_LOOP:
*
	ADDF3	*AR1, *AR2++(IR1)%,R0	;ADD FIRST TWO DATA.
	ADDF3	*AR3, *AR4++(IR1)%,R1	;ADD SECOND TWO DATA.
	STF	R0,*AR1++(IR1)%		;SAVE FIRST ADDITION.
*
END_INSIDE:
*
	STF	R1, *AR3++(IR1)%		; SAVE SECOND ADDITION.
*
*	END OF INSIDE LOOP FOR LAST LOOP SERIES.
*
	ADDF3	*AR1++(IR0)B, *AR2++(IR0)B,RO	; UPDATE DATA POINTERS.
	ADDF3	*AR3++(IR0)B, *AR4++(IR0)B,RO
	ADDF3	*AR3++(IR0)B, *AR4++(IR0)B,RO
	ADDF3	*AR1++(IR0)B, *AR2++(IR0)B,RO
	CMPI	R4, AR4			; IS THIS LOOP COMPLETE?
	BNED	LAST_INSIDE_LOOP	; DELAYED BRANCH, IF NOT.
	LDI	AR5, RC			; SET UP REPEAT COUNTER.
	SUBG1	1, RC
	OR	0100H, ST		; SET REPEAT MODE
*
* BRANCH DELAYED TO LAST_INSIDE_LOOP.
*
	RPTB	LAST_BLOCK	; SINCE THERE ARE AN ODD NUMBER OF
	ADDF3	*AR1, *AR2++(IR1)Z, R0	; ADDITIONS THE FINAL ONES ARE
*				; DONE NOW.
*
LAST_BLOCK:
*
	STF	R0, *AR1++(IR1)%	; SAVE ADDITION.
*
* END OF LAST REPEAT BLOCK.
*
	LSH	1,IR0		; MULTIPLY IR0 BY 2.
	ADDI	IR0, R4		; UPDTEE INNER LOOP CONTROL REGISTER.
	CMPI	1, AR5		; ARE CALCULATIONS COMPLETE?
	BGTD	LAST_OUTSIDE_LOOP	;DELAYED BRANCH, IF NOT.
	LDI	R4, AR2		; UPDATE DATA POINTERS.
	LDI	R4, AR1
	LSH	1, IR1		; MULTIPLY IR1 BY 2.
*
* DELAYED BRANCH TO LAST_OUTSIDE_LOOP.
*
* END OF LAST LOOP SERIES.
*
* MULTIPLY COEFFICIENT ZERO BY .5 IF NOT ZERO.
*
	LDF	*AR6, R0		; SET ZERO FLAG *AR6 = 0.
	BEQD	DONT_STORE	; IF COEFFICIENT IS ZERO, DON'T DO
*				: THIS
	LSH	24, AR5		; USE INTEGER MATCH FOR FLOAT DIVIDE
*				; BY 2.
	SUBI3	AR5, *AR6, AR1	
	NOP
*
* DELAYED BRANCH FROM HERE IF VALUE IS NOT TO BE STORED.
*
	STI	AR1, *AR6	; STORE, IF EXPONENT WASN'T -128.
*
DONT_STORE:
*	
	RETS

⌨️ 快捷键说明

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