changeset 615:5773e3907b86 default tip

libgsmhr1: integrate vad.c
author Mychaela Falconia <falcon@freecalypso.org>
date Thu, 05 Mar 2026 09:05:35 +0000
parents cf74197b9d4f
children
files libgsmhr1/Makefile libgsmhr1/namespace.list libgsmhr1/vad.c libgsmhr1/vad.h
diffstat 4 files changed, 131 insertions(+), 282 deletions(-) [+]
line wrap: on
line diff
--- a/libgsmhr1/Makefile	Thu Mar 05 08:02:35 2026 +0000
+++ b/libgsmhr1/Makefile	Thu Mar 05 09:05:35 2026 +0000
@@ -3,10 +3,10 @@
 	pack_frame.o paramval_cod.o paramval_common.o paramval_dec.o rtp_in.o \
 	rtp_in_direct.o rxfe.o rxfe_create.o sid_cw_params.o sid_detect.o \
 	sid_reset.o sp_dec.o sp_rom.o tfo.o twts002_in.o twts002_out.o \
-	unpack_frame.o
+	unpack_frame.o vad.o
 HDRS=	dec_func.h dec_state.h dtx_const.h dtx_dec.h dtx_enc.h dtx_rxfe.h \
 	enc_out_order.h enc_state.h err_conc.h mathdp31.h mathhalf.h \
-	namespace.h rxfe.h sp_rom.h tw_gsmhr.h typedefs.h
+	namespace.h rxfe.h sp_rom.h tw_gsmhr.h typedefs.h vad.h
 LIB=	libgsmhr1.a
 
 include ../config.defs
--- a/libgsmhr1/namespace.list	Thu Mar 05 08:02:35 2026 +0000
+++ b/libgsmhr1/namespace.list	Thu Mar 05 09:05:35 2026 +0000
@@ -34,3 +34,7 @@
 level_calc level_estimator_det level_estimator_upd signal_conceal_sub
 
 avgCNHist swComfortNoise updateCNHist lpcCorrQntz
+
+vad_algorithm energy_computation average_acf predictor_values schur_recursion
+step_up compute_rav1 spectral_comparison tone_detection threshold_adaptation
+vad_decision vad_hangover periodicity_update
--- a/libgsmhr1/vad.c	Thu Mar 05 08:02:35 2026 +0000
+++ b/libgsmhr1/vad.c	Thu Mar 05 09:05:35 2026 +0000
@@ -15,8 +15,10 @@
 */
 
 #include "typedefs.h"
+#include "namespace.h"
 #include "mathhalf.h"
 #include "mathdp31.h"
+#include "enc_state.h"
 #include "vad.h"
 
 
@@ -35,82 +37,6 @@
 #define M_MARGIN 27343
 #define E_MARGIN 27
 
-/*_________________________________________________________________________
- |                                                                         |
- |                            Static Variables                             |
- |_________________________________________________________________________|
-*/
-
-static Shortword
-       pswRvad[9],
-       swNormRvad,
-       swPt_sacf,
-       swPt_sav0,
-       swE_thvad,
-       swM_thvad,
-       swAdaptCount,
-       swBurstCount,
-       swHangCount,
-       swOldLagCount,
-       swVeryOldLagCount,
-       swOldLag;
-
-static Longword
-       pL_sacf[27],
-       pL_sav0[36],
-       L_lastdm;
-
-/****************************************************************************
- *
- *     FUNCTION:  vad_reset
- *
- *     VERSION:   1.2
- *
- *     PURPOSE:   Resets VAD static variables to their initial value.
- *
- ***************************************************************************/
-
-void   vad_reset(void)
-
-{
-
-/*_________________________________________________________________________
- |                                                                         |
- |                            Automatic Variables                          |
- |_________________________________________________________________________|
-*/
-
-  int    i;
-
-/*_________________________________________________________________________
- |                                                                         |
- |                              Executable Code                            |
- |_________________________________________________________________________|
-*/
-
-  pswRvad[0] = 24576;
-  swNormRvad = 7;
-  swPt_sacf = 0;
-  swPt_sav0 = 0;
-  L_lastdm = 0;
-  swE_thvad = 21;
-  swM_thvad = 21875;
-  swAdaptCount = 0;
-  swBurstCount = 0;
-  swHangCount = -1;
-  swOldLagCount = 0;
-  swVeryOldLagCount = 0;
-  swOldLag = 21;
-
-  for (i = 1; i < 9; i++)
-    pswRvad[i] = 0;
-  for (i = 0; i < 27; i++)
-    pL_sacf[i] = 0;
-  for (i = 0; i < 36; i++)
-    pL_sav0[i] = 0;
-
-}
-
 /****************************************************************************
  *
  *     FUNCTION:  vad_algorithm
@@ -129,11 +55,9 @@
  *
  ***************************************************************************/
 
-void   vad_algorithm(Longword pL_acf[9],
-                            Shortword swScaleAcf,
-                            Shortword pswRc[4],
-                            Shortword swPtch,
-                            Shortword *pswVadFlag)
+void vad_algorithm(struct vad_state *vst, Longword pL_acf[9],
+		   Shortword swScaleAcf, Shortword pswRc[4],
+		   Shortword swPtch, Shortword *pswVadFlag)
 {
 
 /*_________________________________________________________________________
@@ -165,58 +89,58 @@
 */
 
   energy_computation
-          (
+          (vst,
            pL_acf, swScaleAcf,
-           pswRvad, swNormRvad,
+           vst->pswRvad, vst->swNormRvad,
            &swM_pvad, &swE_pvad,
            &swM_acf0, &swE_acf0
           );
 
   average_acf
-          (
+          (vst,
            pL_acf, swScaleAcf,
            pL_av0, pL_av1
           );
 
   predictor_values
-          (
+          (vst,
            pL_av1,
            pswRav1,
            &swNormRav1
           );
 
   spectral_comparison
-          (
+          (vst,
            pswRav1, swNormRav1,
            pL_av0,
            &swStat
           );
 
   tone_detection
-          (
+          (vst,
            pswRc,
            &swTone
           );
 
   threshold_adaptation
-          (
+          (vst,
            swStat, swPtch, swTone,
            pswRav1, swNormRav1,
            swM_pvad, swE_pvad,
            swM_acf0, swE_acf0,
-           pswRvad, &swNormRvad,
-           &swM_thvad, &swE_thvad
+           vst->pswRvad, &vst->swNormRvad,
+           &vst->swM_thvad, &vst->swE_thvad
           );
 
   vad_decision
-          (
+          (vst,
            swM_pvad, swE_pvad,
-           swM_thvad, swE_thvad,
+           vst->swM_thvad, vst->swE_thvad,
            &swVvad
           );
 
   vad_hangover
-          (
+          (vst,
            swVvad,
            pswVadFlag
           );
@@ -244,14 +168,11 @@
  *
  ***************************************************************************/
 
-void   energy_computation(Longword pL_acf[],
-                                 Shortword swScaleAcf,
-                                 Shortword pswRvad[],
-                                 Shortword swNormRvad,
-                                 Shortword *pswM_pvad,
-                                 Shortword *pswE_pvad,
-                                 Shortword *pswM_acf0,
-                                 Shortword *pswE_acf0)
+void energy_computation(struct vad_state *vst, Longword pL_acf[],
+			Shortword swScaleAcf, Shortword pswRvad[],
+			Shortword swNormRvad, Shortword *pswM_pvad,
+			Shortword *pswE_pvad, Shortword *pswM_acf0,
+			Shortword *pswE_acf0)
 {
 
 /*_________________________________________________________________________
@@ -344,10 +265,8 @@
  *
  ***************************************************************************/
 
-void   average_acf(Longword pL_acf[],
-                          Shortword swScaleAcf,
-                          Longword pL_av0[],
-                          Longword pL_av1[])
+void average_acf(struct vad_state *vst, Longword pL_acf[],
+		 Shortword swScaleAcf, Longword pL_av0[], Longword pL_av1[])
 {
 
 /*_________________________________________________________________________
@@ -378,26 +297,26 @@
   for (i = 0; i <= 8; i++)
   {
     L_temp = L_shr(pL_acf[i], swScale);
-    pL_av0[i] = L_add(pL_sacf[i], L_temp);
-    pL_av0[i] = L_add(pL_sacf[i + 9], pL_av0[i]);
-    pL_av0[i] = L_add(pL_sacf[i + 18], pL_av0[i]);
-    pL_sacf[swPt_sacf + i] = L_temp;
-    pL_av1[i] = pL_sav0[swPt_sav0 + i];
-    pL_sav0[swPt_sav0 + i] = pL_av0[i];
+    pL_av0[i] = L_add(vst->pL_sacf[i], L_temp);
+    pL_av0[i] = L_add(vst->pL_sacf[i + 9], pL_av0[i]);
+    pL_av0[i] = L_add(vst->pL_sacf[i + 18], pL_av0[i]);
+    vst->pL_sacf[vst->swPt_sacf + i] = L_temp;
+    pL_av1[i] = vst->pL_sav0[vst->swPt_sav0 + i];
+    vst->pL_sav0[vst->swPt_sav0 + i] = pL_av0[i];
   }
 
 
   /*** Update the array pointers ***/
 
-  if (swPt_sacf == 18)
-    swPt_sacf = 0;
+  if (vst->swPt_sacf == 18)
+    vst->swPt_sacf = 0;
   else
-    swPt_sacf = add(swPt_sacf, 9);
+    vst->swPt_sacf = add(vst->swPt_sacf, 9);
 
-  if (swPt_sav0 == 27)
-    swPt_sav0 = 0;
+  if (vst->swPt_sav0 == 27)
+    vst->swPt_sav0 = 0;
   else
-    swPt_sav0 = add(swPt_sav0, 9);
+    vst->swPt_sav0 = add(vst->swPt_sav0, 9);
 
 }
 
@@ -417,9 +336,8 @@
  *
  ***************************************************************************/
 
-void   predictor_values(Longword pL_av1[],
-                               Shortword pswRav1[],
-                               Shortword *pswNormRav1)
+void predictor_values(struct vad_state *vst, Longword pL_av1[],
+			Shortword pswRav1[], Shortword *pswNormRav1)
 {
 
 /*_________________________________________________________________________
@@ -438,9 +356,9 @@
  |_________________________________________________________________________|
 */
 
-  schur_recursion(pL_av1, pswVpar);
-  step_up(8, pswVpar, pswAav1);
-  compute_rav1(pswAav1, pswRav1, pswNormRav1);
+  schur_recursion(vst, pL_av1, pswVpar);
+  step_up(vst, 8, pswVpar, pswAav1);
+  compute_rav1(vst, pswAav1, pswRav1, pswNormRav1);
 
 }
 
@@ -459,8 +377,8 @@
  *
  ***************************************************************************/
 
-void   schur_recursion(Longword pL_av1[],
-                              Shortword pswVpar[])
+void schur_recursion(struct vad_state *vst, Longword pL_av1[],
+		     Shortword pswVpar[])
 {
 
 /*_________________________________________________________________________
@@ -558,9 +476,8 @@
  *
  ***************************************************************************/
 
-void   step_up(Shortword swNp,
-                      Shortword pswVpar[],
-                      Shortword pswAav1[])
+void step_up(struct vad_state *vst, Shortword swNp, Shortword pswVpar[],
+		Shortword pswAav1[])
 {
 
 /*_________________________________________________________________________
@@ -631,9 +548,8 @@
  *
  ***************************************************************************/
 
-void   compute_rav1(Shortword pswAav1[],
-                           Shortword pswRav1[],
-                           Shortword *pswNormRav1)
+void compute_rav1(struct vad_state *vst, Shortword pswAav1[],
+		  Shortword pswRav1[], Shortword *pswNormRav1)
 {
 
 /*_________________________________________________________________________
@@ -693,10 +609,9 @@
  *
  ***************************************************************************/
 
-void   spectral_comparison(Shortword pswRav1[],
-                                  Shortword swNormRav1,
-                                  Longword pL_av0[],
-                                  Shortword *pswStat)
+void spectral_comparison(struct vad_state *vst, Shortword pswRav1[],
+			 Shortword swNormRav1, Longword pL_av0[],
+			 Shortword *pswStat)
 {
 
 /*_________________________________________________________________________
@@ -799,8 +714,8 @@
 
   /*** Compute the difference and save L_dm ***/
 
-  L_temp = L_sub(L_dm, L_lastdm);
-  L_lastdm = L_dm;
+  L_temp = L_sub(L_dm, vst->L_lastdm);
+  vst->L_lastdm = L_dm;
 
   if (L_temp < 0L)
     L_temp = L_negate(L_temp);
@@ -833,8 +748,8 @@
  *
  ***************************************************************************/
 
-void   tone_detection(Shortword pswRc[4],
-                             Shortword *pswTone)
+void tone_detection(struct vad_state *vst, Shortword pswRc[4],
+		    Shortword *pswTone)
 {
 
 /*_________________________________________________________________________
@@ -867,7 +782,7 @@
 
   /*** Calculate filter coefficients ***/
 
-  step_up(2, pswRc, pswA);
+  step_up(vst, 2, pswRc, pswA);
 
 
   /*** Calculate ( a[1] * a[1] ) ***/
@@ -945,19 +860,13 @@
  *
  ***************************************************************************/
 
-void   threshold_adaptation(Shortword swStat,
-                                   Shortword swPtch,
-                                   Shortword swTone,
-                                   Shortword pswRav1[],
-                                   Shortword swNormRav1,
-                                   Shortword swM_pvad,
-                                   Shortword swE_pvad,
-                                   Shortword swM_acf0,
-                                   Shortword swE_acf0,
-                                   Shortword pswRvad[],
-                                   Shortword *pswNormRvad,
-                                   Shortword *pswM_thvad,
-                                   Shortword *pswE_thvad)
+void threshold_adaptation(struct vad_state *vst, Shortword swStat,
+			  Shortword swPtch, Shortword swTone,
+			  Shortword pswRav1[], Shortword swNormRav1,
+			  Shortword swM_pvad, Shortword swE_pvad,
+			  Shortword swM_acf0, Shortword swE_acf0,
+			  Shortword pswRvad[], Shortword *pswNormRvad,
+			  Shortword *pswM_thvad, Shortword *pswE_thvad)
 {
 
 /*_________________________________________________________________________
@@ -1015,15 +924,15 @@
 
   if (swComp == 1)
   {
-    swAdaptCount = 0;
+    vst->swAdaptCount = 0;
     return;
   }
 
 
   /*** Increment adaptcount ***/
 
-  swAdaptCount = add(swAdaptCount, 1);
-  if (swAdaptCount <= 8)
+  vst->swAdaptCount = add(vst->swAdaptCount, 1);
+  if (vst->swAdaptCount <= 8)
     return;
 
 
@@ -1165,7 +1074,7 @@
 
   /*** Set adaptcount to adp + 1 ***/
 
-  swAdaptCount = 9;
+  vst->swAdaptCount = 9;
 
 }
 
@@ -1187,11 +1096,9 @@
  *
  ***************************************************************************/
 
-void   vad_decision(Shortword swM_pvad,
-                           Shortword swE_pvad,
-                           Shortword swM_thvad,
-                           Shortword swE_thvad,
-                           Shortword *pswVvad)
+void vad_decision(struct vad_state *vst, Shortword swM_pvad,
+		  Shortword swE_pvad, Shortword swM_thvad,
+		  Shortword swE_thvad, Shortword *pswVvad)
 {
 
 /*_________________________________________________________________________
@@ -1224,8 +1131,8 @@
  *
  ***************************************************************************/
 
-void   vad_hangover(Shortword swVvad,
-                           Shortword *pswVadFlag)
+void vad_hangover(struct vad_state *vst, Shortword swVvad,
+		  Shortword *pswVadFlag)
 {
 
 /*_________________________________________________________________________
@@ -1235,22 +1142,22 @@
 */
 
   if (swVvad == 1)
-    swBurstCount = add(swBurstCount, 1);
+    vst->swBurstCount = add(vst->swBurstCount, 1);
   else
-    swBurstCount = 0;
+    vst->swBurstCount = 0;
 
-  if (swBurstCount >= 3)
+  if (vst->swBurstCount >= 3)
   {
-    swHangCount = 5;
-    swBurstCount = 3;
+    vst->swHangCount = 5;
+    vst->swBurstCount = 3;
   }
 
   *pswVadFlag = swVvad;
 
-  if (swHangCount >= 0)
+  if (vst->swHangCount >= 0)
   {
     *pswVadFlag = 1;
-    swHangCount = sub(swHangCount, 1);
+    vst->swHangCount = sub(vst->swHangCount, 1);
   }
 
 }
@@ -1270,8 +1177,8 @@
  *
  ***************************************************************************/
 
-void   periodicity_update(Shortword pswLags[4],
-                                 Shortword *pswPtch)
+void periodicity_update(struct vad_state *vst, Shortword pswLags[4],
+			Shortword *pswPtch)
 {
 
 /*_________________________________________________________________________
@@ -1305,14 +1212,14 @@
   {
     /*** Search the maximum and minimum of consecutive lags ***/
 
-    if (swOldLag > pswLags[i])
+    if (vst->swOldLag > pswLags[i])
     {
       swMinLag = pswLags[i];
-      swMaxLag = swOldLag;
+      swMaxLag = vst->swOldLag;
     }
     else
     {
-      swMinLag = swOldLag;
+      swMinLag = vst->swOldLag;
       swMaxLag = pswLags[i];
     }
 
@@ -1341,19 +1248,19 @@
 
     /*** Save the current LTP lag ***/
 
-    swOldLag = pswLags[i];
+    vst->swOldLag = pswLags[i];
   }
 
 
   /*** Update the veryoldlagcount and oldlagcount ***/
 
-  swVeryOldLagCount = swOldLagCount;
-  swOldLagCount = swLagCount;
+  vst->swVeryOldLagCount = vst->swOldLagCount;
+  vst->swOldLagCount = swLagCount;
 
 
   /*** Make ptch decision ready for next frame ***/
 
-  swTemp = add(swOldLagCount, swVeryOldLagCount);
+  swTemp = add(vst->swOldLagCount, vst->swVeryOldLagCount);
 
   if (swTemp >= 7)
     *pswPtch = 1;
--- a/libgsmhr1/vad.h	Thu Mar 05 08:02:35 2026 +0000
+++ b/libgsmhr1/vad.h	Thu Mar 05 09:05:35 2026 +0000
@@ -10,116 +10,54 @@
  |_________________________________________________________________________|
 */
 
-void   vad_reset(void);
-
-void   vad_algorithm
-       (
-               Longword pL_acf[9],
-               Shortword swScaleAcf,
-               Shortword pswRc[4],
-               Shortword swPtch,
-               Shortword *pswVadFlag
-);
+void vad_algorithm(struct vad_state *vst, Longword pL_acf[9],
+		   Shortword swScaleAcf, Shortword pswRc[4],
+		   Shortword swPtch, Shortword *pswVadFlag);
 
-void   energy_computation
-       (
-               Longword pL_acf[],
-               Shortword swScaleAcf,
-               Shortword pswRvad[],
-               Shortword swNormRvad,
-               Shortword *pswM_pvad,
-               Shortword *pswE_pvad,
-               Shortword *pswM_acf0,
-               Shortword *pswE_acf0
-);
-
+void energy_computation(struct vad_state *vst, Longword pL_acf[],
+			Shortword swScaleAcf, Shortword pswRvad[],
+			Shortword swNormRvad, Shortword *pswM_pvad,
+			Shortword *pswE_pvad, Shortword *pswM_acf0,
+			Shortword *pswE_acf0);
 
-void   average_acf
-       (
-               Longword pL_acf[],
-               Shortword swScaleAcf,
-               Longword pL_av0[],
-               Longword pL_av1[]
-);
+void average_acf(struct vad_state *vst, Longword pL_acf[],
+		 Shortword swScaleAcf, Longword pL_av0[], Longword pL_av1[]);
+
+void predictor_values(struct vad_state *vst, Longword pL_av1[],
+			Shortword pswRav1[], Shortword *pswNormRav1);
 
-void   predictor_values
-       (
-               Longword pL_av1[],
-               Shortword pswRav1[],
-               Shortword *pswNormRav1
-);
+void schur_recursion(struct vad_state *vst, Longword pL_av1[],
+		     Shortword pswVpar[]);
 
-void   schur_recursion
-       (
-               Longword pL_av1[],
-               Shortword pswVpar[]
-);
+void step_up(struct vad_state *vst, Shortword swNp, Shortword pswVpar[],
+		Shortword pswAav1[]);
 
-void   step_up
-       (
-               Shortword swNp,
-               Shortword pswVpar[],
-               Shortword pswAav1[]
-);
+void compute_rav1(struct vad_state *vst, Shortword pswAav1[],
+		  Shortword pswRav1[], Shortword *pswNormRav1);
 
-void   compute_rav1
-       (
-               Shortword pswAav1[],
-               Shortword pswRav1[],
-               Shortword *pswNormRav1
-);
+void spectral_comparison(struct vad_state *vst, Shortword pswRav1[],
+			 Shortword swNormRav1, Longword pL_av0[],
+			 Shortword *pswStat);
 
-void   spectral_comparison
-       (
-               Shortword pswRav1[],
-               Shortword swNormRav1,
-               Longword pL_av0[],
-               Shortword *pswStat
-);
-
-void   tone_detection
-       (
-               Shortword pswRc[4],
-               Shortword *pswTone
-);
-
+void tone_detection(struct vad_state *vst, Shortword pswRc[4],
+		    Shortword *pswTone);
 
-void   threshold_adaptation
-       (
-               Shortword swStat,
-               Shortword swPtch,
-               Shortword swTone,
-               Shortword pswRav1[],
-               Shortword swNormRav1,
-               Shortword swM_pvad,
-               Shortword swE_pvad,
-               Shortword swM_acf0,
-               Shortword swE_acf0,
-               Shortword pswRvad[],
-               Shortword *pswNormRvad,
-               Shortword *pswM_thvad,
-               Shortword *pswE_thvad
-);
+void threshold_adaptation(struct vad_state *vst, Shortword swStat,
+			  Shortword swPtch, Shortword swTone,
+			  Shortword pswRav1[], Shortword swNormRav1,
+			  Shortword swM_pvad, Shortword swE_pvad,
+			  Shortword swM_acf0, Shortword swE_acf0,
+			  Shortword pswRvad[], Shortword *pswNormRvad,
+			  Shortword *pswM_thvad, Shortword *pswE_thvad);
 
-void   vad_decision
-       (
-               Shortword swM_pvad,
-               Shortword swE_pvad,
-               Shortword swM_thvad,
-               Shortword swE_thvad,
-               Shortword *pswVvad
-);
+void vad_decision(struct vad_state *vst, Shortword swM_pvad,
+		  Shortword swE_pvad, Shortword swM_thvad,
+		  Shortword swE_thvad, Shortword *pswVvad);
 
-void   vad_hangover
-       (
-               Shortword swVvad,
-               Shortword *pswVadFlag
-);
+void vad_hangover(struct vad_state *vst, Shortword swVvad,
+		  Shortword *pswVadFlag);
 
-void   periodicity_update
-       (
-               Shortword pswLags[4],
-               Shortword *pswPtch
-);
+void periodicity_update(struct vad_state *vst, Shortword pswLags[4],
+			Shortword *pswPtch);
 
 #endif