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

📄 gaeca4a.s55

📁 TI公司DSP/tms320c55x/tms320c54x系列的声学回声消除代码
💻 S55
📖 第 1 页 / 共 2 页
字号:
*-------------------------------------------------------------------------*
*                                                                         *
*   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"
_ADJ            		.set (4)
_ADJSS          		.set (_ADJ+2)
_DEXP           		.set (29491);(Q15(0.9))

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

;-------------------------------------------------------------------------
	.global 	_gaec_get_energy4
;-------------------------------------------------------------------------
_gaec_get_energy4
; GAEC_tDb *pDb = ar0
;
    .arms_off
	bit(ST2, #ST2_ARMS) = #0;
	
	xar2 = dbl(*ar0(#(GAEC_tDb.psRcv)))
;	mar (ar2 + #(GAEC_ADF_BSZ-GAEC_OFF4))
	mar (*+ar2(#(GAEC_ADF_BSZ-GAEC_OFF4)))
	xar3 = mar(*ar2(#((GAEC_BANDS+1)* GAEC_RCV_SZ)))
	xar4 = mar(*ar0(#(GAEC_tDb.aslEn4)));
	t1 = #(GAEC_RCV_SZ-GAEC_BLKS);
;	
; band 0	
	brc0 = #(GAEC_BLKS-1);
	ac0 = dbl(*ar4);
	|| localrepeat {
		ac0 = ac0 - (ac0 << #-6);
		ac1 = *ar2+ * *ar2+;
		ac1 = ac1 + (ac1 << #-2)
		ac1 = ac1 + (ac1 << #-3)
		ac0 = ac0 + (ac1 << #(-_ADJ));
	}
	dbl(*ar4+) = ac0;
	|| mar (ar2 + t1)
;
; complex bands
	brc0 = #(GAEC_BANDS-2);
	brc1 = #(GAEC_BLKS-1);
	localrepeat {
		ac0 = dbl(*ar4);
		localrepeat {
			ac0 = ac0 - (ac0 << #-6);
			ac1 = *ar2+ * *ar2+;
			ac1 = ac1 + (*ar3+ * *ar3+);
			ac1 = ac1 + (ac1 << #-2)
			ac1 = ac1 + (ac1 << #-3)
			ac0 = ac0 + (ac1 << #(-_ADJ));
		}
		dbl(*ar4+) = ac0;
		mar(*(ar2+t1)), mar(*(ar3+t1)), mar(coef(*cdp));
	}	
; last band	
	brc0 = #(GAEC_BLKS-1);
	ac0 = dbl(*ar4);
	|| localrepeat {
		ac0 = ac0 - (ac0 << #-6);
		ac1 = *ar2+ * *ar2+;
		ac1 = ac1 + (ac1 << #-2)
		ac1 = ac1 + (ac1 << #-3)
		ac0 = ac0 + (ac1 << #(-_ADJ));
	}
	dbl(*ar4+) = ac0;
	
    .arms_on
	bit(ST2, #ST2_ARMS) = #1;
	return	

;-------------------------------------------------------------------------
	.global 	_gaec_adapt_dc4p
;-------------------------------------------------------------------------
; band 0
_gaec_adapt_dc4p
; GAEC_tDb *pDb = ar0
; GAEC_tSc *pSc = ar1
; S16 band		= t0
;
    .arms_off
	bit(ST2, #ST2_ARMS) = #0;
	pshboth(xar5);
	pshboth(xar6);
	pshboth(xar7);
;	
; set pointers
	xar2 = mar(*ar1(#(GAEC_tSc.asSSC)))
	xar3 = mar(*ar0(#(GAEC_tDb.aslEn4)))
	xar4 = mar(*ar0(#(GAEC_tDb.aslAdEn)))
	xar5 = mar(*ar1(#(GAEC_tSc.aasErr)))
	xar6 = mar(*ar1(#(GAEC_tSc.u.aA4)))
	xar7 = mar(*ar0(#(GAEC_tDb.asShft)))
;	
; adjust ptrs if band == BANDS	
	if (t0 != #0) execute(AD_unit) ||
		mar (ar2+#GAEC_BANDS)
	if (t0 != #0) execute(AD_unit) ||
		mar (ar3+#(GAEC_BANDS*2))
	if (t0 != #0) execute(AD_unit) ||
		mar (ar4+#(GAEC_BANDS*2))
	if (t0 != #0) execute(AD_unit) ||
		mar (ar5+#(GAEC_BANDS*GAEC_BLKS))
	if (t0 != #0) execute(AD_unit) ||
		mar (ar7+#(GAEC_BANDS))
	
	ac3 = *ar2;
	if (ac3 == #0) goto L03;
		ac3 = #_ADJSS
		ac3 = ac3 + *ar7
		call _gaec_adapt_pre
		t0 = t0 + #1;
		mar (*+ar6(#(GAEC_tScA4.asErr)))
		brc0 = #(GAEC_BLKS-1)
		localrepeat {
			ac1 = *ar5+ * ac0
			*ar6+ = HI(saturate(rnd(ac1 << t0)))
		}
L03
	xar7 = popboth();
	xar6 = popboth();
	xar5 = popboth();
    .arms_on
	bit(ST2, #ST2_ARMS) = #1;
	return		
;-------------------------------------------------------------------------
	.global 	_gaec_adapt_dc4d
;-------------------------------------------------------------------------
_gaec_adapt_dc4d
; GAEC_tDb *pDb = ar0
; GAEC_tSc *pSc = ar1
; S16 band		= t0
;
	push(t2, t3)
    .arms_off
	bit(ST2, #ST2_ARMS) = #0;
; set up ptrs
	xar2 = dbl(*ar0(#(GAEC_tDb.psAdf)))	
	mar(ar2 + #(GAEC_OFF4*2))
	if (t0 != #0) execute (AD_unit) ||
		mar(*ar2+)
	xar3 = dbl(*ar0(#(GAEC_tDb.psRcv)));
;	mar(ar3 + #(GAEC_ADF_BSZ - GAEC_OFF4));
	mar(*+ar3(#(GAEC_ADF_BSZ - GAEC_OFF4)));
	if (t0 != #0) execute(AD_unit) ||
		ar3 = ar3 + #(GAEC_RCV_SZ*GAEC_BANDS)
	xar4 = mar(*ar1(#(GAEC_tSc.u.aA4)));
;	
; set up shifts	
	t0 = #2;		; t0 = moving between Adf
	t1 = #(1-GAEC_BLKS);
	t2 = *ar4+		; t2 = adf loading shift
	t3 = t2- #16;
	t3 = -t3;		; t3 = adf storing shift
;
; setup repeat counters	
	brc0 = #(GAEC_SECTIONS4-1);
	brc1 = #(GAEC_SECTION_SZ-1);
	ac2 = #_DEXP << #16;
;
; the loop
	localrepeat {
		localrepeat {
			ac0 = *ar2 << t2;
			.loop GAEC_BLKS-1
			ac0 = ac0 + (*ar3+     * *ar4+);
			.endloop
			ac0 = ac0 + (*(ar3+t1) * *(ar4+t1));
			*(ar2+t0) = HI(saturate(rnd(ac0 << t3)));
			|| mar (*ar3-)
		}
		.loop GAEC_BLKS-1
			ac0 = *ar4 * ac2;
			*ar4+ = HI(rnd(ac0 << #1));
		.endloop
		ac0 = *ar4 * ac2;
		*(ar4+t1) = HI(rnd(ac0 << #1));
;		nop; let it stored before next read
	}
    .arms_on
	bit(ST2, #ST2_ARMS) = #1;
	t2, t3 = pop();
	return;	

;-------------------------------------------------------------------------
	.global 	_gaec_adapt_ac4p
;-------------------------------------------------------------------------
_gaec_adapt_ac4p
; GAEC_tDb *pDb = ar0
; GAEC_tSc *pSc = ar1
;
    .arms_off
	bit(ST2, #ST2_ARMS) = #0;
	pshboth(xar5);
	pshboth(xar6);
	pshboth(xar7);
	
	
; let's preset pointers
	xar2 = mar(*ar1(#(GAEC_tSc.asSSC+1)))
	xar3 = mar(*ar0(#(GAEC_tDb.aslEn4+2)))
	xar4 = mar(*ar0(#(GAEC_tDb.aslAdEn+2)))
	xar5 = mar(*ar1(#(GAEC_tSc.aasErr+GAEC_BLKS)))
	xar6 = mar(*ar1(#(GAEC_tSc.u.aA4))) 
	xar7 = mar(*ar0(#(GAEC_tDb.asShft+1))) 
	
	ac2 = #GAEC_ADEN_BASE << #GAEC_ADEN_SHFT;
	t1 = #(GAEC_BLKS*GAEC_BANDS);

	brc0 = #(GAEC_BANDS-2);
	brc1 = #(GAEC_BLKS-1)
	
	blockrepeat {
		ac3 = *ar2;

		if (ac3 == #0) goto L23;
			ac3 = #_ADJSS
			ac3 = ac3 + *ar7
			call _gaec_adapt_pre
			t0 = t0 + #1;
			mar(*+ar6(#(GAEC_tScA4.asErr)));		
			localrepeat {
				ac1 = *ar5 * ac0
				*ar6+ = HI(saturate(rnd(ac1 << t0)))
				ac1 = *ar5(#(GAEC_BLKS*GAEC_BANDS)) * ac0;
				*ar6+ = HI(saturate(rnd(ac1 << t0)))
				mar(ar5 + #1)
			}
			*ar6+ = #(_DEXP);
			mar(ar6 - #GAEC_tScA4_Sz);	
			mar(ar5 - #GAEC_BLKS);	
; if step size if == 0; just advance pointers
L23
		mar(ar2 + #1)
		mar(ar3 + #2);
		mar(ar4 + #2);
		mar(ar6 + #GAEC_tScA4_Sz);	
		mar(ar5 + #GAEC_BLKS);
		mar(ar7 + #1)
	}		
	
	xar7 = popboth();
	xar6 = popboth();
	xar5 = popboth();
    .arms_on
	bit(ST2, #ST2_ARMS) = #1;
	return;	
	
;-------------------------------------------------------------------------
	.global 	_gaec_adapt_ac4d
;-------------------------------------------------------------------------
_gaec_adapt_ac4d
; GAEC_tDb *pDb = ar0
; GAEC_tSc *pSc = ar1
    .arms_off
	bit(ST2, #ST2_ARMS) = #0;
	pshboth(xar5);
	pshboth(xar6);
	push(t2, t3);
;
;	
; setup ptrs initially
;
; ar2 = band counter
; ar3 -> Adf
; ar4 -> RcvI
; ar5 -> RcvQ
; ar6 -> Tmp (precalculated& stored vars)
;
	xar2 = #(GAEC_BANDS-2);
	xar3 = dbl(*ar0(#(GAEC_tDb.psAdf)));
	mar(*+ar3(#(GAEC_ADF_SZ*2 + GAEC_OFF4*2)))	
	xar4 = dbl(*ar0(#(GAEC_tDb.psRcv)));			
	mar (*+ar4(#(GAEC_RCV_SZ + GAEC_ADF_BSZ - GAEC_OFF4)));
	xar5 = mar(*ar4(#(GAEC_RCV_SZ*GAEC_BANDS)))
	xar6 = mar(*ar1(#(GAEC_tSc.u.aA4)));
	
L33
		ac2 = *ar6(#(GAEC_tScA4.sDexp)) << #16;
;	
; set up shifts	
		t2 = *ar6+;		; t2 = adf loading shift
		t3 = t2 - #16;
		t3 = -t3;		; t3 = adf storing shift
;
; setup block repeat counters	
		|| brc0 = #(GAEC_SECTIONS4-1);
		brc1 = #(GAEC_SECTION_SZ-1);
		xcdp = mar (*ar6);
		t0 = #(-GAEC_BLKS*2);
		t1 = #(-1-GAEC_BLKS);
;
; the loop
		blockrepeat {
;			.localalign
			localrepeat {
				ac0 = *ar3+ << t2;
				ac1 = *ar3- << t2;
				
				.loop GAEC_BLKS
				ac0 = ac0 + (*ar4  * coef(*cdp+)),
				ac1 = ac1 + (*ar5  * coef(*cdp+));
				
				ac1 = ac1 - (*ar4+ * coef(*cdp+)),
				ac0 = ac0 + (*ar5+ * coef(*cdp+));
				.endloop
				
				*ar3+ = HI(saturate(rnd(ac0 << t3)));
				*ar3+ = HI(saturate(rnd(ac1 << t3)));
				mar(*(ar4+t1)), mar(*(ar5+t1)), mar(coef(*(cdp+t0)));
			}
			.loop (GAEC_BLKS*2)
			ac0 = *ar6 * ac2;
			*ar6+ = HI(rnd(ac0 << #1));
			.endloop
			mar(*(ar6 + t0));
		}
		; advance to the next band
;		mar (ar3 + #(GAEC_ADF_SZ*2 - GAEC_SECTIONS4*GAEC_SECTION_SZ*2)) ; psAdf
		mar (*+ar3(#(GAEC_ADF_SZ*2 - GAEC_SECTIONS4*GAEC_SECTION_SZ*2))) ; psAdf
;		mar (ar4 + #(GAEC_RCV_SZ + GAEC_SECTIONS4*GAEC_SECTION_SZ)); psRcvI
		mar (*+ar4(#(GAEC_RCV_SZ + GAEC_SECTIONS4*GAEC_SECTION_SZ))); psRcvI
;		mar (ar5 + #(GAEC_RCV_SZ + GAEC_SECTIONS4*GAEC_SECTION_SZ)); psRcvI
		mar (*+ar5(#(GAEC_RCV_SZ + GAEC_SECTIONS4*GAEC_SECTION_SZ))); psRcvI
;		mar (ar6 + #(GAEC_tScA4_Sz));
		mar (ar6 + #(GAEC_tScA4_Sz-GAEC_tScA4.asErr));
	if (*ar2- != #0) goto L33
	
	t2, t3 = pop();
	xar6 = popboth();
	xar5 = popboth();
    .arms_on
	bit(ST2, #ST2_ARMS) = #1;
	return;	
	
	.if 0
;-------------------------------------------------------------------------
	.global 	__adapt_dc4A
;-------------------------------------------------------------------------
; band 0
__adapt_dc4A
; GAEC_tDb *pDb = ar0
; GAEC_tSc *pSc = ar1
;
; input parameters are not modified
;
; if band = 0;
    .arms_off
	bit(ST2, #ST2_ARMS) = #0;

⌨️ 快捷键说明

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