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

📄 gaeca4a.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"

;-------------------------------------------------------------------------
	.global _gaec_adapt_pre
;-------------------------------------------------------------------------
_gaec_adapt_pre	
; in
;-----------
; a = _ADJSS
; ar1 -> pSc->asTmp[0]
; ar4 -> pSc->asSSC[band]
; ar5 -> pDb->aslEnX[band]
; ar6 -> pDb->aslAdEn[band]
;
; out
;----------
; asm: shift 
; t:   corr step size 
;
	frame 	#-3
	nop
	stl 	a, *sp(2)
;	
; add energy	
	dld 	*ar5, a
	dld 	*ar6, b
	add 	a, -4, b
	ld 		#GAEC_ADEN_BASE, GAEC_ADEN_SHFT, a;
	min     b
	dst 	b, *ar6
	dadd	*ar5, b, a
;	
; invert here, put it into t2
	exp 	a
	nop
	norm 	a
	st 		t, *sp(0)
	ld 		a, -16, a
	ld 		#1,15, b
	sub 	a, b
	stl 	b, *sp(1)
	ld 		#16020, a
	add 	*sp(1), -1, a
	squr 	*sp(1), b
	add		b, -15, a
	ld 		a, 8, a
	ld 		a, 8, a
	mpya 	*ar4
	add 	#(1<<11), b
	ld 		b, -12, b
	stlm	b, t		; t = corrected step size
	ld 		#(30 - 15), a
	add		*sp(2), a; --
	sub 	*sp(0), a; 
	stl 	a, *sp(0)	; sp(0) = tx
;
; compare tx > 15
	ld 		#15, b
	sub		*sp(0), b	; a = 15-tx
	bc 		A01, bgeq
; tx > 15	
		bd		A03
		st 		#15, *ar1+
A01	
	ld 		*sp(0), b
	bc 		A02, bgt
;	
; tx < 0	
		neg 	b
		bd 		A03
		st      #0, *ar1+
A02				
; 0 < tx < 15
		stl 	b, *ar1+
		ld 		#0, b
A03		
	stl 	b, *sp(0)
	ld 		*sp(0), asm
	
	frame	#3
	ret
;-------------------------------------------------------------------------
	
_ADJ            		.set (4)
_ADJSS          		.set (_ADJ+2)
_DEXP           		.set (29491) ; Q15(0.9)

;-------------------------------------------------------------------------
	.global _gaec_get_energy4
;-------------------------------------------------------------------------
_gaec_get_energy4	
;
; GAEC_tDb *pDb	= a
; GAEC_tSc *pSc = sp(1)
;
	stlm	a, ar2
	ssbx	sxm
	nop
;	
; psRcvI = ar3	
	mvdk	*ar2(#(GAEC_tDb.psRcv)), ar3
	mar		*+ar3(#(GAEC_ADF_BSZ-GAEC_OFF4))
;
; psRcvQ = ar4	
	mvmm	ar3, ar4
	mar		*+ar4(#(GAEC_BANDS*GAEC_RCV_SZ))
;
; pDb->aslEn4 = ar5	
	mvmm	ar2, ar5
	mar		*+ar5(#(GAEC_tDb.aslEn4))
;
	st 		#0, *sp(1)	; sp(1) = band
L01
;	
		cmpm 	*sp(1), #0
		nop
		nop
		xc 		2, ntc
			cmpm 	*sp(1), #GAEC_BANDS
		dld 	*ar5, a			
; tc = 1 if band == 0 or BANDS			
;	
		stm		#GAEC_BLKS-1, brc
		rptb	L02-1
			sub		a, -6, a
			squr	*ar3+, b 
			xc 		1, ntc	
				squra   *ar4, b
			mar 	*ar4+			; inc ptr anyway
			add		b, -2, b
			add		b, -3, b
			add		b, -_ADJ, a
L02	
		dst		a, *ar5+
		mar		*+ar3(#(GAEC_RCV_SZ-GAEC_BLKS))
		mar		*+ar4(#(GAEC_RCV_SZ-GAEC_BLKS))
		addm	#1, *sp(1)
		cmpm 	*sp(1), #(GAEC_BANDS + 1)
	bc 		L01, ntc
	
	ret	
	
	
;-------------------------------------------------------------------------
	.global _gaec_adapt_dc4p
;-------------------------------------------------------------------------
_gaec_adapt_dc4p
; GAEC_tDb *pDb		= a;
; GAEC_tSc *pSc		= sp(1)
; S16 band			= sp(2)
;
	pshm	ar1
	pshm	ar6
	pshm	ar7
	stlm	a, ar2
	ssbx 	sxm
	orm 	#1, *(pmst)
	mvdk	*sp(1+3), ar3
	cmpm 	*sp(2+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.aslEn4))
	mvmm	ar2, ar6
	mar 	*+ar6(#(GAEC_tDb.aslAdEn)) 
	mvmm	ar3, ar7
	mar 	*+ar7(#(GAEC_tSc.aasErr))
	mvmm	ar3, ar1
	mar		*+ar1(#(GAEC_tSc.u.aA4))
;
; adjust pointers if band == BANDS	
	bc		A20, tc
		mar		*+ar4(#(GAEC_BANDS))
		mar		*+ar5(#(GAEC_BANDS*2))
		mar		*+ar6(#(GAEC_BANDS*2))
		mar		*+ar7(#(GAEC_BANDS*GAEC_BLKS))
A20	
	ld  	*ar4, a
	bc		A25, aeq;
	
		ld 		#_ADJSS, a
		call    _gaec_adapt_pre
		
		stm 	#GAEC_BLKS-1, brc
		rptb	A24-1
			mpy		*ar7+, b
			ld 		b, asm, b
			add 	#1, 14, b
			sth		b, 1, *ar1+
A24	
A25	
	andm 	#~1, *(pmst)
	popm	ar7
	popm	ar6
	popm	ar1
	ret
;-------------------------------------------------------------------------
	.global _gaec_adapt_dc4d
;-------------------------------------------------------------------------
_gaec_adapt_dc4d
; GAEC_tDb *pDb		= a;
; GAEC_tSc *pSc		= sp(1)
; S16 band			= sp(2)
;
	stlm	a, ar2
	ssbx 	sxm
	orm 	#1, *(pmst)
	mvdk	*sp(1), ar5
	cmpm 	*sp(2), #0
;	
; ar0 = blk
; ar2 = pDb, sections
; ar3 = psAdf
; ar4 = psRcv
; ar5 = pSc->u.aA4
; 
	mar		*+ar5(#(GAEC_tSc.u.aA4))
	mvdk	*ar2(#(GAEC_tDb.psAdf)), ar3
	mar		*+ar3(#(GAEC_OFF4*2))	; ar3 = psAdf
	mvdk	*ar2(#(GAEC_tDb.psRcv)), ar4;			; ar4 = psRcv
	mar		*+ar4(#(GAEC_ADF_BSZ - GAEC_OFF4));
	stm 	#(GAEC_SECTIONS4 - 1), ar2
; tc is (band == 0)	
	bc		A26, tc
		mar 	*ar3+
		mar		*+ar4(#(GAEC_BANDS*GAEC_RCV_SZ))
A26	
	
	call	_gaec_adapt_dc4_core
	andm 	#~1, *(pmst)
	ret
	
;-------------------------------------------------------------------------
	.global _gaec_adapt_ac4p
;-------------------------------------------------------------------------
_gaec_adapt_ac4p
; GAEC_tDb *pDb		= a;
; GAEC_tSc *pSc		= sp(1)
;
	pshm	ar1
	pshm	ar6
	pshm	ar7
	stlm	a, ar2
	ssbx 	sxm
	nop
	orm		#0x1, *(pmst)
	mvdk	*sp(1+3), ar3
;
; ar1 = pSc->u.aA4[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.aslEn4+2));
	mvmm 	ar2, ar6
	mar		*+ar6(#(GAEC_tDb.aslAdEn+2));
	mvmm 	ar3, ar7
	mar		*+ar7(#(GAEC_tSc.aasErr+GAEC_BLKS));
	mvmm	ar3, ar1
	mar		*+ar1(#(GAEC_tSc.u.aA4))
	
	stm 	#(GAEC_BANDS-1)-1, ar0
A30	
		ld  	*ar4, a
		bc		A35, aeq;

			ld 		#_ADJSS, a
			call	_gaec_adapt_pre
		
			stm		#GAEC_BLKS-1, brc
			rptb	A34-1
				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+
A34		
			mar		*+ar7(#-GAEC_BLKS)
			
			st 		#_DEXP, *ar1+
			mar 	*+ar1(#(-GAEC_tScA4_Sz))
A35
;
; ptr increment - to the next band
		mar		*+ar1(#GAEC_tScA4_Sz); pA4
		mar		*ar4+				; asSSC
		mar 	*+ar5(#2)			; aslEn4
		mar 	*+ar6(#2)			; aslAdEn
		mar		*+ar7(#GAEC_BLKS) 	; aasErr
	banz	A30, *ar0-
	andm	#~0x1, *(pmst)
	popm	ar7
	popm	ar6
	popm	ar1
	ret
;-------------------------------------------------------------------------
	.global _gaec_adapt_ac4d
;-------------------------------------------------------------------------
_gaec_adapt_ac4d
; GAEC_tDb *pDb		= a;
; GAEC_tSc *pSc		= sp(1)
;
	pshm	ar1
	pshm	ar6
	pshm	ar7
	stlm	a, ar2
	ssbx 	sxm
	nop
	orm		#0x1, *(pmst)
	mvdk	*sp(1+3), ar1
;	
; ar0 = blk
; ar1 = pSc->u.aA4 [ tx, 4*{sErrI, sErrQ}, Dexp ]
; ar2 = psErr (pSc->u.aA4.asErr[..]), both ErrI & ErrQ
; ar3 = psAdf
; ar4 = psRcvI
; ar5 = psRcvQ
; ar6 = loop cntr (sections)
; ar7 = loop cntr (bands)
;
	mar 	*+ar1(#(GAEC_tSc.u.aA4))				
	mvdk	*ar2(#(GAEC_tDb.psAdf)), ar3
	mar		*+ar3(#((GAEC_OFF4+GAEC_ADF_SZ)*2))	
	mvdk	*ar2(#(GAEC_tDb.psRcv)), ar4;		
	mar		*+ar4(#(GAEC_RCV_SZ + GAEC_ADF_BSZ - GAEC_OFF4));
	mvmm	ar4, ar5
	mar		*+ar5(#(GAEC_RCV_SZ*GAEC_BANDS))
;	
	stm 	#(GAEC_BANDS-1)-1, ar0
A36	
		stm 	#(GAEC_SECTIONS4 - 1), ar6
		
		call	_gaec_adapt_ac4_core
		
		mar 	*+ar3(#(GAEC_ADF_SZ - GAEC_SECTIONS4*GAEC_SECTION_SZ)*2)
		mar 	*+ar4(#(GAEC_SECTIONS4*GAEC_SECTION_SZ + GAEC_RCV_SZ))
		mar 	*+ar5(#(GAEC_SECTIONS4*GAEC_SECTION_SZ + GAEC_RCV_SZ))
	banz 	A36, *ar0-
;	
	andm	#~0x1, *(pmst)
	popm	ar7
	popm	ar6
	popm	ar1
	ret
	
	.sect ".smcode"
;-------------------------------------------------------------------------
	.global _gaec_adapt_dc4_core
;-------------------------------------------------------------------------
_gaec_adapt_dc4_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), A10S + 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), A10S + 8
;
; go	
	stm 	#2, ar0
	stm		#0, bk
A10S
		stm 	#GAEC_SECTION_SZ-1, brc
		rptb 	A10E-1
			ldr  	*ar3, a
			ld 		a, -6, a
			rpt		#(GAEC_BLKS-1)
				mac 	*ar4+, *ar5+, a
			sth 	a, 6, *ar3+0%
			mar 	*+ar4(#-(GAEC_BLKS+1))
			mar 	*+ar5(#-GAEC_BLKS)
A10E
		stm		#_DEXP, t
		stm 	#GAEC_BLKS-1, brc
		rptb 	A10EE - 1
			mpy 	*ar5, b
			add 	#1, 14, b
			sth		b, 1, *ar5+
A10EE
		mar *+ar5(#-GAEC_BLKS)
		
	banz 	A10S, *ar2- 
	frame	#1
	ret
	
;-------------------------------------------------------------------------
	.global _gaec_adapt_ac4_core
;-------------------------------------------------------------------------
_gaec_adapt_ac4_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), A20S + 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), A20S + 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), A20S + 24
;	
; 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), A20S + 25
;	
; set ptrs	
	mvmm	ar1, ar2
	mar 	*+ar1(#2*GAEC_BLKS)
A20S
		stm 	#GAEC_SECTION_SZ-1, brc
		rptb 	A20E-1
			ldr  	*ar3+, a			;[4]
			ldr  	*ar3-, b
			ld 		a, -6, a			;[6]
			ld 		b, -6, b
			.loop GAEC_BLKS
			mac 	*ar4, *ar2, a		; [8]
			mac 	*ar5, *ar2+, b
			mac 	*ar5+, *ar2, a
			mas 	*ar4+, *ar2+, b
			.endloop
			sth 	a, 6, *ar3+			; [24]
			sth 	b, 6, *ar3+
			mar 	*+ar2(-GAEC_BLKS*2)			
			mar 	*+ar4(-GAEC_BLKS-1)
			mar		*+ar5(-GAEC_BLKS-1)
A20E
		ld 		*ar1, t
		stm		#(2*GAEC_BLKS-1), brc
		rptb	A20EE-1
			mpy 	*ar2, a
			add 	#1, 14, a
			sth		a, 1, *ar2+
A20EE		
		mar 	*+ar2(#-2*GAEC_BLKS)
	banz 	A20S, *ar6- 
	mar 	*ar1+
	frame 	#1
	ret
		
			

⌨️ 快捷键说明

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