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

📄 gaeca3a.s54

📁 TI公司DSP/tms320c55x/tms320c54x系列的声学回声消除代码
💻 S54
字号:
*-------------------------------------------------------------------------*
*                                                                         *
*   THIS IS AN UNPUBLISHED WORK CONTAINING CONFIDENTIAL AND PROPRIETARY   *
*   INFORMATION.  IF PUBLICATION OCCURS, THE FOLLOWING NOTICE APPLIES:    *
*      "COPYRIGHT 2003 MICHAEL TSIROULNIKOV, ALL RIGHTS RESERVED"         *
*                                                                         *
*-------------------------------------------------------------------------*/
	.mmregs
	.include "gaeci.h54"
	.sect ".ftext1"

_ADJ            		.set (2)
_ADJSS          		.set (_ADJ+1)
_DEXP           		.set (26214) ; Q15(0.8)

;-------------------------------------------------------------------------
	.global _gaec_get_energy3
;-------------------------------------------------------------------------
_gaec_get_energy3	
;
; GAEC_tDb *pDb	= a
; S16 blk		= sp(1)
;
	stlm	a, ar2
	ssbx	sxm
	nop
	mvdk	*sp(1), ar0
;	
; psRcvI = ar3	
	mvdk	*ar2(#(GAEC_tDb.psRcv)), ar3
	mar		*+ar3(#(GAEC_ADF_BSZ-GAEC_OFF3))
	mar		*ar3+0
;
; psRcvQ = ar4	
	mvmm	ar3, ar4
	mar		*+ar4(#(GAEC_BANDS*GAEC_RCV_SZ))
;
; pDb->aslEn2 = ar5	
	mvmm	ar2, ar5
	mar		*+ar5(#(GAEC_tDb.aslEn3))
;
; set ptr increment
	stm		#GAEC_RCV_SZ, ar0	
;	
; band 0
	dld		*ar5, a
	sub		a, -5, a
	squr	*ar3+0, b 	
	add		b, -2, b
	add		b, -_ADJ, a
	dst		a, *ar5+
	mar		*ar4+0
;
; bands 1..BANDS-1	
	stm		#GAEC_BANDS-1-1, brc
	rptb	L01-1
		dld		*ar5, a
		sub		a, -5, a
		squr	*ar3+0, b 	
		squra   *ar4+0, b
		add		b, -2, b
		add		b, -_ADJ, a
		dst		a, *ar5+
L01	
;
; band BANDS
	dld		*ar5, a
	sub		a, -5, a
	squr	*ar3+0, b 	
	add		b, -2, b
	add		b, -_ADJ, a
	dst		a, *ar5+

	ret	
	

;-------------------------------------------------------------------------
	.global _gaec_adapt_dc3p
;-------------------------------------------------------------------------
_gaec_adapt_dc3p
; GAEC_tDb *pDb		= a;
; GAEC_tSc *pSc		= sp(1)
; S16 blk			= sp(2)
; S16 band			= sp(3)
;
	stlm	a, ar2
	ssbx 	sxm
	nop
	mvdk	*sp(1), ar3
	mvdk	*sp(2), ar0
	cmpm 	*sp(3), #0
;	
; ar0 = blk
; ar1 = pSc->u.aA3
; ar2 = pDb
; ar3 = pSc
; ar4 = pSc->asSSC[band];
; ar5 = pDb->aslEn3[band];
; ar6 = pDb->aslAdEn[band];
; ar7 = pSc->aasErr[band][blk]
;
	mvmm	ar3, ar4
	mar 	*+ar4(#(GAEC_tSc.asSSC))
	mvmm	ar2, ar5
	mar		*+ar5(#(GAEC_tDb.aslEn3))
	
	pshm	ar7
	pshm	ar6
	pshm	ar1

	mvmm	ar2, ar6
	mar 	*+ar6(#(GAEC_tDb.aslAdEn)) 
	mvmm	ar3, ar7
	mar 	*+ar7(#(GAEC_tSc.aasErr))
	mar 	*ar7+0
	mvmm	ar3, ar1
	mar		*+ar1(#(GAEC_tSc.u.aA3))
;
; adjust pointers if band == BANDS	
	bc		C20, tc
		mar		*+ar4(#(GAEC_BANDS))
		mar		*+ar5(#(GAEC_BANDS*2))
		mar		*+ar6(#(GAEC_BANDS*2))
		mar		*+ar7(#(GAEC_BANDS*GAEC_BLKS))
C20	
	ld  	*ar4, a
	bc		C25, aeq;
	
		ld 		#_ADJSS, a
		call    _gaec_adapt_pre
		
		orm 	#1, *(pmst)
		stm 	#2-1, brc
		rptb	C24-1
			mpy		*ar7+, b
			ld 		b, asm, b
			add 	#1, 14, b
			sth		b, 1, *ar1+
C24		
		andm 	#~1, *(pmst)
C25
	popm	ar1
	popm	ar6
	popm	ar7
	ret
	
;-------------------------------------------------------------------------
	.global _gaec_adapt_dc3d
;-------------------------------------------------------------------------
_gaec_adapt_dc3d
; GAEC_tDb *pDb		= a;
; GAEC_tSc *pSc		= sp(1)
; S16 blk			= sp(2)
; S16 band			= sp(3)
;
	stlm	a, ar2
	ssbx 	sxm
	orm 	#1, *(pmst)
	mvdk	*sp(1), ar5
	mvdk	*sp(2), ar0
	cmpm 	*sp(3), #0
;	
; set up ptrs
; ar0 = blk
; ar2 = pDb, sections
; ar3 = paAdf
; ar4 = psRcv
; ar5 = pSc->u.aA3
;
	mar		*+ar5(#(GAEC_tSc.u.aA3));
	mvdk	*ar2(#(GAEC_tDb.psAdf)), ar3
	mar		*+ar3(#(GAEC_OFF3*2))	; ar3 = psAdf
	mvdk	*ar2(#(GAEC_tDb.psRcv)), ar4;			; ar4 = psRcv
	mar		*+ar4(#(GAEC_ADF_BSZ - GAEC_OFF3));
	mar 	*ar4+0
	stm 	#(GAEC_SECTIONS3 - 1), ar2
; tc is (band == 0)	
	bc		C26, tc
		mar 	*ar3+
		mar		*+ar4(#(GAEC_BANDS*GAEC_RCV_SZ))
C26	
	
	call	_gaec_adapt_dc3_core
	
	andm 	#~1, *(pmst)
	ret
	
;-------------------------------------------------------------------------
	.global _gaec_adapt_ac3p
;-------------------------------------------------------------------------
_gaec_adapt_ac3p
; GAEC_tDb *pDb		= a;
; GAEC_tSc *pSc		= sp(1)
; S16 blk			= sp(2)
;
	pshm	ar1
	pshm	ar6
	pshm	ar7
	stlm	a, ar2
	ssbx 	sxm
	orm		#0x1, *(pmst)
	mvdk	*sp(1+3), ar3
	mvdk 	*sp(2+3), ar0
;	
; ptr assignment
;
; ar0 = blk
; ar1 = pSc->u.aA3[band]
; ar2 = pDb
; ar3 = pSc
; ar4 = pSc->asSSC[band]
; ar5 = pDb->aslEn2[band]
; ar6 = pDb->aslAdEn[band]
; ar7 = pSc->aasErr[band][blk]
;
	mvmm	ar3, ar4
	mar 	*+ar4(#(GAEC_tSc.asSSC+1));
	mvmm 	ar2, ar5
	mar		*+ar5(#(GAEC_tDb.aslEn3+2));
	mvmm 	ar2, ar6
	mar		*+ar6(#(GAEC_tDb.aslAdEn+2));
	mvmm 	ar3, ar7
	mar		*+ar7(#(GAEC_tSc.aasErr+GAEC_BLKS));
	mar		*ar7+0
	mvmm	ar3, ar1
	mar		*+ar1(#(GAEC_tSc.u.aA3))
	
	stm 	#(GAEC_BANDS-1)-1, brc
	rptb	C35-1
		ld  	*ar4, a
		bc		C34, aeq;

			ld 		#_ADJSS, a
			call 	_gaec_adapt_pre	
			
			.loop 2
			
			mpy		*ar7, a
			ld 		a, asm, a
			add 	#1, 14, a
			sth 	a, 1, *ar1+
			
			mpy		*ar7(#(GAEC_BANDS*GAEC_BLKS)), a
			ld 		a, asm, a
			add 	#1, 14, a
			sth 	a, 1, *ar1+
			
			mar 	*ar7+
			
			.endloop
			mar		*+ar7(#-2)
			
			st 		#_DEXP, *ar1+
			mar 	*+ar1(#(-GAEC_tScA3_Sz))
C34	
;
; ptr increment - to the next band
		mar		*+ar1(#GAEC_tScA3_Sz); pA3
		mar		*ar4+				; asSSC
		mar 	*+ar5(#2)			; aslEn3
		mar 	*+ar6(#2)			; aslAdEn
		mar		*+ar7(#GAEC_BLKS) 	; aasErr
C35	
	andm	#~0x1, *(pmst)
	popm	ar7
	popm	ar6
	popm	ar1
	ret
;-------------------------------------------------------------------------
	.global _gaec_adapt_ac3d
;-------------------------------------------------------------------------
_gaec_adapt_ac3d
; GAEC_tDb *pDb		= a;
; GAEC_tSc *pSc		= sp(1)
; S16 blk			= sp(2)
;
	pshm	ar1
	pshm	ar6
	pshm	ar7
	stlm	a, ar2
	ssbx 	sxm
	orm		#0x1, *(pmst)
	mvdk	*sp(1+3), ar1
	mvdk 	*sp(2+3), ar0
;	
; set up ptrs for adaptation
; 
; ar0 = blk
; ar1 = pSc->u.aA3 [ tx, sErr1I, sErr1Q, sErr2I, sErr2Q, Dexp ]
; ar2 = psErr (pSc->asTmp[..]), both ErrI & ErrQ
; ar3 = psAdf
; ar4 = psRcvI
; ar5 = psRcvQ
; ar6 = loop cntr (sections)
; ar7 = loop cntr (bands)
;

	mar 	*+ar1(#(GAEC_tSc.u.aA3))
	mvdk	*ar2(#(GAEC_tDb.psAdf)), ar3
	mar		*+ar3(#((GAEC_OFF3+GAEC_ADF_SZ)*2))
	mvdk	*ar2(#(GAEC_tDb.psRcv)), ar4;	
	mar		*+ar4(#(GAEC_RCV_SZ + GAEC_ADF_BSZ - GAEC_OFF3));
	mar		*ar4+0;
	mvmm	ar4, ar5
	mar		*+ar5(#(GAEC_RCV_SZ*GAEC_BANDS))
	
	stm 	#(GAEC_BANDS-2), ar7
C36	
		stm 	#(GAEC_SECTIONS3 - 1), ar6
		call	_gaec_adapt_ac3_core
		mar 	*+ar3(#(GAEC_ADF_SZ - GAEC_SECTIONS3*GAEC_SECTION_SZ)*2)
		mar 	*+ar4(#(GAEC_SECTIONS3*GAEC_SECTION_SZ + GAEC_RCV_SZ))
		mar 	*+ar5(#(GAEC_SECTIONS3*GAEC_SECTION_SZ + GAEC_RCV_SZ))
	banz 	C36, *ar7-
	
	
	andm	#~0x1, *(pmst)
	popm	ar7
	popm	ar6
	popm	ar1
	ret
	
	.sect ".smcode"
;-------------------------------------------------------------------------
	.global _gaec_adapt_dc3_core
;-------------------------------------------------------------------------
_gaec_adapt_dc3_core
; S16 *psAdf = ar3		
; S16 *psRcv = ar4
; S16 *psTmp = ar5
; 		asTmp = [tx, sErr1, sErr2]
; (GAEC_SECTIONSX - 1) = ar2
; 
; this is a self-modifying code. 
;
	frame 	#-1
	ld 		*ar5+, b
;	
; set first shift (tx-16) in 'ld a, tx-16, a'
	sub 	#16, b, a
	and		#0x001f, a
	or		#0xf440, a
	stl		a, *sp(0)
	mvdp	*sp(0), C10S + 5
;	
; set second shift (16-tx) in 'sth a, 15-tx, *ar3+0%
	sub		#16, b, a
	neg 	a	
	or		#0x9ad0, a
	stl		a, *sp(0)
; stl a, 0, *ar3+0% instead of sth a, 16, *ar3+0%, which is not valid	
	xc 		2, beq
		st 		#0x98d0, *sp(0)
	mvdp	*sp(0), C10S + 8
;
; go	
	stm 	#2, ar0
	stm		#0, bk
C10S
		stm 	#GAEC_SECTION_SZ-1, brc
		rptb 	C10E-1
			ldr  	*ar3, a
			ld 		a, -6, a
			mac 	*ar4+, *ar5+, a
			mac 	*ar4-, *ar5-, a
			sth 	a, 6, *ar3+0%
			mar 	*ar4-
C10E
		stm		#_DEXP, t
		mpy 	*ar5, b
		add 	#1, 14, b
		sth		b, 1, *ar5+

		mpy 	*ar5, b
		add 	#1, 14, b
		sth		b, 1, *ar5-
		
	banz 	C10S, *ar2- 
	frame 	#1
	ret
	
;-------------------------------------------------------------------------
	.global _gaec_adapt_ac3_core
;-------------------------------------------------------------------------
_gaec_adapt_ac3_core

	ld 		*ar1+, b
	frame 	#-1
;	
; set shift (tx-16) in 'ld a, tx-16, a'
	sub 	#16, b, a
	and		#0x001f, a
	or		#0xf440, a
	stl		a, *sp(0)
	mvdp	*sp(0), C20S + 6
; set shift (tx-16) in 'ld b, tx-16, b'
	sub 	#16, b, a
	and		#0x001f, a
	or		#0xf740, a
	stl		a, *sp(0)
	mvdp	*sp(0), C20S + 7
;	
; set shift (16-tx) in 'sth a, 16-tx, *ar3+
	sub		#16, b, a
	neg 	a	
	or		#0x9a90, a
	stl		a, *sp(0)
; stl a, 0, *ar3+0% instead of sth a, 16, *ar3+0%, which is not valid	
	xc 		2, beq
		st 		#0x9890, *sp(0)
	mvdp	*sp(0), C20S + 16
;	
; set shift (16-tx) in 'sth b, 16-tx, *ar3+
	sub		#16, b, a
	neg 	a	
	or		#0x9b90, a
	stl		a, *sp(0)
; stl a, 0, *ar3+0% instead of sth b, 16, *ar3+, which is not valid	
	xc 		2, beq
		st 		#0x9990, *sp(0)
	mvdp	*sp(0), C20S + 17
;	
; set ptrs	
	mvmm	ar1, ar2
	mar 	*+ar1(#4)
	stm 	#-3, ar0
	stm		#0, bk
C20S
		stm 	#GAEC_SECTION_SZ-1, brc
		rptb 	C20E-1
			ldr  	*ar3+, a			;[4]
			ldr  	*ar3-, b
			ld 		a, -6, a			;[6]
			ld 		b, -6, b
			mac 	*ar4, *ar2, a		; [8]
			mac 	*ar5, *ar2+, b
			mac 	*ar5+, *ar2, a
			mas 	*ar4+, *ar2+, b
			mac 	*ar4, *ar2, a		; [12]
			mac 	*ar5, *ar2+, b
			mac 	*ar5-, *ar2, a
			mas 	*ar4-, *ar2+0%, b
			sth 	a, 6, *ar3+			; [16]
			sth 	b, 6, *ar3+
			mar 	*ar4-
			mar		*ar5-
C20E
		ld 		*ar1, t
		stm		#(4-1), brc
		rptb	C20EE-1
			mpy 	*ar2, a
			add 	#1, 14, a
			sth		a, 1, *ar2+
C20EE		
		mar 	*+ar2(#-4)
	banz 	C20S, *ar6- 
	mar 	*ar1+
	frame 	#1
	ret
		
			

⌨️ 快捷键说明

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