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

📄 gaeca4a.s55

📁 TI公司DSP/tms320c55x/tms320c54x系列的声学回声消除代码
💻 S55
📖 第 1 页 / 共 2 页
字号:
	pshboth(xar5);
	pshboth(xar6);
	push(t2);
	push(t3);

	ac3 = *ar1(#(GAEC_tSc.asSSC))
	if (ac3 == #0) goto L03;
	
	ac0 = dbl(*ar0(#(GAEC_tDb.aslEn4)))
	
	ac1 = dbl(*ar0(#(GAEC_tDb.aslAdEn)))
	ac1 = ac1 + (ac0 << #-4);
	ac2 = #GAEC_ADEN_BASE << #GAEC_ADEN_SHFT;
	ac1 = min(ac2, ac1);
	dbl(*ar0(#(GAEC_tDb.aslAdEn))) = ac1;
	ac0 = ac0 + ac1;
	
; invert here, put it into t2
	ac0 = mant(ac0), t2 = -exp(ac0);
	ac1 = ac0 - (#32767 << #16);
	ac0 = #16020 << #16;
	ac0 = ac0 - (ac1 << #-1);
	ac1 = ac1 * ac1;
	ac0 = ac0 + (ac1 << #1);
	
	ac0 = ac0 * *ar1(#(GAEC_tSc.asSSC));
	ac0 = ac0 + (#1 << #11);
	ac0 = ac0 << #4;

	t2 = #30 + t2;

	brc0 = #(GAEC_BLKS-1);
	xar3 = mar(*ar1(#(GAEC_tSc.aasErr)));
	xar2 = mar(*ar1(#(GAEC_tSc.asNormErr)));
	localrepeat {
		ac1 = ac0 * *ar3+;
		*ar2+ = HI(rnd(ac1 << #1));
	}
	mar(ar2 - #(GAEC_BLKS))
;	
; set up ptrs
	xar4 = mar(*ar0(#(GAEC_tDb.asAdf)))	; ar4 = psAdf
	xar5 = dbl(*ar0(#(GAEC_tDb.psRcv)));			; ar5 = psRcv
	mar(ar5 + #(GAEC_ADF_BSZ));
;	
; the merging point for band 0 and band GAEC_BANDS	
L10	
	xar6 = mar(*ar1(#(GAEC_tSc.asTmp)));
;	
; set up shifts	
	t1 = #2;		; t1 = moving between Adf
	t2 = t2 - #11;	; t2 = adf loading shift
	
	ac3 = t2 - #15;
;
; accomodate dynamic range	
	if (ac3 <= #0) goto L01
		t3 = ac3 - #16;
		t3 = -t3;		; t3 = adf storing shift
		brc0 = #(GAEC_BLKS-1);
		localrepeat {
			ac0 = *ar2;
			*ar2+ =  HI(saturate(rnd(ac0 << t3)));
		}
		mar (ar2 - #GAEC_BLKS);
		t2 = #15;
		t3 = #1;
	|| goto L02
L01		
	t3 = t2 - #16;
	t3 = -t3;		; t3 = adf storing shift
	if (t2 > #0) goto L02
		brc0 = #(GAEC_BLKS-1);
		localrepeat {
			ac0 = *ar2;
			*ar2+ =  HI(saturate(rnd(ac0 << t3)));
		}
		mar (ar2 - #GAEC_BLKS);
		t2 = #0;
		t3 = #16;
L02
;
; setup repeat counters	
	brc0 = #(4-1);
	brc1 = #(GAEC_ADF_SZ/4-1);
	*ar6 = #(27852); Q15(0.85) = 27852.8
	t0 = #(1-GAEC_BLKS);
;
; the loop
	localrepeat {
		localrepeat {
			ac0 = *ar4 << t2;
			.loop (GAEC_BLKS-1);
				ac0 = ac0 + (*ar2+ * *ar5+);
			.endloop
			ac0 = ac0 + (*(ar2+t0) * *(ar5+t0));
			*(ar4+t1) = HI(saturate(rnd(ac0 << t3)));
			mar (*ar5-);
		}
		.loop (GAEC_BLKS-1)
			ac0 = *ar2 * *ar6;
			*ar2+ = HI(rnd(ac0 << #1));
		.endloop
		ac0 = *ar2 * *ar6;
		*(ar2+t0) = HI(rnd(ac0 << #1));
	}
L03
	t3 = pop();
	t2 = pop();
	xar6 = popboth();
	xar5 = popboth();
    .arms_on
	bit(ST2, #ST2_ARMS) = #1;
	return;	
	
;-------------------------------------------------------------------------
	.global 	__adapt_dc4B
;-------------------------------------------------------------------------
; band GAEC_BANDS
__adapt_dc4B
; GAEC_tDb *pDb = ar0
; GAEC_tSc *pSc = ar1
;
; input parameters are not modified
;
; if band = GAEC_BANDS;
    .arms_off
	bit(ST2, #ST2_ARMS) = #0;
	pshboth(xar5);
	pshboth(xar6);
	push(t2);
	push(t3);

	ac3 = *ar1(#(GAEC_tSc.asSSC+GAEC_BANDS))
	if (ac3 == #0) goto L03;
	
	ac0 = dbl(*ar0(#(GAEC_tDb.aslEn4+GAEC_BANDS*2)))
	
	ac1 = dbl(*ar0(#(GAEC_tDb.aslAdEn+GAEC_BANDS*2)))
	ac1 = ac1 + (ac0 << #-4);
	ac2 = #GAEC_ADEN_BASE << #GAEC_ADEN_SHFT;
	ac1 = min(ac2, ac1);
	dbl(*ar0(#(GAEC_tDb.aslAdEn+GAEC_BANDS*2))) = ac1;
	ac0 = ac0 + ac1;
	
; invert here, put it into t2
	ac0 = mant(ac0), t2 = -exp(ac0);
	ac1 = ac0 - (#32767 << #16);
	ac0 = #16020 << #16;
	ac0 = ac0 - (ac1 << #-1);
	ac1 = ac1 * ac1;
	ac0 = ac0 + (ac1 << #1);
	
	ac0 = ac0 * *ar1(#(GAEC_tSc.asSSC+GAEC_BANDS));
	ac0 = ac0 + (#1 << #11);
	ac0 = ac0 << #4;

	t2 = #30 + t2;

	brc0 = #(GAEC_BLKS-1);
	xar3 = mar(*ar1(#(GAEC_tSc.aasErr+GAEC_BLKS*GAEC_BANDS)));
	xar2 = mar(*ar1(#(GAEC_tSc.asNormErr)));
	localrepeat {
		ac1 = ac0 * *ar3+;
		*ar2+ = HI(rnd(ac1 << #1));
	}
	mar(ar2 - #(GAEC_BLKS))
;	
; set up ptrs
	xar4 = mar(*ar0(#(GAEC_tDb.asAdf+1)))	; ar4 = psAdf
	xar5 = dbl(*ar0(#(GAEC_tDb.psRcv)));			; ar5 = psRcv
	mar (*+ar5(#(GAEC_BANDS*GAEC_RCV_SZ + GAEC_ADF_BSZ)));
	
	goto L10			; merge with band 0 code stream

	
;-------------------------------------------------------------------------
	.global 	__adapt_ac4A
;	.sym __adapt_ac4A, __adapt_ac4A, 32, 2, 0
;-------------------------------------------------------------------------
__adapt_ac4A
; GAEC_tDb *pDb = ar0
; GAEC_tSc *pSc = ar1
;
; input parameters are NOT modified
;
    .arms_off
	bit(ST2, #ST2_ARMS) = #0;
	pshboth(xar5);
	pshboth(xar6);
	push(t2);
	push(t3);
	
	
; 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.asTmp))) ; for asNormErr
	ac2 = #GAEC_ADEN_BASE << #GAEC_ADEN_SHFT;
	t1 = #(GAEC_BLKS*GAEC_BANDS);

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

; if step size != 0
		ac0 = dbl(*ar3+); 
		ac1 = dbl(*ar4);
		ac1 = ac1 + (ac0 << #-4);
		ac1 = min(ac2, ac1);
		if (ac3 != #0) execute (D_unit) ; do not update AdEn if not valid
			|| dbl(*ar4+) = ac1;
		ac0 = ac0 + ac1;
		
		; invert here, put it into t2
		ac0 = mant(ac0), t2 = -exp(ac0);
		ac1 = ac0 - (#32767 << #16);
		ac0 = #16020 << #16;
		ac0 = ac0 - (ac1 << #-1);
		ac1 = ac1 * ac1;
		ac0 = ac0 + (ac1 << #1);
		
		ac0 = ac0 * *ar2+;
		ac0 = ac0 << #4;
		ac0 = rnd(ac0)
		|| t2 = #(30-11) + t2;
	 	*ar6+ = t2;
	
		localrepeat {
			ac1 = ac0 * *(ar5 + t1);
			*ar6+ = HI(rnd(ac1 << #1));
			ac1 = ac0 * *(ar5 - t1);
			*ar6+ = HI(rnd(ac1 << #1));
			mar(*ar5+);
		}
		*ar6+ = #(27852); // Q15(0.75)
	}		
;;;;;;;;;	goto L24 - dbg
;	
; setup ptrs initially
;
; ar2 = band counter
; ar3 -> Adf
; ar4 -> RcvI
; ar5 -> RcvQ
; ar6 -> Tmp (precalculated& stored vars)
; cdp -> NormErr
;
	xar2 = #(GAEC_BANDS-2);
	xar3 = mar(*ar0(#(GAEC_tDb.asAdf+GAEC_ADF_SZ*2)))	; ar4 = psAdf
	xar4 = dbl(*ar0(#(GAEC_tDb.psRcv)));			; ar5 = psRcv
	mar (*+ar4(#(GAEC_RCV_SZ + GAEC_ADF_BSZ)));
	xar5 = mar(*ar4(#(GAEC_RCV_SZ*GAEC_BANDS)))
	xar6 = mar(*ar1(#(GAEC_tSc.asTmp)));
	xcdp = mar(*ar1(#(GAEC_tSc.asNormErr)))
	
L23
;
; load shifts
		t2 = *ar6+;		; t2 = adf loading shift
		ac3 = t2 - #15;
;	
; recover NormErr
		repeat (#(GAEC_BLKS*2-1));
			coef(*cdp+) = *ar6+;
		mar (*+cdp(#(-GAEC_BLKS*2)));
;	
; set up shifts	and adjust NormErr
		if (ac3 <= #0) goto L21
		    ; if tx > 15
			brc0 = #(GAEC_BLKS*2-1);
			t3 = ac3 - #16;
			t3 = -t3;		; t3 = adf storing shift
			localrepeat {
				ac0 = *cdp;
				*cdp+ = HI(saturate(rnd(ac0<<t3)));
			}
			mar (*+cdp(#(-GAEC_BLKS*2)));
			t2 = #15;
			t3 = #1;
		goto L22
L21		
		t3 = t2 - #16;
		t3 = -t3;		; t3 = adf storing shift
		if (t2 >= #0) goto L22
			; if tx < 0
			brc0 = #(GAEC_BLKS*2-1);
			localrepeat {
				ac0 = *cdp;
				*cdp+ = HI(saturate(rnd(ac0<<t3)));
			}
			mar (*+cdp(#(-GAEC_BLKS*2)));
			t2 = #0;
			t3 = #16;
L22
;
; setup block repeat counters	
		brc0 = #(4-1);
		brc1 = #(GAEC_ADF_SZ/4-1);
		t1 = #(1+GAEC_BLKS);
		t0 = #(-GAEC_BLKS*2);
;
; the loop
		blockrepeat {
			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
				mar (*(ar4-t1)), mar(*(ar5-t1)), mar(coef(*(cdp+t0)));
				*ar3+ = HI(saturate(rnd(ac0 << t3)));
				*ar3+ = HI(saturate(rnd(ac1 << t3)));
			}
			.loop (GAEC_BLKS*2)
				ac0 = *ar6 * coef(*cdp);
				*cdp+ = HI(rnd(ac0 << #1));
			.endloop
			mar (*ar4), mar(*ar5), mar(coef(*(cdp+t0)));
		}
; advance to the next band
; psAdf is advanced automatically
		mar (ar4 + #(GAEC_RCV_SZ + GAEC_ADF_SZ)); psRcvI
		mar (ar5 + #(GAEC_RCV_SZ + GAEC_ADF_SZ)); psRcvI
		mar (ar6 + #1);
	if (*ar2- != #0) goto L23
L24	
	t3 = pop();
	t2 = pop();
	xar6 = popboth();
	xar5 = popboth();
    .arms_on
	bit(ST2, #ST2_ARMS) = #1;
	return;	
	
	.if 1
;-------------------------------------------------------------------------
	.global 	_GAEC_adapt4
;	.sym _GAEC_adapt4, _GAEC_adapt4, 32, 2, 0
;-------------------------------------------------------------------------
_GAEC_adapt4
	call _GAEC_update_energy4
	call __adapt_dc4A
	call __adapt_dc4B
	goto __adapt_ac4A
	.endif
	

	.endif

⌨️ 快捷键说明

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