📄 gaecdtda.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 + -