FreeCalypso > hg > gsm-codec-lib
diff libgsmefr/vad.c @ 111:756605c4850f
libgsmefr: vad.c compiles
author | Mychaela Falconia <falcon@freecalypso.org> |
---|---|
date | Tue, 29 Nov 2022 04:16:33 +0000 |
parents | 913fe3c11890 |
children | 1c108dd5b33f |
line wrap: on
line diff
--- a/libgsmefr/vad.c Tue Nov 29 03:01:38 2022 +0000 +++ b/libgsmefr/vad.c Tue Nov 29 04:16:33 2022 +0000 @@ -40,12 +40,15 @@ * **************************************************************************/ +#include "gsm_efr.h" #include "typedef.h" +#include "namespace.h" #include "cnst.h" #include "basic_op.h" #include "oper_32b.h" -#include "count.h" +#include "no_count.h" #include "vad.h" +#include "enc_state.h" /* Constants of VAD hangover addition */ @@ -78,19 +81,84 @@ #define FREQTH 3189 #define PREDTH 1464 -/* Static variables of VAD */ +/* forward declarations for internal functions */ + +static void energy_computation ( + Word16 r_h[], + Word16 scal_acf, + Word16 rvad[], + Word16 scal_rvad, + Pfloat * acf0, + Pfloat * pvad +); + +static void acf_averaging ( + struct EFR_encoder_state *st, + Word16 r_h[], + Word16 r_l[], + Word16 scal_acf, + Word32 L_av0[], + Word32 L_av1[] +); + +static void predictor_values ( + Word32 L_av1[], + Word16 rav1[], + Word16 *scal_rav1 +); + +static void schur_recursion ( + Word32 L_av1[], + Word16 vpar[] +); + +static void step_up ( + Word16 np, + Word16 vpar[], + Word16 aav1[] +); -static Word16 rvad[9], scal_rvad; -static Pfloat thvad; -static Word32 L_sacf[27]; -static Word32 L_sav0[36]; -static Word16 pt_sacf, pt_sav0; -static Word32 L_lastdm; -static Word16 adaptcount; -static Word16 burstcount, hangcount; -static Word16 oldlagcount, veryoldlagcount, oldlag; +static void compute_rav1 ( + Word16 aav1[], + Word16 rav1[], + Word16 *scal_rav1 +); + +static Word16 spectral_comparison ( + struct EFR_encoder_state *st, + Word16 rav1[], + Word16 scal_rav1, + Word32 L_av0[] +); -Word16 ptch; +static void threshold_adaptation ( + struct EFR_encoder_state *st, + Word16 stat, + Word16 ptch, + Word16 tone, + Word16 rav1[], + Word16 scal_rav1, + Pfloat pvad, + Pfloat acf0, + Word16 rvad[], + Word16 *scal_rvad, + Pfloat * thvad +); + +static void tone_detection ( + Word16 rc[], + Word16 *tone +); + +static Word16 vad_decision ( + Pfloat pvad, + Pfloat thvad +); + +static Word16 vad_hangover ( + struct EFR_encoder_state *st, + Word16 vvad +); /************************************************************************* * @@ -101,50 +169,51 @@ * *************************************************************************/ -void vad_reset () +void vad_reset (struct EFR_encoder_state *st) { + struct vad_state *vst = &st->vad; Word16 i; /* Initialize rvad variables */ - rvad[0] = 0x6000; + vst->rvad[0] = 0x6000; for (i = 1; i < 9; i++) { - rvad[i] = 0; + vst->rvad[i] = 0; } - scal_rvad = 7; + vst->scal_rvad = 7; /* Initialize threshold level */ - thvad.e = 20; /*** exponent ***/ - thvad.m = 27083; /*** mantissa ***/ + vst->thvad.e = 20; /*** exponent ***/ + vst->thvad.m = 27083; /*** mantissa ***/ /* Initialize ACF averaging variables */ for (i = 0; i < 27; i++) { - L_sacf[i] = 0L; + vst->L_sacf[i] = 0L; } for (i = 0; i < 36; i++) { - L_sav0[i] = 0L; + vst->L_sav0[i] = 0L; } - pt_sacf = 0; - pt_sav0 = 0; + vst->pt_sacf = 0; + vst->pt_sav0 = 0; /* Initialize spectral comparison variable */ - L_lastdm = 0L; + vst->L_lastdm = 0L; /* Initialize threshold adaptation variable */ - adaptcount = 0; + vst->adaptcount = 0; /* Initialize VAD hangover addition variables */ - burstcount = 0; - hangcount = -1; + vst->burstcount = 0; + vst->hangcount = -1; /* Initialize periodicity detection variables */ - oldlagcount = 0; - veryoldlagcount = 0; - oldlag = 18; + vst->oldlagcount = 0; + vst->veryoldlagcount = 0; + vst->oldlag = 18; - ptch = 1; + st->ptch = 1; return; } @@ -169,6 +238,7 @@ ***************************************************************************/ Word16 vad_computation ( + struct EFR_encoder_state *st, Word16 r_h[], Word16 r_l[], Word16 scal_acf, @@ -176,19 +246,20 @@ Word16 ptch ) { + struct vad_state *vst = &st->vad; Word32 L_av0[9], L_av1[9]; Word16 vad, vvad, rav1[9], scal_rav1, stat, tone; Pfloat acf0, pvad; - energy_computation (r_h, scal_acf, rvad, scal_rvad, &acf0, &pvad); - acf_averaging (r_h, r_l, scal_acf, L_av0, L_av1); + energy_computation (r_h, scal_acf, vst->rvad, vst->scal_rvad, &acf0, &pvad); + acf_averaging (st, r_h, r_l, scal_acf, L_av0, L_av1); predictor_values (L_av1, rav1, &scal_rav1); - stat = spectral_comparison (rav1, scal_rav1, L_av0); move16 (); + stat = spectral_comparison (st, rav1, scal_rav1, L_av0); tone_detection (rc, &tone); - threshold_adaptation (stat, ptch, tone, rav1, scal_rav1, pvad, acf0, - rvad, &scal_rvad, &thvad); - vvad = vad_decision (pvad, thvad); move16 (); - vad = vad_hangover (vvad); move16 (); + threshold_adaptation (st, stat, ptch, tone, rav1, scal_rav1, pvad, acf0, + vst->rvad, &vst->scal_rvad, &vst->thvad); + vvad = vad_decision (pvad, vst->thvad); + vad = vad_hangover (st, vvad); return vad; } @@ -278,6 +349,7 @@ ***************************************************************************/ void acf_averaging ( + struct EFR_encoder_state *st, Word16 r_h[], Word16 r_l[], Word16 scal_acf, @@ -285,6 +357,7 @@ Word32 L_av1[] ) { + struct vad_state *vst = &st->vad; Word32 L_temp; Word16 scale; Word16 i; @@ -294,34 +367,32 @@ for (i = 0; i <= 8; i++) { L_temp = L_shr (L_Comp (r_h[i], r_l[i]), scale); - L_av0[i] = L_add (L_sacf[i], L_temp); move32 (); - L_av0[i] = L_add (L_sacf[i + 9], L_av0[i]); move32 (); - L_av0[i] = L_add (L_sacf[i + 18], L_av0[i]); move32 (); - L_sacf[pt_sacf + i] = L_temp; move32 (); - L_av1[i] = L_sav0[pt_sav0 + i]; move32 (); - L_sav0[pt_sav0 + i] = L_av0[i]; move32 (); + L_av0[i] = L_add (vst->L_sacf[i], L_temp); + L_av0[i] = L_add (vst->L_sacf[i + 9], L_av0[i]); + L_av0[i] = L_add (vst->L_sacf[i + 18], L_av0[i]); + vst->L_sacf[vst->pt_sacf + i] = L_temp; + L_av1[i] = vst->L_sav0[vst->pt_sav0 + i]; + vst->L_sav0[vst->pt_sav0 + i] = L_av0[i]; } /* Update the array pointers */ - test (); - if (sub (pt_sacf, 18) == 0) + if (sub (vst->pt_sacf, 18) == 0) { - pt_sacf = 0; move16 (); + vst->pt_sacf = 0; } else { - pt_sacf = add (pt_sacf, 9); + vst->pt_sacf = add (vst->pt_sacf, 9); } - test (); - if (sub (pt_sav0, 27) == 0) + if (sub (vst->pt_sav0, 27) == 0) { - pt_sav0 = 0; move16 (); + vst->pt_sav0 = 0; } else { - pt_sav0 = add (pt_sav0, 9); + vst->pt_sav0 = add (vst->pt_sav0, 9); } return; @@ -585,11 +656,13 @@ ***************************************************************************/ Word16 spectral_comparison ( + struct EFR_encoder_state *st, Word16 rav1[], Word16 scal_rav1, Word32 L_av0[] ) { + struct vad_state *vst = &st->vad; Word32 L_dm, L_sump, L_temp; Word16 stat, sav0[9], shift, divshift, temp; Word16 i; @@ -686,8 +759,8 @@ /*** Compute the difference and save L_dm ***/ - L_temp = L_sub (L_dm, L_lastdm); - L_lastdm = L_dm; move32 (); + L_temp = L_sub (L_dm, vst->L_lastdm); + vst->L_lastdm = L_dm; test (); if (L_temp < 0L) @@ -736,6 +809,7 @@ ***************************************************************************/ void threshold_adaptation ( + struct EFR_encoder_state *st, Word16 stat, Word16 ptch, Word16 tone, @@ -748,6 +822,7 @@ Pfloat * thvad ) { + struct vad_state *vst = &st->vad; Word16 comp, comp2; Word32 L_temp; Word16 temp; @@ -796,14 +871,13 @@ test (); if (sub (comp, 1) == 0) { - adaptcount = 0; move16 (); + vst->adaptcount = 0; return; } /*** Increment adaptcount ***/ - adaptcount = add (adaptcount, 1); - test (); - if (sub (adaptcount, 8) <= 0) + vst->adaptcount = add (vst->adaptcount, 1); + if (sub (vst->adaptcount, 8) <= 0) { return; } @@ -969,7 +1043,7 @@ /*** Set adaptcount to adp + 1 ***/ - adaptcount = 9; move16 (); + vst->adaptcount = 9; return; } @@ -1116,29 +1190,29 @@ ***************************************************************************/ Word16 vad_hangover ( + struct EFR_encoder_state *st, Word16 vvad ) { - test (); + struct vad_state *vst = &st->vad; + if (sub (vvad, 1) == 0) { - burstcount = add (burstcount, 1); + vst->burstcount = add (vst->burstcount, 1); } else { - burstcount = 0; move16 (); + vst->burstcount = 0; } - test (); - if (sub (burstcount, BURSTCONST) >= 0) + if (sub (vst->burstcount, BURSTCONST) >= 0) { - hangcount = HANGCONST; move16 (); - burstcount = BURSTCONST;move16 (); + vst->hangcount = HANGCONST; + vst->burstcount = BURSTCONST; } - test (); - if (hangcount >= 0) + if (vst->hangcount >= 0) { - hangcount = sub (hangcount, 1); + vst->hangcount = sub (vst->hangcount, 1); return 1; /* vad = 1 */ } return vvad; /* vad = vvad */ @@ -1160,63 +1234,60 @@ ***************************************************************************/ void periodicity_update ( - Word16 lags[], - Word16 *ptch + struct EFR_encoder_state *st, + Word16 lags[] ) { + struct vad_state *vst = &st->vad; Word16 minlag, maxlag, lagcount, temp; Word16 i; /*** Run loop for the two halves in the frame ***/ - lagcount = 0; move16 (); + lagcount = 0; for (i = 0; i <= 1; i++) { /*** Search the maximum and minimum of consecutive lags ***/ - test (); - if (sub (oldlag, lags[i]) > 0) + if (sub (vst->oldlag, lags[i]) > 0) { - minlag = lags[i]; move16 (); - maxlag = oldlag; move16 (); + minlag = lags[i]; + maxlag = vst->oldlag; } else { - minlag = oldlag; move16 (); - maxlag = lags[i]; move16 (); + minlag = vst->oldlag; + maxlag = lags[i]; } temp = sub (maxlag, minlag); - test (); if (sub (temp, LTHRESH) < 0) { lagcount = add (lagcount, 1); } /*** Save the current LTP lag ***/ - oldlag = lags[i]; move16 (); + vst->oldlag = lags[i]; } /*** Update the veryoldlagcount and oldlagcount ***/ - veryoldlagcount = oldlagcount; - move16 (); - oldlagcount = lagcount; move16 (); + vst->veryoldlagcount = vst->oldlagcount; + vst->oldlagcount = lagcount; /*** Make ptch decision ready for next frame ***/ - temp = add (oldlagcount, veryoldlagcount); + temp = add (vst->oldlagcount, vst->veryoldlagcount); - test (); if (sub (temp, NTHRESH) >= 0) { - *ptch = 1; move16 (); + st->ptch = 1; } else { - *ptch = 0; move16 (); + st->ptch = 0; } return;