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

📄 gaecdtda.s54

📁 TI公司DSP/tms320c55x/tms320c54x系列的声学回声消除代码
💻 S54
📖 第 1 页 / 共 2 页
字号:
	nop
	mvdk	*sp(1+1), ar3
	
_sDlt2			.set 0		
_sErleLoss2		.set 1
	frame 	#-2
	
;	
; ptrs assignment	
; ar0 = pDb->sExpectedErrEn
; ar1 = pDb->sVadRxNse
; ar3 = pSc->sErrEn
; ar4 = pDb->sErlCrit
; ar5 = pDb->sDtCrit
;
	mvmm	ar2, ar0
	mar 	*+ar0(#GAEC_tDb.sExpectedErrEn)
	mvmm	ar2, ar1
	mar 	*+ar1(#GAEC_tDb.sVadErrNse)	
	mar 	*+ar3(#GAEC_tSc.sErrEn)	
	mvmm	ar2, ar4
	mar 	*+ar4(#GAEC_tDb.sErlCrit)	
	mvmm	ar2, ar5
	mar 	*+ar5(#GAEC_tDb.sDtCrit)		
;
; adjust nse level	
	ld 		*ar0, a
	sub 	*ar1, a, b
	stl 	b, *sp(_sDlt2)
	sub 	#_DTD_NSE_THR, b
	nop
	nop
	xc 		2, blt
		sub 	*sp(_sDlt2), -1, a
	xc 		2, blt
		add 	#_DTD_NSE_THR2, a
		
	add 	#_DTD_NSE_THR, 1, b
	nop
	nop
	xc 		2, blt
		sub 	*sp(_sDlt2), -1, a
	xc 		2, blt
		sub 	#_DTD_NSE_THR2, a
;	stl 	a, *ar3(#GAEC_tSc.asTmp+2-GAEC_tSc.sErrEn)
;
; make ErleLoss		
	ld		*ar3, b
	sub 	a, b
	sub 	*ar2(#GAEC_tDb.Cfg.sDtThr), b
	ld 		#(GAEC_CRIT_MIN>>3), a
	max 	a
	stl 	a, *sp(_sErleLoss2)
;
; update sErlCrit	
	sub 	*ar2(#GAEC_tDb.Cfg.sDtThr), a
	add 	*ar4, a
	ld 		#GAEC_CRIT_MAX, b
	min 	a
	ld 		#GAEC_CRIT_MIN, b
	max 	a
	stl	 	a, *ar4
;
; limit erle loss	
	ld 		*sp(_sErleLoss2), a
	ld 		#_DTD_CRIT_THR,1, b
	min 	a
	stl 	a, *sp(_sErleLoss2)
;
; update sDtCrit
	ld 		*ar5, a
	add 	*sp(_sErleLoss2), a
	ld 		#GAEC_CRIT_MAX, b
	min 	a
	ld 		#GAEC_CRIT_MIN, b
	max 	a
	stl	 	a, *ar5
	
;	ld 		*sp(_sErleLoss2), a
;	stl		a, *ar3(#GAEC_tSc.asTmp - GAEC_tSc.sErrEn)
;	ld 		*sp(_sDlt2), a
;	stl		a, *ar3(#GAEC_tSc.asTmp - GAEC_tSc.sErrEn+1)
;
; exit
	frame 	#2
	popm	ar1
	ret	
	
;-------------------------------------------------------------------------
	.global _gaec_dtd_criteria_sb
;-------------------------------------------------------------------------
_gaec_dtd_criteria_sb
; GAEC_tDb *pDb,
; GAEC_tSc *pSc, 
;
	stlm 	a,ar2
	ssbx	sxm
	nop
	mvdk	*sp(1), ar3
	nop
	pshm 	ar1
;	pshm 	ar6
	
_sDlt3			.set 0		
_sErleLoss3		.set 1
_sMax3			.set 2
_band3			.set 3
_sErleMax3		.set 4
	frame 	#-5
	
;	
; ptrs assignment	
; ar0 = pDb->sExpectedErrEn
; ar1 = pDb->sVadRxNse
; ar3 = pSc->sErrEn
; ar4 = pDb->sErlCrit
; ar5 = pDb->sDtCrit
;
;	mvmm 	ar3, ar6
;	mar 	*+ar6(#GAEC_tSc.asTmp)
	
	mvmm	ar2, ar0
	mar 	*+ar0(#GAEC_tDb.asExpectedErrEn)
	mvmm	ar2, ar1
	mar 	*+ar1(#GAEC_tDb.asVadErrNse)	
	mar 	*+ar3(#GAEC_tSc.asErrEn)	
	mvmm	ar2, ar4
	mar 	*+ar4(#GAEC_tDb.asErlCrit)	
	mvmm	ar2, ar5
	mar 	*+ar5(#GAEC_tDb.asDtCrit)
;
; find sMax
	ld 		*ar0+, a
	stm 	#GAEC_BANDS-1, brc
	rptb	#K60-1
		ld 		*ar0+, b
		max 	a
K60	
	stl 	a, *sp(_sMax3)
;	stl 	a, *ar6+
	mar 	*+ar0(#-(GAEC_BANDS+1))
	sub		*ar3(#GAEC_tSc.sErleMax-GAEC_tSc.asErrEn), a
	stl 	a, *sp(_sErleMax3)
;
; loop start	
	st 		#0, *sp(_band3)
	
K61
		ld 		*sp(_sMax3), a
		sub 	*ar0, a
		ld 		*ar0+, b
		add 	a, -2, b
		ld 		*sp(_sErleMax3), a
		max 	a
		
		cmpm	*sp(_band3), #0
		nop
		nop
		xc 		2, tc
			add 	#GAEC_1DB*4, a
		cmpm	*sp(_band3), #1
		nop
		nop
		xc 		2, tc
			add 	#GAEC_1DB*2, a
;		stl 	a, *ar6+	
;
; adjust nse level	
		sub 	*ar1+, a, b
		stl 	b, *sp(_sDlt3)
		sub 	#_DTD_NSE_THR, b
		nop
		nop
		xc 		2, blt
			sub 	*sp(_sDlt3), -1, a
		xc 		2, blt
			add 	#_DTD_NSE_THR2, a
		
		add 	#_DTD_NSE_THR, 1, b
		nop
		nop
		xc 		2, blt
			sub 	*sp(_sDlt3), -1, a
		xc 		2, blt
			sub 	#_DTD_NSE_THR2, a
;		stl 	a, *ar6+
;
; make ErleLoss		
		ld		*ar3+, b
		sub 	a, b
		sub 	*ar2(#GAEC_tDb.Cfg.sDtThr), b
		ld 		#(GAEC_CRIT_MIN>>2), a
		max 	a
		stl 	a, *sp(_sErleLoss3)
;		stl 	a, *ar6+
;
; update sErlCrit	
		sub 	*ar2(#GAEC_tDb.Cfg.sDtThr), a
		add 	*ar4, a
		ld 		#GAEC_CRIT_MAX, b
		min 	a
		ld 		#GAEC_CRIT_MIN, b
		max 	a
		stl	 	a, *ar4+
;
; limit erle loss	
		ld 		*sp(_sErleLoss3), a
		ld 		#_DTD_CRIT_THR,1, b
		min 	a
		stl 	a, *sp(_sErleLoss3)
;
; update sDtCrit
		ld 		*ar5, a
		add 	*sp(_sErleLoss3), a
		ld 		#GAEC_CRIT_MAX, b
		min 	a
		ld 		#GAEC_CRIT_MIN, b
		max 	a
		stl	 	a, *ar5+
	
;		mar 	*ar0+
;		mar 	*ar1+
;		mar 	*ar3+
;		mar 	*ar4+
;		mar 	*ar5+
		addm 	#1, *sp(_band3)
		cmpm	*sp(_band3), #(GAEC_BANDS+1)
	bc 		K61, ntc
;
; exit
	frame 	#5
;	popm	ar6
	popm	ar1
	ret	
		
;-------------------------------------------------------------------------
	.global _gaec_dtd_dec_criteria
;-------------------------------------------------------------------------
_gaec_dtd_dec_criteria
; GAEC_tDb *pDb,
; GAEC_tSc *pSc, 
;
	stlm 	a,ar2
	ssbx	sxm
	nop
	mvmm 	ar2, ar3
	mar 	*+ar3(#GAEC_tDb.asDtCrit)
	ld 		#GAEC_CRIT_MIN, 16, b
	st 		#(_DTD_CRIT_THR/3), *sp(1)
	mvmm 	sp, ar4
	mar 	*ar4+
	stm 	#GAEC_BANDS, brc
	rptb	K70-1
		sub 	*ar3, *ar4, a
		max 	a
		sth 	a, *ar3+
K70	
	mvmm	ar2, ar3
	mar 	*+ar3(#GAEC_tDb.sDtCrit)
	sub 	*ar3, *ar4, a
	max 	a
	sth 	a, *ar3+
	
	ret
	
;-------------------------------------------------------------------------
	.global _gaec_dtd_avrg_erle_sb
;-------------------------------------------------------------------------
_gaec_dtd_avrg_erle_sb
; GAEC_tDb *pDb,
; GAEC_tSc *pSc, 
;
	stlm 	a, ar2
	ssbx 	sxm
	nop
	mvdk	*sp(1), ar3
	pshm	ar1
	pshm	ar6
	pshm	ar7
	
; ar0 -> pSc->asSndEn[band];
; ar1 -> pSc->asRcvEn[band];
; ar4 -> pDb->asErleAv[band];
; ar5 -> pDb->asErlAv[band];
; ar6 -> pDb->asVadRxNse[band];
; ar7 -> pDb->asDtCrit[band];
	mvmm	ar3, ar0
	mar		*+ar0(GAEC_tSc.asSinEn)
	mvmm	ar3, ar1
	mar		*+ar1(GAEC_tSc.asRoutEn)
	mvmm	ar2, ar4
	mar		*+ar4(GAEC_tDb.asErleAv)
	mvmm	ar2, ar5
	mar		*+ar5(GAEC_tDb.asErlAv)
	mvmm	ar2, ar6
	mar		*+ar6(GAEC_tDb.asVadErrNse)
	mvmm	ar2, ar7
	mar		*+ar7(GAEC_tDb.asDtCrit)
	
_sCoef4			.set 0
_sCorr4			.set 1
_uCond4			.set 2
	frame 	#-3
;
; zero asTmp[0...bands+1]	
	mar 	*+ar3(GAEC_tSc.u.asTmp)
	rpt 	#GAEC_BANDS
		st 		#0, *ar3+
	mar		*+ar3(#-(GAEC_BANDS+1))
	
	st 		#1024, *sp(_sCoef4)
	cmpm	*ar2(#GAEC_tDb.uAdfMode), #4
	st 		#4096-GAEC_BANDS*300, *sp(_sCorr4)
;	nop
;	nop
	xc 		2, tc
		st 		#256, *sp(_sCoef4)
	cmpm	*ar2(#GAEC_tDb.uAdfMode), #3
	stm 	#GAEC_BANDS, brc		
;	nop
;	nop
	xc 		2, tc
		st 		#512, *sp(_sCoef4)
		
	rptb 	K81-1
		st 		#0, *sp(_uCond4)
;            (pDb->asDtCrit[band] < 0))
		ld 		*ar7+, a
;        if (( pSc->asSndEn[band] - pDb->asErleAv[band] > pDb->asVadRxNse[band]) &&
		ld 		*ar0+, b
		sub 	*ar4, b
		xc 		2, alt
			addm 	#1, *sp(_uCond4)
		sub 	*ar6, b
;            ((pSc->asRcvEn[band] - pDb->asErleAv[band] - pDb->asErlAv[band]) > pDb->asVadRxNse[band]) &&
		ld 		*ar1+, a
		sub 	*ar4+, a
		xc 		2, bgt
			addm 	#1, *sp(_uCond4)
		sub 	*ar5+, a
		sub 	*ar6+, a
		ld 		*sp(_sCoef4), t
		mpy 	*sp(_sCorr4), b
;		nop
;		nop
		xc 		2, agt
			addm 	#1, *sp(_uCond4)
		cmpm	*sp(_uCond4), #3	
		add 	#1, 11, b
		xc 		1, tc
			sth 	b, 4, *ar3	
		mar 	*ar3+
		addm 	#300, *sp(_sCorr4)
K81
	mar 	*+ar3(#-(GAEC_BANDS+1))
	mar 	*+ar4(#-(GAEC_BANDS+1))
;
; average erle	
	mvmm	ar3, ar6
	mar 	*+ar6(#GAEC_tSc.asErle-GAEC_tSc.u.asTmp)
	stm 	#GAEC_BANDS, brc
	rptb 	K82-1
		ld 		*ar4, 16, a
		sub 	*ar6+, 16, a
		ld 		#GAEC_1DB*6, 16, b
		min 	a
		mpya	*ar3+
		add 	#1, 14, b
		sth 	b, 1, *sp(_sCorr4)
		ld 		*ar4, a
		sub 	*sp(_sCorr4), a
		ld 		#0, b
		max 	a
		stl 	a, *ar4+
K82	
;
; average erl		
	mar 	*+ar3(#-(GAEC_BANDS+1))
	mar 	*+ar5(#-(GAEC_BANDS+1))
	mvmm	ar3, ar7
	mar 	*+ar7(#GAEC_tSc.asErl-GAEC_tSc.u.asTmp)
	stm 	#GAEC_BANDS, brc
	rptb 	K83-1
		ld		*ar7+, 16, a
		sub		*ar5, 16, a
		ld		*ar5, 15, b
		maca	*ar3+
		add 	#1, 14, b
		ld 		*ar2(#GAEC_tDb.Cfg.sErlMin), 15, a
		max 	b
		sth		b, 1, *ar5+
K83		
	frame 	#3
	popm	ar7
	popm	ar6
	popm	ar1
	ret

⌨️ 快捷键说明

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