changeset 577:d68b2c92464a

libgsmhr1: bring in parts of dtx.[ch] needed for RxFE
author Mychaela Falconia <falcon@freecalypso.org>
date Thu, 13 Feb 2025 03:06:11 +0000
parents 94f0cc85ad50
children 7756b23b78cd
files libgsmhr1/Makefile libgsmhr1/dtx_const.h libgsmhr1/dtx_rxfe.c libgsmhr1/dtx_rxfe.h libgsmhr1/namespace.list
diffstat 5 files changed, 328 insertions(+), 6 deletions(-) [+]
line wrap: on
line diff
--- a/libgsmhr1/Makefile	Thu Feb 13 00:52:06 2025 +0000
+++ b/libgsmhr1/Makefile	Thu Feb 13 03:06:11 2025 +0000
@@ -1,9 +1,9 @@
-OBJS=	dhf_packed.o dhf_params.o enc_out_order.o mathdp31.o mathhalf.o \
-	pack_frame.o paramval_cod.o paramval_common.o paramval_dec.o rtp_in.o \
-	rtp_in_direct.o sid_cw_params.o sid_detect.o sid_reset.o sp_rom.o \
-	twts002_in.o twts002_out.o unpack_frame.o
-HDRS=	enc_out_order.h mathdp31.h mathhalf.h namespace.h sp_rom.h tw_gsmhr.h \
-	typedefs.h
+OBJS=	dhf_packed.o dhf_params.o dtx_rxfe.o enc_out_order.o mathdp31.o \
+	mathhalf.o pack_frame.o paramval_cod.o paramval_common.o paramval_dec.o\
+	rtp_in.o rtp_in_direct.o sid_cw_params.o sid_detect.o sid_reset.o \
+	sp_rom.o twts002_in.o twts002_out.o unpack_frame.o
+HDRS=	dtx_const.h dtx_rxfe.h enc_out_order.h mathdp31.h mathhalf.h \
+	namespace.h sp_rom.h tw_gsmhr.h typedefs.h
 LIB=	libgsmhr1.a
 
 include ../config.defs
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/libgsmhr1/dtx_const.h	Thu Feb 13 03:06:11 2025 +0000
@@ -0,0 +1,22 @@
+#ifndef __DTX_CONST
+#define __DTX_CONST
+
+#include "typedefs.h"
+
+#define PN_INIT_SEED (Longword)0x1091988L       /* initial seed for Comfort
+                                                 * noise pn-generator */
+
+#define CNINTPER    12                 /* inperpolation period of CN
+                                        * parameters */
+
+#define SPEECH      1
+#define CNIFIRSTSID 2
+#define CNICONT     3
+#define CNIBFI      4
+
+#define VALIDSID    11
+#define INVALIDSID  22
+#define GOODSPEECH  33
+#define UNUSABLE    44
+
+#endif
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/libgsmhr1/dtx_rxfe.c	Thu Feb 13 03:06:11 2025 +0000
@@ -0,0 +1,280 @@
+/*
+ * Here we implement the subset of DTX functions that are used by the Rx
+ * front end, i.e., the part of libgsmhr1 that is common between the full
+ * decoder and our TFO transform implementation.  Note that the same DTX
+ * functions will also be used by the speech encoder.
+ */
+
+#include "typedefs.h"
+#include "namespace.h"
+#include "dtx_rxfe.h"
+#include "mathhalf.h"
+#include "mathdp31.h"
+
+/* relevant definitions from original dtx.c */
+
+#define PN_XOR_REG (Longword)0x00000005L
+#define PN_XOR_ADD (Longword)0x40000000L
+
+#define OH_SHIFT 3                     /* shift corresponding to OVERHANG */
+
+/* Values of GS for voicing state 0, all values shifted down by 2
+   shifts */
+const LongwordRom ppLr_gsTable[4][32] =
+{
+  {
+    0x000011ab, 0x000038d2, 0x0000773e, 0x000144ef,
+    0x00035675, 0x000648c5, 0x000c3d65, 0x0017ae17,
+    0x002a3dbb, 0x005238e7, 0x00695c1a, 0x00a60d45,
+    0x00e4cc68, 0x01c3ba6a, 0x019e3c96, 0x02d1fbac,
+    0x030453ec, 0x0549a998, 0x05190298, 0x08258920,
+    0x08daff30, 0x0c3150e0, 0x0e45d850, 0x14c111a0,
+    0x0ff7e1c0, 0x18a06860, 0x13810400, 0x1abc9ee0,
+    0x28500940, 0x41f22800, 0x22fc5040, 0x2cd90180
+  },
+
+  {
+    0x00003ede, 0x00021fc9, 0x0013f0c3, 0x003a7be2,
+    0x007a6663, 0x00fe3773, 0x012fabf4, 0x02275cd0,
+    0x01c0ef14, 0x02c0b1d8, 0x0350fc70, 0x05505078,
+    0x04175f30, 0x052c1098, 0x08ed3310, 0x0a63b470,
+    0x05417870, 0x08995ee0, 0x07bbe018, 0x0a19fa10,
+    0x0b5818c0, 0x0fd96ea0, 0x0e5cad10, 0x13b40d40,
+    0x12d45840, 0x14577320, 0x2b2e5e00, 0x333e9640,
+    0x194c35c0, 0x1c30f8c0, 0x2d16db00, 0x2cc970ff
+  },
+  {
+    0x002f18e7, 0x00a47be0, 0x01222efe, 0x01c42df8,
+    0x024be794, 0x03424c40, 0x036950fc, 0x04973108,
+    0x038405b4, 0x05d8c8f0, 0x05063e08, 0x070cdea0,
+    0x05812be8, 0x06da5fc8, 0x088fcd60, 0x0a013cb0,
+    0x0909a460, 0x09e6cf40, 0x0ee581d0, 0x0ec99f20,
+    0x0b4e7470, 0x0c730e80, 0x0ff39d20, 0x105d0d80,
+    0x158b0b00, 0x172babe0, 0x14576460, 0x181a6720,
+    0x26126e80, 0x1f590180, 0x1fdaad60, 0x2e0e8000
+  },
+  {
+    0x00c7f603, 0x01260cda, 0x01b3926a, 0x026d82bc,
+    0x0228fba0, 0x036ec5b0, 0x034bf4cc, 0x043a55d0,
+    0x044f9c20, 0x05c66f50, 0x0515f890, 0x06065300,
+    0x0665dc00, 0x0802b630, 0x0737a1c0, 0x087294e0,
+    0x09253fc0, 0x0a619760, 0x097bd060, 0x0a6d4e50,
+    0x0d19e520, 0x0e15c420, 0x0c4e4eb0, 0x0e8880e0,
+    0x11cdf480, 0x12c85800, 0x10f4c0a0, 0x13e51b00,
+    0x189dbaa0, 0x18a6bb60, 0x22e31500, 0x21615240
+  }
+};
+
+/*************************************************************************
+ *
+ *   FUNCTION NAME: avgGsHistQntz
+ *
+ *   PURPOSE:
+ *
+ *     Average gs history, where history is of length OVERHANG-1
+ *     frames.  The last frame's (i.e. this frame) gs values are not
+ *     available since quantization would have occured only after the
+ *     VAD decision is made.
+ *
+ *   INPUTS:
+ *
+ *     pL_GsHistory[(OVERHANG-1)*N_SUB] - the GS of the past
+ *     OVERHANG-1 frames. The GS values are stored shifted down by 2
+ *     shifts to avoid overflow (the largest GS is greater than 2.0).
+ *
+ *
+ *   OUTPUTS:
+ *
+ *     *pL_GsAvgd - the average of pL_GsHistory[], also shifted down
+ *     by two shifts.
+ *
+ *   RETURN VALUE:
+ *
+ *     none.
+ *
+ *
+ *************************************************************************/
+
+void avgGsHistQntz(Longword pL_GsHistory[], Longword *pL_GsAvgd)
+{
+
+/*_________________________________________________________________________
+ |                                                                         |
+ |                            Automatic Variables                          |
+ |_________________________________________________________________________|
+*/
+
+  int    i;
+  Longword L_avg;
+
+/*_________________________________________________________________________
+ |                                                                         |
+ |                              Executable Code                            |
+ |_________________________________________________________________________|
+*/
+
+  L_avg = L_shift_r(pL_GsHistory[0], -(OH_SHIFT + 2));
+
+  for (i = 1; i < N_SUB * (OVERHANG - 1); i++)
+    L_avg = L_add(L_shift_r(pL_GsHistory[i], -(OH_SHIFT + 2)), L_avg);
+
+  /* avg number x/32 not x/28 */
+
+  *pL_GsAvgd = L_add(L_avg, L_mpy_ls(L_avg, 0x1249));   /* L_avg *= 32/28 */
+
+}
+
+/*************************************************************************
+ *
+ *   FUNCTION NAME: gsQuant
+ *
+ *   PURPOSE:
+ *
+ *     Quantize a value of gs in any of the voicing modes.  Input GS
+ *     is a 32 bit number.  The GSP0 index is returned.
+ *
+ *   INPUTS:
+ *
+ *     L_GsIn - 32 bit GS value,  shifted down by 2 shifts.
+ *
+ *     swVoicingMode - voicing level
+ *
+ *     ppLr_gsTable[4][32] - Rom GS Table. (global), all GS values
+ *     have been shifted down by 2 from their true value.
+ *
+ *   OUTPUTS:
+ *
+ *     none
+ *
+ *   RETURN VALUE:
+ *
+ *
+ *     GSP0 Index closest to the input value of GS.
+ *
+ *
+ *************************************************************************/
+
+Shortword gsQuant(Longword L_GsIn, Shortword swVoicingMode)
+{
+
+/*_________________________________________________________________________
+ |                                                                         |
+ |                            Automatic Variables                          |
+ |_________________________________________________________________________|
+*/
+
+  Shortword swGsIndex,
+         swBestGs;
+  Longword L_diff,
+         L_min = LW_MAX;
+
+
+/*_________________________________________________________________________
+ |                                                                         |
+ |                              Executable Code                            |
+ |_________________________________________________________________________|
+*/
+
+  for (swGsIndex = 0; swGsIndex < 32; swGsIndex++)
+  {
+    L_diff = L_abs(L_sub(L_GsIn, ppLr_gsTable[swVoicingMode][swGsIndex]));
+
+    if (L_sub(L_diff, L_min) < 0)
+    {
+      /* new minimum */
+      /* ----------- */
+
+      swBestGs = swGsIndex;
+      L_min = L_diff;
+
+    }
+  }
+
+  return (swBestGs);
+
+}
+
+/*************************************************************************
+ *
+ *   FUNCTION NAME: getPnBits
+ *
+ *   PURPOSE:
+ *
+ *     Generate iBits pseudo-random bits using *pL_PNSeed as the
+ *     pn-generators seed.
+ *
+ *   INPUTS:
+ *
+ *     iBits - integer indicating how many random bits to return.
+ *     range [0,15], 0 yields 1 bit output
+ *
+ *     *pL_PNSeed - 32 bit seed (changed by function)
+ *
+ *   OUTPUTS:
+ *
+ *     *pL_PNSeed - 32 bit seed, modified.
+ *
+ *   RETURN VALUE:
+ *
+ *    random bits in iBits LSB's.
+ *
+ *
+ *   IMPLEMENTATION:
+ *
+ *    implementation of x**31 + x**3 + 1 == PN_XOR_REG | PN_XOR_ADD a
+ *    PN sequence generator using Longwords generating a 2**31 -1
+ *    length pn-sequence.
+ *
+ *************************************************************************/
+
+Shortword getPnBits(int iBits, Longword *pL_PNSeed)
+{
+
+/*_________________________________________________________________________
+ |                                                                         |
+ |                            Automatic Variables                          |
+ |_________________________________________________________________________|
+*/
+
+  Shortword swPnBits = 0;
+  Longword L_Taps,
+         L_FeedBack;
+  int    i;
+
+/*_________________________________________________________________________
+ |                                                                         |
+ |                              Executable Code                            |
+ |_________________________________________________________________________|
+*/
+
+  for (i = 0; i < iBits; i++)
+  {
+    /* update the state */
+    /* ---------------- */
+
+    L_Taps = *pL_PNSeed & PN_XOR_REG;
+    L_FeedBack = L_Taps;               /* Xor tap bits to yield
+                                        * feedback bit */
+    L_Taps = L_shr(L_Taps, 1);
+
+    while (L_Taps)
+    {
+      L_FeedBack = L_FeedBack ^ L_Taps;
+      L_Taps = L_shr(L_Taps, 1);
+    }
+
+    /* LSB of L_FeedBack is next MSB of PN register */
+
+    *pL_PNSeed = L_shr(*pL_PNSeed, 1);
+    if (L_FeedBack & 1)
+      *pL_PNSeed = *pL_PNSeed | PN_XOR_ADD;
+
+    /* State update complete.  Get the output bit from the state, add/or it
+     * into output */
+
+    swPnBits = shl(swPnBits, 1);
+    swPnBits = swPnBits | (extract_l(*pL_PNSeed) & 0x0001);
+
+  }
+  return (swPnBits);
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/libgsmhr1/dtx_rxfe.h	Thu Feb 13 03:06:11 2025 +0000
@@ -0,0 +1,18 @@
+/*
+ * This header file provides declarations for functions and data objects
+ * in dtx_rxfe.c: subset of DTX functions used by the Rx front end that
+ * operates on codec parameters only.
+ */
+
+#ifndef dtx_rxfe_h
+#define dtx_rxfe_h
+
+#include "typedefs.h"
+
+extern const LongwordRom ppLr_gsTable[4][32];
+
+void avgGsHistQntz(Longword pL_GsHistory[], Longword *pL_GsAvgd);
+Shortword gsQuant(Longword L_GsIn, Shortword swVoicingMode);
+Shortword getPnBits(int iBits, Longword *L_PnSeed);
+
+#endif	/* include guard */
--- a/libgsmhr1/namespace.list	Thu Feb 13 00:52:06 2025 +0000
+++ b/libgsmhr1/namespace.list	Thu Feb 13 03:06:11 2025 +0000
@@ -20,3 +20,5 @@
 psrQuantSz psrPreQSz psrSQuant psvqIndex ppsrSqrtP0
 ppsrCGIntFilt ppsrPVecIntFilt psrLagTbl psrR0DecTbl
 psrHPFCoefs psrNWCoefs pL_rFlatSstCoefs psrOldCont psrNewCont
+
+ppLr_gsTable avgGsHistQntz gsQuant getPnBits