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

📄 gaecdtda.s55

📁 TI公司DSP/tms320c55x/tms320c54x系列的声学回声消除代码
💻 S55
字号:
*-------------------------------------------------------------------------*
*                                                                         *
*   THIS IS AN UNPUBLISHED WORK CONTAINING CONFIDENTIAL AND PROPRIETARY   *
*   INFORMATION.  IF PUBLICATION OCCURS, THE FOLLOWING NOTICE APPLIES:    *
*      "COPYRIGHT 2002 MIKET DSP SOLUTIONS, ALL RIGHTS RESERVED"          *
*                                                                         *
*-------------------------------------------------------------------------*/
	.mmregs
    .cpl_on
    .arms_on
	.include "gaeci.h55"
	.sect ".ftext2"

;-------------------------------------------------------------------------

_DTSSC              		.set (0)

_ERL_CRIT_THR       		.set (GAEC_1DB*3)
_DTD_CRIT_THR       		.set (GAEC_1DB*6)
_DTD_NSE_THR        		.set (GAEC_1DB*8)

	.ref _gaec_utl_pkt_energy
	
;-------------------------------------------------------------------------
	.global			_gaec_dtd_exp_err
;-------------------------------------------------------------------------
_gaec_dtd_exp_err
; GAEC_tDb *pDb		= ar0
; GAEC_tSc *pSc		= ar1
;
	pshboth(xar5)
	pshboth(xar6)
	
	xar2 = mar(*ar0(#(GAEC_tDb.asRoutEnHst)))
	xar3 = mar(*ar0(#(GAEC_tDb.sErleAv)))
	xar4 = mar(*ar0(#(GAEC_tDb.sErlAv)))
	xar5 = mar(*ar0(#(GAEC_tDb.sExpectedErrEn)))
	
	ac0 = *ar1(#(GAEC_tSc.sRoutEn));
	brc0 = #(GAEC_ADF_FRS-1)
	localrepeat {
		ac1 = *ar2+
		ac0 = max(ac1, ac0)
	}
	ac2 = *ar3
	ac3 = *ar1(#(GAEC_tSc.sErleMax))
	ac2 = min(ac3, ac2)
	ac0 = ac0 - ac2;
	ac0 = ac0 - *ar4;
	
	ac1 = ac0 - *ar5
	*ar5 = *ar5 - #(6*17) ; GAEC_DB(0.6)
	if (ac1 > #0) execute (D_unit)
		|| *ar5 = ac0;
;		
; shift	nrg hst
	mar (ar2 - #(GAEC_ADF_FRS))
	xar6 = mar(*ar2(#1))
	repeat (#(GAEC_ADF_FRS-2))
		*ar2+ = *ar6+
	ac0 = *ar1(#(GAEC_tSc.sRoutEn));
	*ar2 = ac0;
	
	xar6 = popboth()
	xar5 = popboth()
	return;
;-------------------------------------------------------------------------
	.global			_gaec_dtd_exp_err_sb
;-------------------------------------------------------------------------
_gaec_dtd_exp_err_sb
; GAEC_tDb *pDb		= ar0
; GAEC_tSc *pSc		= ar1
;
	pshboth(xar5)
	
	xar2 = mar(*ar0(#(GAEC_tDb.aasRoutEnHst)))
	xar3 = mar(*ar0(#(GAEC_tDb.asErleAv)))
	xar4 = mar(*ar0(#(GAEC_tDb.asErlAv)))
	xar5 = mar(*ar0(#(GAEC_tDb.asExpectedErrEn)))
	xar0 = mar(*ar1(#(GAEC_tSc.asRoutEn)))

	ac3 = *ar1(#(GAEC_tSc.sErleMax))
	brc0 = #(GAEC_BANDS+1-1)
	brc1 = #(GAEC_ADF_FRS-1)
	localrepeat {
		t0 = *ar0+;
		ac0 = t0;
		localrepeat {
			ac1 = *ar2+
			ac0 = max(ac1, ac0)
		}
		ac2 = *ar3+
		ac2 = min(ac3, ac2)
		ac0 = ac0 - ac2;
		ac0 = ac0 - *ar4+;
	
		ac1 = ac0 - *ar5
		*ar5 = *ar5 - #(6*17) ; GAEC_DB(0.6)
		if (ac1 > #0) execute (D_unit)
			|| *ar5+ = ac0;
;		
; shift	nrg hst
		mar (ar2 - #(GAEC_ADF_FRS))
		xar1 = mar(*ar2(#1))
		repeat (#(GAEC_ADF_FRS-2))
			*ar2+ = *ar1+
		*ar2+ = t0;
	}
	xar5 = popboth()
	return;
	
;-------------------------------------------------------------------------
	.global			_gaec_dtd_vad_err
;-------------------------------------------------------------------------
_gaec_dtd_vad_err
; GAEC_tDb *pDb		= ar0
; GAEC_tSc *pSc		= ar1
;
; sErrEn = ac2;
; sDlt = ac0
; pDb->sVadCrit = ac3;
;
; ar2 -> pSc->sErrEn;
; ar3 -> pDb->sNse;
; ar4 -> pDb->sVadCrit;
; ar5 -> pDb->uAdfMode;
;
	pshboth(xar5);
	pshboth(xar6);
	
	xar2 = mar(*ar1(#(GAEC_tSc.sErrEn)));
	xar3 = mar(*ar0(#(GAEC_tDb.sVadErrNse)));
	xar4 = mar(*ar0(#(GAEC_tDb.sVadErrCrit)));
	xar5 = mar(*ar0(#(GAEC_tDb.uAdfMode)));
	xar6 = mar(*ar1(#(GAEC_tSc.sSinEn)));
	
;
; tc2 = (uAdfMode < 3)
	t0 = *ar0(#(GAEC_tDb.uAdfMode))
	t1 = #3;
	tc2 = t0 < t1; 
;
; start...
	ac0 = *ar2; ac0 = sErrEn
	ac1 = ac0 - #GAEC_VAD_NSE_MIN;
	if (ac1 <= #0) goto L03
	ac1 = *ar6;
	ac1 = ac1 - #GAEC_VAD_NSE_MIN;
	if (ac1 <= #0) goto L03
	
		ac2 = ac0 - *ar3; ac2 = sDlt
		ac1 = ac2 - #GAEC_VAD_CRIT_THR;
	
		ac3 = *ar4 + ac1;
		ac1 = #GAEC_CRIT_MAX;
		ac3 = min (ac1, ac3);
		ac1 = #GAEC_CRIT_MIN;
		ac3 = max (ac1, ac3);
		*ar4 = ac3;
;	
; adjust nse		
		ac3 = ac3 - #GAEC_VAD_CRIT_THR;
		if (ac3 >= #0) goto L01
;	
; if VadCrit < 0 : inactive
			ac2 = ac2 << #-3;
			if (!tc2) execute (AD_unit)
				|| ac2 = ac2 << #-2;
			ac1 = ac2 + *ar3;
			ac0 = #GAEC_VAD_NSE_MAX;
			ac1 = min(ac0, ac1);
			ac0 = #GAEC_VAD_NSE_MIN;
			ac1 = max(ac0, ac1);
			*ar3 = ac1;
			goto L02;
L01
; if VadCrit >= 0, active
			ac0 = ac0 - #GAEC_VAD_NSE_MAX;
			if (ac0 >= #0) goto L02;
			*ar3 = *ar3 + #1;
			if (tc2) execute (D_unit)
				|| *ar3 = *ar3 + #9;
			goto L02
L03				
		ac0 = *ar4
		ac0 = ac0 - #GAEC_VAD_CRIT_THR;
		ac1 = #GAEC_CRIT_MIN
		ac0 = max(ac1, ac0)
		*ar4 = ac0;
L02
	xar6 = popboth();
	xar5 = popboth();
	return;			
			
;-------------------------------------------------------------------------
	.global			_gaec_dtd_vad_err_sb
;-------------------------------------------------------------------------
_gaec_dtd_vad_err_sb
; GAEC_tDb *pDb		= ar0
; GAEC_tSc *pSc		= ar1
;
; ar2 -> pSc->sErrEn;
; ar3 -> pDb->sNse;
; ar4 -> pDb->sVadCrit;
; ar5 = loop cntr
;
	pshboth(xar5);
	pshboth(xar6);
;
; set t0 = sMaxEn;	
	xar2 = mar(*ar1(#(GAEC_tSc.asErrEn)));
	brc0 = #(GAEC_BANDS);
	t0 = #(-32768);
	localrepeat {
		t1 = *ar2+;
		t0 = max(t1, t0);
	}
;
; tc1 = (sMaxEn > _VAD_NSE_MAX	
	t1 = #(GAEC_VAD_NSE_MAX);
	tc1 = t0 < t1;
;
; tc2 = (uAdfMode < 3)
	t0 = *ar0(#(GAEC_tDb.uAdfMode))
	t1 = #3;
	tc2 = t0 < t1; 
;
; init ptrs	
	xar2 = mar(*ar1(#(GAEC_tSc.asErrEn)));
	xar3 = mar(*ar0(#(GAEC_tDb.asVadErrNse)));
	xar4 = mar(*ar0(#(GAEC_tDb.asVadErrCrit)));
	xar5 = #(GAEC_BANDS+1-1);
	xar6 = mar(*ar1(#(GAEC_tSc.asSinEn)));
;
; loop start	
L23	
	ac0 = *ar2;			; ac0 = sErrEn
	ac1 = ac0 - #GAEC_VAD_NSE_MIN;
	if (ac1 <= #0) goto L25
	ac1 = *ar6;
	ac1 = ac1 - #GAEC_VAD_NSE_MIN;
	if (ac1 <= #0) goto L25

		ac2 = ac0 - *ar3; 		ac2 = sDlt
	
		ac1 = ac2 - #GAEC_VAD_CRIT_THR;
		ac3 = *ar4 + ac1;
	
		ac1 = #GAEC_CRIT_MAX;
		ac3 = min (ac1, ac3);
		ac1 = #GAEC_CRIT_MIN;
		ac3 = max (ac1, ac3);
		*ar4 = ac3;
;	
; adjust nse		
		if (ac3 >= #0) goto L21
;	
; if VadCrit < 0 : inactive
			ac2 = ac2 << #-3;
			if (!tc2) execute (D_unit)
				|| ac2 = ac2 << #-2;
			ac1 = ac2 + *ar3;
			ac0 = #GAEC_VAD_NSE_MAX;
			ac1 = min(ac0, ac1);
			ac0 = #GAEC_VAD_NSE_MIN;
			ac1 = max(ac0, ac1);
			*ar3 = ac1;
			goto L24
L21
; if VadCrit >= 0, active
			if (!tc1) goto L24;
			ac0 = ac0 - #GAEC_VAD_NSE_MAX;
			if (ac0 >= #0) goto L24;
				ac3 = *ar3;
				ac3 = ac3 + #1;
				if (tc2) execute (D_unit)
					ac3 = ac3 + #9;
				*ar3 = ac3;
				goto L24
L25
		ac0 = *ar4;
		ac0 = ac0 - #GAEC_VAD_CRIT_THR;
		ac1 = #GAEC_CRIT_MIN
		ac0 = max(ac1, ac0);
		*ar4 = ac0;
L24
		mar(*ar2+) 
		mar(*ar3+) 
		mar(*ar4+) 
		mar(*ar6+) 
	if(*ar5- != #0) goto L23
;
; loop ends here	
	xar6 = popboth();
	xar5 = popboth();
	return;			

;-------------------------------------------------------------------------
	.global			_gaec_dtd_erle
;-------------------------------------------------------------------------
_gaec_dtd_erle
; GAEC_tDb *pDb		= ar0
; GAEC_tSc *pSc		= ar1
;
	xar2 = mar(*ar1(#(GAEC_tSc.asErle)));
	xar3 = mar(*ar1(#(GAEC_tSc.asSinEn)));
	xar4 = mar(*ar1(#(GAEC_tSc.asErrEn)));	
	ac2 = #0;
	brc0 = #(GAEC_BANDS+1-1);	
	localrepeat {
		ac0 = (*ar3+ << #16) - (*ar4+ << #16);
		ac0 = max(ac2, ac0);
		*ar2+ = HI(ac0);
	}
	return

			
;-------------------------------------------------------------------------
	.global			_gaec_dtd_criteria
;-------------------------------------------------------------------------
_gaec_dtd_criteria
; GAEC_tDb *pDb		= ar0
; GAEC_tSc *pSc		= ar1
;
	ac0  = *ar0(#(GAEC_tDb.sExpectedErrEn));
;
; account for noise floor	
	ac1 = ac0 - *ar0(#(GAEC_tDb.sVadErrNse)); ac1 = sDlt;
	ac2 = ac1 - #_DTD_NSE_THR;
	if (ac2 < #0) execute(D_unit)
		|| ac0 = ac0 - (ac2 << #-1);
	ac2 = ac1 + #_DTD_NSE_THR;
	if (ac2 < #0) execute(D_unit)
		|| ac0 = ac0 - (ac2 << #-1);
;		
; let's set ac0 = sErleLoss		
	ac0 = *ar1(#(GAEC_tSc.sErrEn)) - ac0;
	ac0 = ac0 - (*ar0(#(GAEC_tDb.Cfg.sDtThr)) << #0);
;
; limit sErleLoss	
	ac1 = #(GAEC_CRIT_MIN>>3);
	ac0 = max(ac1, ac0);
;	
; erl crit	
	ac1 = ac0 - (*ar0(#(GAEC_tDb.Cfg.sDtThr)) << #0)
	ac1 = ac1 + *ar0(#(GAEC_tDb.sErlCrit))
	ac2 = #GAEC_CRIT_MAX;
	ac1 = min (ac2, ac1);
	ac2 = #GAEC_CRIT_MIN;
	ac1 = max (ac2, ac1);
	*ar0(#(GAEC_tDb.sErlCrit)) = ac1;
;	
	ac1 = #(_DTD_CRIT_THR*2);
	ac0 = min(ac1, ac0);
;
; form sDtCrit, limit and save it	
	ac0 = ac0 + *ar0(#(GAEC_tDb.sDtCrit));
	ac1 = #GAEC_CRIT_MAX;
	ac0 = min (ac1, ac0);
	ac1 = #GAEC_CRIT_MIN;
	ac0 = max (ac1, ac0);
	*ar0(#(GAEC_tDb.sDtCrit)) = ac0;
	
	return;

;-------------------------------------------------------------------------
	.global			_gaec_dtd_criteria_sb
;-------------------------------------------------------------------------
_gaec_dtd_criteria_sb
; GAEC_tDb *pDb		= ar0
; GAEC_tSc *pSc		= ar1
;
	pshboth(xar5);
	pshboth(xar6);
	
	xar2 = mar(*ar0(#(GAEC_tDb.asExpectedErrEn)));
	t0 = *ar2+;
	brc0 = #(GAEC_BANDS-1)
	localrepeat {
		t1 = *ar2+
		t0 = max(t1, t0)
	}
	
	xar2 = mar(*ar0(#(GAEC_tDb.asExpectedErrEn)));
	xar3 = mar(*ar0(#(GAEC_tDb.asVadErrNse)));
	xar4 = mar(*ar1(#(GAEC_tSc.asErrEn)));
	xar5 = mar(*ar0(#(GAEC_tDb.asDtCrit)));
	xar6 = mar(*ar0(#(GAEC_tDb.asErlCrit)));
	
	t1 = #0		; t1 = band cntr
L31	
		ac0 = *ar2+;
		ac1 = -ac0;
		ac1 = ac1 + t0;
		ac0 = ac0 + (ac1 << #-2);
		ac1 = t0 - *ar1(#(GAEC_tSc.sErleMax))
		ac0 = max(ac1, ac0)
; band 0, 1 		
		if (t1 == #0) execute (D_unit)
			|| ac0 = ac0 + #(GAEC_1DB*4)
		ac1 = t1 - #1;
		if (ac1 == #0) execute (D_unit)
			|| ac0 = ac0 + #(GAEC_1DB*2)
; ac1 = dlt		
		ac1 = ac0 - *ar3+;
; nse adjust	
		ac2 = ac1 - #_DTD_NSE_THR;
		if (ac2 < #0) execute (D_unit)
			|| ac0 = ac0 - (ac2 << #-1);
		ac2 = ac1 + #_DTD_NSE_THR;
		if (ac2 < #0) execute (D_unit)
			|| ac0 = ac0 - (ac2 << #-1);
; erle loss		
		ac1 = *ar4+ - ac0;
		ac1 = ac1 - *ar0(#(GAEC_tDb.Cfg.sDtThr))
		ac3 = #(GAEC_CRIT_MIN>>2);
		ac1 = max(ac3, ac1);
;		
; sErlCrit		
		ac2 = ac1 - (*ar0(#(GAEC_tDb.Cfg.sDtThr)) << #0)
		ac2 = ac2 + *ar6
		ac3 = #(GAEC_CRIT_MAX);
		ac2 = min(ac3, ac2);
		ac3 = #(GAEC_CRIT_MIN);
		ac2 = max(ac3, ac2);
		*ar6+ = ac2;
; limit erle loss from above		
		ac3 = #(2*_DTD_CRIT_THR);
		ac1 = min(ac3, ac1);
; dt crit		
		ac1 = *ar5 + ac1;
		ac3 = #(GAEC_CRIT_MAX);
		ac1 = min(ac3, ac1);
		ac3 = #(GAEC_CRIT_MIN);
		ac1 = max(ac3, ac1);
		*ar5+ = ac1;
		
		t1 = t1 + #1
	compare (t1 < #(GAEC_BANDS+1)) goto L31

	xar6 = popboth()
	xar5 = popboth()
	return;

;-------------------------------------------------------------------------
	.global			_gaec_dtd_dec_criteria
;-------------------------------------------------------------------------
_gaec_dtd_dec_criteria
; GAEC_tDb *pDb		= ar0
; GAEC_tSc *pSc		= ar1
;
	xar2 = mar(*ar0(#(GAEC_tDb.asDtCrit)));
	ac1 = #GAEC_CRIT_MIN;
	brc0 = #GAEC_BANDS;
	localrepeat {
		ac0 = *ar2;
		ac0 = ac0 - #(_DTD_CRIT_THR/3);
		ac0 = max(ac1, ac0);
		*ar2+ = ac0;
	}
	
	ac0 = *ar0(#(GAEC_tDb.sDtCrit));
	ac0 = ac0 - #(_DTD_CRIT_THR/3);
	ac0 = max(ac1, ac0);
	*ar0(#(GAEC_tDb.sDtCrit)) = ac0;
	
	return;
	
;-------------------------------------------------------------------------
	.global			_gaec_dtd_avrg_erle_sb
;-------------------------------------------------------------------------
_gaec_dtd_avrg_erle_sb
; GAEC_tDb *pDb		= ar0
; GAEC_tSc *pSc		= ar1
;
	pshboth(xar6)
	pshboth(xar5);
	
	ac0 = #1024;
	ac1 = *ar0(#(GAEC_tDb.uAdfMode));
	ac2 = ac1 - #2;
	if (ac2 > #0) execute (D_unit)
		|| ac0 = ac0 << #-1;
	ac2 = ac1 - #3;
	if (ac2 > #0) execute (D_unit)
		|| ac0 = ac0 << #-1;
	t0 = ac0;
	
	xar6 = mar(*ar1(#(GAEC_tSc.u.asTmp)));
;	
; set coeff as if all bands are ok	
	ac1 = #(4096 - GAEC_BANDS*300) << #16
	brc0 = #(GAEC_BANDS+1-1)
	localrepeat {
		ac0 = ac1 * t0;
		*ar6+ = HI(rnd(ac0 << 4))
		ac1 = ac1 + (#300 << #16);
	}
	.if 1
;	
; first, check if we do any averaging in a given band;	
	xar2 = mar(*ar1(#(GAEC_tSc.asSinEn)));
	xar3 = mar(*ar0(#(GAEC_tDb.asErleAv)));
	xar4 = mar(*ar0(#(GAEC_tDb.asVadErrNse)));
	xar6 = mar(*ar1(#(GAEC_tSc.u.asTmp)));
	brc0 = #(GAEC_BANDS+1-1)
	localrepeat {
		ac0 = (*ar2+ << #16) - (*ar3+ << #16);
		ac0 = ac0 - (*ar4+ << #16)
		if (ac0 <= #0) execute (D_unit)
			|| *ar6+ = #0
	}
	xar2 = mar(*ar1(#(GAEC_tSc.asRoutEn)));
	xar3 = mar(*ar0(#(GAEC_tDb.asErleAv)));
	xar4 = mar(*ar0(#(GAEC_tDb.asErlAv)));
	xar5 = mar(*ar0(#(GAEC_tDb.asVadErrNse)));
	xar6 = mar(*ar1(#(GAEC_tSc.u.asTmp)));
	brc0 = #(GAEC_BANDS+1-1)
	localrepeat {
		ac0 = (*ar2+ << #16) - (*ar3+ << #16);
		ac0 = ac0 - (*ar4+ << #16)
		ac0 = ac0 - (*ar5+ << #16)
		if (ac0 <= #0) execute (D_unit)
			|| *ar6+ = #0
	}
	xar5 = mar(*ar0(#(GAEC_tDb.asDtCrit)));
	xar6 = mar(*ar1(#(GAEC_tSc.u.asTmp)));
	brc0 = #(GAEC_BANDS+1-1)
	localrepeat {
		ac0 = *ar5+
		if (ac0 >= #0) execute (D_unit)
			|| *ar6+ = #0
	}
;
; now let's do actual work.
;
; process erle
	xar2 = mar(*ar0(#(GAEC_tDb.asErleAv)));
	xar3 = mar(*ar1(#(GAEC_tSc.asErle)));
	xar6 = mar(*ar1(#(GAEC_tSc.u.asTmp)));
	ac3 = #(GAEC_1DB*6) << #16;
	ac2 = #0;
	brc0 = #(GAEC_BANDS+1-1);
	localrepeat {
		ac0 = *ar2 << #16
		ac1 = ac0 - (*ar3+ << #16)
		ac1 = min(ac3, ac1)
		ac1 = ac1 * *ar6+
		ac1 = ac1 << #1
		ac1 = rnd(ac1)
		ac0 = ac0 - ac1;
		ac0 = max(ac2, ac0)
		*ar2+ = HI(ac0);
	}
;	
; process erl		
	xar4 = mar(*ar0(#(GAEC_tDb.asErlAv)));
	xar5 = mar(*ar1(#(GAEC_tSc.asErl)));
	xar6 = mar(*ar1(#(GAEC_tSc.u.asTmp)));
	ac2 = *ar0(#(GAEC_tDb.Cfg.sErlMin)) << #15
	brc0 = #(GAEC_BANDS+1-1);
	localrepeat {
		ac1 = (*ar5+ << #16) - (*ar4 << #16);
		ac0 = *ar4 << #15
		ac0 = ac0 + (ac1 * *ar6+);
		ac0 = max (ac2, ac0);
		*ar4+ = HI(rnd(ac0 << #1));
	}
	.endif
	xar5 = popboth()
	xar6 = popboth()
	return;

⌨️ 快捷键说明

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