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

📄 gaectxa.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 ".ftext1"

;-------------------------------------------------------------------------
	.global _GAEC_aasFBS
	.global _GAEC_aasFBR
	.global _GAEC_aasFBX
	.global _gaec_utl_exp
	
;-------------------------------------------------------------------------
	.global	_gaec_tx_analysis
;-------------------------------------------------------------------------
_gaec_tx_analysis
; GAEC_tDb *pDb		= ar0,
; GAEC_tSc *pSc		= ar1
; S16 *psTx			= ar2
;
    .arms_off
	bit(ST2, #ST2_ARMS) = #0;
	bit(ST1, #ST1_FRCT) = #1;
	
	pshboth(xar6)
	pshboth(xar5)
	
	xar4 = mar(*ar0(#(GAEC_tDb.asTbuf+GAEC_FR_SZ)))
	xar3 = mar(*ar0(#(GAEC_tDb.asTbuf)))
	repeat (#(GAEC_TBUF_SZ-GAEC_FR_SZ-1))
		*ar3+ = *ar4+
	
	repeat (#(GAEC_FR_SZ-1))
		*ar3+ = *ar2+;
	
	xar3 = mar(*ar0(#(GAEC_tDb.aasT)))
	xar4 = mar(*ar0(#(GAEC_tDb.aasT+GAEC_BLKS)))
	brc0 = #(GAEC_BANDS*2-1)
	t0 = #(GAEC_BLKS+1)
	localrepeat {
		repeat (#(GAEC_ERR_SZ-GAEC_BLKS-2))
			*ar3+ = *ar4+
		*(ar3+t0) = *(ar4+t0)
	}
	
	xar2 = mar(*ar0(#(GAEC_tDb.asTbuf)))
	xcdp = mar(*ar1(#(GAEC_tSc.u.asTmp)))
	t1 = #(GAEC_ERR_SZ);
	t0 = #(1-GAEC_FBS_SZ/2);
	xar5 = mar(*ar0(#(GAEC_tDb.aasT + GAEC_ERR_SZ-GAEC_BLKS)))
	
	xar6 = #(GAEC_BLKS-1);
L01
		brc0 = #(GAEC_FBS_SZ/2-2);
		xar3 = mar(*ar2(#(GAEC_FBS_SZ-1)))
		xar4 = mar(*ar1(#(GAEC_tSc.u.asTmp)))
		localrepeat {
			ac0 = (*ar2+ <<#16) + (*ar3- <<#16);
			*ar4+ = HI(ac0);
		}
		ac0 = (*(ar2+t0) <<#16) + (*ar3- <<#16);
		*ar4+ = HI(ac0);
		
		brc0 = #(GAEC_BANDS/2-1);
		xar3 = #_GAEC_aasFBS;
		xar4 = #(_GAEC_aasFBS + GAEC_FBS_SZ/2);
		localrepeat {
			ac0 = *ar3+ * coef(*cdp+),
			ac1 = *ar4+ * coef(*cdp+);
			|| repeat (#(GAEC_FBS_SZ/2-3))
				ac0 = ac0 + (*ar3+ * coef(*cdp+)),
				ac1 = ac1 + (*ar4+ * coef(*cdp+));
			ac0 = rnd(ac0 + (*ar3+ * coef(*(cdp+t0)))),
			ac1 = rnd(ac1 + (*ar4+ * coef(*(cdp+t0))));
			*(ar5 + t1) = HI(ac0);
			|| mar (ar3 + #(GAEC_FBS_SZ/2))
			*(ar5 + t1) = HI(ac1);
			|| mar (ar4 + #(GAEC_FBS_SZ/2))
		}
		
		brc0 = #(GAEC_FBS_SZ/2-2);
		xar3 = mar(*ar2(#(GAEC_FBS_SZ-1)))
		xar4 = mar(*ar1(#(GAEC_tSc.u.asTmp)))
		localrepeat {
			ac0 = (*ar2+ <<#16) - (*ar3- <<#16);
			*ar4+ = HI(ac0);
		}
		ac0 = (*(ar2+t0) <<#16) - (*ar3- <<#16);
		*ar4+ = HI(ac0);
		brc0 = #(GAEC_BANDS/2-1);
		xar3 = #(_GAEC_aasFBS + (GAEC_FBS_SZ/2)*(GAEC_BANDS+0));
		xar4 = #(_GAEC_aasFBS + (GAEC_FBS_SZ/2)*(GAEC_BANDS+1));
		localrepeat {
			ac0 = *ar3+ * coef(*cdp+),
			ac1 = *ar4+ * coef(*cdp+);
			|| repeat (#(GAEC_FBS_SZ/2-3))
				ac0 = ac0 + (*ar3+ * coef(*cdp+)),
				ac1 = ac1 + (*ar4+ * coef(*cdp+));
			ac0 = rnd(ac0 + (*ar3+ * coef(*(cdp+t0)))),
			ac1 = rnd(ac1 + (*ar4+ * coef(*(cdp+t0))));
			*(ar5 + t1) = HI(ac0);
			|| mar (ar3 + #(GAEC_FBS_SZ/2))
			*(ar5 + t1) = HI(ac1);
			|| mar (ar4 + #(GAEC_FBS_SZ/2))
		}
		
		mar (ar5 - #(GAEC_ERR_SZ*(2*GAEC_BANDS)-1));
		mar (ar2 + #GAEC_BLK_SZ);
		
	if (*ar6- != #0) goto L01
    .arms_on
	bit(ST2, #ST2_ARMS) = #1;
	bit(ST1, #ST1_FRCT) = #0;
	xar5 = popboth();
	xar6 = popboth();
	return;			
;-------------------------------------------------------------------------
	.global			_gaec_tx_vad_fb
;-------------------------------------------------------------------------
_gaec_tx_vad_fb
; GAEC_tDb *pDb		= ar0
; GAEC_tSc *pSc		= ar1
;
;
; init ptrs	
	xar2 = mar(*ar1(#(GAEC_tSc.sRinEn)));
	xar3 = mar(*ar0(#(GAEC_tDb.sVadRinNse)));
	xar4 = mar(*ar0(#(GAEC_tDb.sVadRinCrit)));
	
; tc2 = uAdfMode < 3
	t0 = *ar0(#(GAEC_tDb.uAdfMode))
	t1 = #3;
	tc2 = t0 < t1; 
	
	ac0 = *ar2;				; ac0 = sVadTxEn
	ac1 = ac0 - #GAEC_VAD_NSE_MIN;
	if (ac1 <= #0) goto L42
		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 L41
;	
; 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 L44			; end cicle
L41
			ac0 = ac0 - #GAEC_VAD_NSE_MAX;
			if (ac0 >= #0) goto L44;
				ac3 = *ar3;
				ac3 = ac3 + #1;
				if (tc2) execute (D_unit)
					ac3 = ac3 + #9;
				*ar3 = ac3;
				goto L44
L42
		ac0 = *ar4
		ac0 = ac0 - #GAEC_VAD_CRIT_THR;
		ac1 = #GAEC_CRIT_MIN
		ac0 = max(ac1, ac0)
		*ar4 = ac0;
L44
	return;			
;-------------------------------------------------------------------------
	.global			_gaec_tx_vad
;-------------------------------------------------------------------------
_gaec_tx_vad
; GAEC_tDb *pDb		= ar0
; GAEC_tSc *pSc		= ar1
;
; ar2 -> pSc->sVadTxEn;
; ar3 -> pDb->sVadTxNse;
; ar4 -> pDb->sVadTxCrit;
; ar5 = loop cntr
;
	pshboth(xar5);
;
; set t0 = sMaxEn;	
	xar2 = mar(*ar1(#(GAEC_tSc.asRinEn)));
	brc0 = #(GAEC_BANDS+1-1);
	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.asRinEn)));
	xar3 = mar(*ar0(#(GAEC_tDb.asVadRinNse)));
	xar4 = mar(*ar0(#(GAEC_tDb.asVadRinCrit)));
	xar5 = #(GAEC_BANDS+1-1);
;
; loop start	
L23	
	ac0 = *ar2;				; ac0 = sVadTxEn
	ac1 = ac0 - #GAEC_VAD_NSE_MIN;
	if (ac1 <= #0) goto L22
		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			; end cicle
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
L22
			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+)
	if(*ar5- != #0) goto L23
	xar5 = popboth();
	return;			
	
;-------------------------------------------------------------------------
	.global	_gaec_tx_att
;-------------------------------------------------------------------------
_gaec_tx_att
; GAEC_tDb *pDb		= ar0,
; GAEC_tSc *pSc		= ar1
;
	xar2 = mar(*ar1(#(GAEC_tSc.asAttRin)))
	xar3 = mar(*ar1(#(GAEC_tSc.u.asTmp)))
	xar4 = #(GAEC_BANDS+1-1)
L11
		t0 = *ar2+;
		t0 = -t0;
		call _gaec_utl_exp
		*ar3+ = t0;
	if (*ar4- != 0) goto L11	
	xar2 = mar(*ar1(#(GAEC_tSc.u.asTmp+1)))
	repeat (#(GAEC_BANDS-1-1))
		*ar3+ = *ar2+
	xar2 = mar(*ar1(#(GAEC_tSc.u.asTmp)))
	xar3 = mar(*ar1(#(GAEC_tSc.aasErr0)))
	xar4 = mar(*ar0(#(GAEC_tDb.aasT)))
	brc0 = #(GAEC_BANDS*2-1);
	brc1 = #(GAEC_ERR_SZ-1)
	localrepeat {
		t0 = *ar2+;
		|| localrepeat {
			ac0 = t0 * *ar4+
			*ar3+ = HI(rnd(ac0 << #4));
		}
	}
	return

_MULT           		.set (31821)
_INC            		.set (13849)
;-------------------------------------------------------------------------
	.global	_gaec_tx_nse
;-------------------------------------------------------------------------
_gaec_tx_nse
; GAEC_tDb *pDb		= ar0	
; GAEC_tSc *pSc		= ar1	
		
	xar2 = mar(*ar0(#(GAEC_tDb.asVadRinNse)));
	xar3 = mar(*ar1(#(GAEC_tSc.u.asTmp)));
	xar4 = #(GAEC_BANDS+1-1)
L31	
		t1 = *ar2+
		t0 = *ar3;
		t0 = t0 - #(GAEC_1DB*6);
		t1 = min(t0, t1);
		t0 = *ar3
		t0 = t0 + *ar0(#(GAEC_tDb.Cfg.sWhiteThr))
		t0 = max(t1, t0)
		t0 = t0 + #(GAEC_1DB*13)
		call _gaec_utl_exp
		*ar3+ = t0;
	if (*ar4- != #0) goto L31
;
; add up to bands*2	
	xar2 = mar(*ar1(#(GAEC_tSc.u.asTmp+1)));
	repeat (#(GAEC_BANDS-1-1))
		*ar3+ = *ar2+

	brc0 = #(2*GAEC_BANDS-1)
	brc1 = #(GAEC_ERR_SZ-1)
	xar2 = mar(*ar1(#(GAEC_tSc.aasErr0)));
	xar3 = mar(*ar1(#(GAEC_tSc.u.asTmp)));
	ac2 = #_MULT << #16;			; ac2 = MULT
	ac3 = #_INC;					; ac3 = INC
	t1 = *ar0(#(GAEC_tDb.sNseSav));	; t1 = Seed
	
	localrepeat {
		ac1 = *ar3+ << #16;			; ac1H = sLevel
		ac0 = ac3;
		|| localrepeat {
			ac0 = ac0 + (ac2 * t1);
			t1 = ac0;
			|| ac0 = *ar2 << #15;
			ac0 = ac0 + (ac1 * t1);
			*ar2+ = HI(saturate(rnd(ac0 << #1)));
			|| ac0 = ac3;
		}							; 9*4*20*200 = 0.15 MIPS
	}
	*ar0(#(GAEC_tDb.sNseSav)) = t1;	; save Seed
	.if 0
	.endif	
	return;
	

⌨️ 快捷键说明

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