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

📄 gaeca2a.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)
_DEXP           		.set (22937) ; Q15(0.7)

;-------------------------------------------------------------------------
	.global _gaec_get_energy2
;-------------------------------------------------------------------------
_gaec_get_energy2	
;
; 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_OFF2))
	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.aslEn2))
;
; 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 __invert
;-------------------------------------------------------------------------
__invert
; S32 *pslEn	= a
; S16 sStepSz	= sp(1)
; return a
;
;
	stlm	a, ar2
	ssbx	sxm
	nop
	frame 	#-2
	
	dld 	*ar2, a
	exp 	a
	nop
	norm 	a
	st 		t, *sp(1)
	ld 		a, -16, a
	ld 		#1,15, b
	sub 	a, b
	stl 	b, *sp(0)
	ld 		#16020, a
	add 	*sp(0), -1, a
	squr 	*sp(0), b
	add		b, -15, a
	ld 		a, 8, a
	ld 		a, 8, a
	mpya 	*sp(3)
	add 	#(1<<11), b
	ld 		b, -12, b
	dst 	b, *ar2
	ld 		#30, a
	sub 	*sp(1), a;
	
	nop
	nop
	frame   #2
	ret
	
	
	
;-------------------------------------------------------------------------
	.global _gaec_adapt_dc2p
;-------------------------------------------------------------------------
_gaec_adapt_dc2p
; GAEC_tDb *pDb		= a;
; GAEC_tSc *pSc		= sp(1)
; S16 blk			= sp(2)
; S16 band			= sp(3)
;
	pshm	ar1
	pshm	ar6
	pshm	ar7
	stlm	a, ar2
	ssbx 	sxm
	orm 	#1, *(pmst)
	mvdk	*sp(1+3), ar3
	mvdk	*sp(2+3), ar0
	cmpm 	*sp(3+3), #0
;	
; set pointers
	mvmm	ar3, ar4
	mar 	*+ar4(#(GAEC_tSc.asSSC))
	mvmm	ar2, ar5
	mar		*+ar5(#(GAEC_tDb.aslEn2))
	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.aA2))
;
; adjust pointers if band == BANDS	
	bc		B20, tc
		mar		*+ar4(#(GAEC_BANDS))
		mar		*+ar5(#(GAEC_BANDS*2))
		mar		*+ar6(#(GAEC_BANDS*2))
		mar		*+ar7(#(GAEC_BANDS*GAEC_BLKS))
B20	
	ld  	*ar4, a
	bc		B21, aeq;
	
		ld 		#(_ADJSS+1), a
		call    _gaec_adapt_pre
		
		mpy		*ar7+, b
		ld 		b, asm, b
		add 	#1, 14, b
		sth		b, 1, *ar1+
		
B21	
	andm 	#~1, *(pmst)
	popm	ar7
	popm	ar6
	popm	ar1
	ret
	
;-------------------------------------------------------------------------
	.global _gaec_adapt_dc2d
;-------------------------------------------------------------------------
_gaec_adapt_dc2d
; GAEC_tDb *pDb		= a;
; GAEC_tSc *pSc		= sp(1)
; S16 blk			= sp(2)
; S16 band			= sp(3)
;
	stlm	a, ar2
	ssbx 	sxm
	nop
	orm 	#1, *(pmst)
	mvdk	*sp(1), ar5
	mvdk	*sp(2), ar0
	cmpm 	*sp(3), #0
;	
; set up ptrs
; ar0 = blk
; ar2 = sections
; ar3 = psAdf
; ar4 = psRcv
; ar5 = pA2
;
	mar		*+ar5(#(GAEC_tSc.u.aA2))
	mvdk	*ar2(#(GAEC_tDb.psAdf)), ar3
	mar		*+ar3(#(GAEC_OFF2*2))	
	mvdk	*ar2(#(GAEC_tDb.psRcv)), ar4;		
	mar		*+ar4(#(GAEC_ADF_BSZ - GAEC_OFF2));
	mar 	*ar4+0
	stm 	#(GAEC_SECTIONS2 - 1), ar2
; tc is still (band == 0)	
	bc		B26, tc
		mar 	*ar3+
		mar		*+ar4(#(GAEC_BANDS*GAEC_RCV_SZ))
B26	
	call	_gaec_adapt_dc2_core
	andm 	#~1, *(pmst)
	ret
	
;-------------------------------------------------------------------------
	.global _gaec_adapt_ac2p
;-------------------------------------------------------------------------
_gaec_adapt_ac2p
; 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.aA2[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.aslEn2+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.aA2))
	
	stm 	#GAEC_BANDS-1-1, brc
	rptb	B35-1
		ld  	*ar4, a
		bc		B34, aeq;
	
			ld 		#_ADJSS, a
			call 	_gaec_adapt_pre
			
			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+
			
			st 		#_DEXP, *ar1+
			mar 	*+ar1(#(-GAEC_tScA2_Sz))
B34	
; ptr increment
		mar		*+ar1(#GAEC_tScA2_Sz)
		mar		*ar4+
		mar 	*+ar5(#2)
		mar 	*+ar6(#2)
		mar		*+ar7(#GAEC_BLKS) ; next band
B35	
	andm	#~0x1, *(pmst)
	
	popm	ar7
	popm	ar6
	popm	ar1
	ret
;-------------------------------------------------------------------------
	.global _gaec_adapt_ac2d
;-------------------------------------------------------------------------
_gaec_adapt_ac2d
; 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.aA2 [ tx, sErrI, sErrQ, 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.aA2))
	mvdk	*ar2(#(GAEC_tDb.psAdf)), ar3
	mar		*+ar3(#((GAEC_OFF2+GAEC_ADF_SZ)*2))
	mvdk	*ar2(#(GAEC_tDb.psRcv)), ar4;	
	mar		*+ar4(#(GAEC_RCV_SZ + GAEC_ADF_BSZ - GAEC_OFF2));
	mar		*ar4+0;
	mvmm	ar4, ar5
	mar		*+ar5(#(GAEC_RCV_SZ*GAEC_BANDS))
	
	stm 	#(GAEC_BANDS-2), ar7
B36	
		stm 	#(GAEC_SECTIONS2 - 1), ar6
		
		call	_gaec_adapt_ac_core
		
		mar 	*+ar3(#(GAEC_ADF_SZ - GAEC_SECTIONS2*GAEC_SECTION_SZ)*2)
		mar 	*+ar4(#(GAEC_SECTIONS2*GAEC_SECTION_SZ + GAEC_RCV_SZ))
		mar 	*+ar5(#(GAEC_SECTIONS2*GAEC_SECTION_SZ + GAEC_RCV_SZ))
	banz 	B36, *ar7-
	
	andm	#~0x1, *(pmst)
	popm	ar7
	popm	ar6
	popm	ar1
	ret
	
	.sect ".smcode"
	
;-------------------------------------------------------------------------
	.global _gaec_adapt_dc2_core
;-------------------------------------------------------------------------
_gaec_adapt_dc2_core
	frame	#-1
; S16 *psAdf = ar3		
; S16 *psRcv = ar4
; S16 *psTmp = ar5
; 		asTmp = [tx, sErr]
; (GAEC_SECTIONSX - 1) = ar2
; 
; this is a self-modifying code. 
;
	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), B10S + 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), B10S + 7
;
; go	
	stm 	#2, ar0
	stm		#0, bk
B10S
		stm 	#GAEC_SECTION_SZ-1, brc
		rptb 	B10E-1
			ldr  	*ar3, a
			ld 		a, -6, a
			mac 	*ar4-, *ar5, a
			sth 	a, 6, *ar3+0%
B10E
		stm 	#_DEXP, t
		mpy 	*ar5, b
		add 	#1, 14, b
		sth 	b, 1, *ar5
	banz 	B10S, *ar2- 
	frame 	#1
	ret
	
;-------------------------------------------------------------------------
	.global _gaec_adapt_ac_core
;-------------------------------------------------------------------------
_gaec_adapt_ac_core

	ld 		*ar1+, b
	frame   #-1	; give space for internal vars of gaec_adapt_core
;	
; 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), B20S + 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), B20S + 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), B20S + 12
;	
; 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), B20S + 13
;	
; set ptrs	
	mvmm	ar1, ar2
	mar 	*+ar1(#2)
B20S
		stm 	#GAEC_SECTION_SZ-1, brc
		rptb 	B20E-1
			ldr  	*ar3+, a			;[4]
			ldr  	*ar3-, b
			ld 		a, -6, a			;[6]
			ld 		b, -6, b
			mac 	*ar4, *ar2, a
			mac 	*ar5, *ar2+, b
			mac 	*ar5-, *ar2, a
			mas 	*ar4-, *ar2-, b
			sth 	a, 6, *ar3+			; [10]
			sth 	b, 6, *ar3+
B20E
		ld 		*ar1, t
		
		mpy 	*ar2, a
		add 	#1, 14, a
		sth		a, 1, *ar2+
		
		mpy 	*ar2, a
		add 	#1, 14, a
		sth		a, 1, *ar2-
		
	banz 	B20S, *ar6- 
	mar 	*ar1+
	frame 	#1
	ret
		
			

⌨️ 快捷键说明

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