diff homing.c @ 0:9008dbc8ca74

import original C code from GSM 06.06
author Mychaela Falconia <falcon@freecalypso.org>
date Fri, 14 Jun 2024 23:27:16 +0000
parents
children
line wrap: on
line diff
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/homing.c	Fri Jun 14 23:27:16 2024 +0000
@@ -0,0 +1,648 @@
+/**************************************************************************
+ *
+ *   File Name:  homing.c
+ *
+ *   Purpose:
+ *      This file contains the following functions:
+ *
+ *      decoderHomingFrameTest() - checks if a frame of input speech
+ *                                 parameters matches the Decoder Homing
+ *                                 Frame pattern.
+ *
+ *      decoderReset() - called by resetDec() to reset all of the state
+ *                       variables for the decoder
+ *
+ *      encoderHomingFrameTest() - checks if a frame of input samples
+ *                                 matches the Encoder Homing Frame pattern.
+ *
+ *      encoderReset() - called by resetEnc() to reset all the state
+ *                       variables for the encoder.
+ *
+ *      resetDec() - calls functions to reset the state variables for the
+ *                   decoder, and for the receive DTX and Comfort Noise.
+ *
+ *      resetEnc() - calls functions to reset the state variables for the
+ *                   encoder and VAD, and for the transmit DTX and
+ *                   Comfort Noise.
+ *
+ *      dtxResetTx() - called by resetEnc() to reset all of the transmit
+ *                     DTX and Comfort Noise state variables
+ *
+ *      dtxResetRx() - called by resetDec() to reset all of the receive
+ *                     DTX and Comfort Noise state variables
+ *
+ **************************************************************************/
+
+/*_________________________________________________________________________
+ |                                                                         |
+ |                              Include Files                              |
+ |_________________________________________________________________________|
+*/
+
+#include "typedefs.h"
+#include "vad.h"
+#include "dtx.h"
+#include "homing.h"
+
+/*_________________________________________________________________________
+ |                                                                         |
+ |                              Local Defines                              |
+ |_________________________________________________________________________|
+*/
+
+#define EHF_MASK 0x0008                /* Encoder Homing Frame pattern */
+#define LMAX 142                       /* largest lag (integer sense) */
+#define CG_INT_MACS 6                  /* Number of multiply-accumulates in
+                                        * one interpolation           */
+#define NUM_CLOSED 3                   /* maximum number of lags searched */
+#define LPCSTARTINDEX 25               /* where the LPC analysis window
+                                        * starts                        */
+#define INBUFFSZ LPCSTARTINDEX + A_LEN /* input buffer size */
+
+
+#define LTP_LEN         147            /* maximum ltp lag */
+#define LSMAX           (LMAX + CG_INT_MACS/2)
+#define HNW_BUFF_LEN    LSMAX
+
+
+/***************************************************************************
+ *
+ *   FUNCTION NAME:  decoderHomingFrameTest
+ *
+ *   PURPOSE:
+ *      Checks if a frame of input speech parameters matches the Decoder
+ *      Homing Frame pattern, which is:
+ *
+ *      parameter  decimal value  hexidecimal value
+ *      ---------  -------------  -----------------
+ *      R0         0              0x0000
+ *      LPC1       881            0x0371
+ *      LPC2       350            0x015E
+ *      LPC3       195            0x00c3
+ *      INT_LPC    1              0x0001
+ *      MODE       0              0x0000
+ *      CODE1_1    71             0x0047
+ *      CODE2_1    74             0x004a
+ *      GSP0_1     0              0x0000
+ *      CODE1_2    9              0x0009
+ *      CODE2_2    38             0x0026
+ *      GSP0_2     7              0x0007
+ *      CODE1_3    0              0x0000
+ *      CODE2_3    0              0x0000
+ *      GSP0_3     0              0x0000
+ *      CODE1_4    0              0x0000
+ *      CODE2_4    0              0x0000
+ *      GSP0_4     0              0x0000
+ *
+ *   INPUT:
+ *      pswSpeechPara[] - one frame of speech parameters
+ *                        in decoder input format
+ *
+ *      iLastPara - the number of consecutive parameters in 
+ *                  pswSpeechPara[] to match.
+ *
+ *   OUTPUT:
+ *      None
+ *
+ *   RETURN:
+ *      0       input frame does not match the Decoder Homing Frame pattern.
+ *      1       input frame matches the Decoder Homing Frame pattern.
+ *
+ *   REFERENCES: Sub-clause 10 of GSM Recomendation 06.02
+ *
+ *   KEYWORDS:
+ *      pswSpeechPara
+ **************************************************************************/
+
+int    decoderHomingFrameTest(Shortword pswSpeechPara[], int iLastPara)
+{
+  /* the n[] array contains the number of bits in each speech parameter */
+  static int n[] = {5, 11, 9, 8, 1, 2, 7, 7, 5, 7, 7, 5, 7, 7, 5, 7, 7, 5};
+
+  static Shortword dhf_mask[] =
+  {
+    0x0000,                            /* R0      */
+    0x0371,                            /* LPC1    */
+    0x015E,                            /* LPC2    */
+    0x00c3,                            /* LPC3    */
+    0x0001,                            /* INT_LPC */
+    0x0000,                            /* MODE    */
+    0x0047,                            /* CODE1_1 */
+    0x004a,                            /* CODE2_1 */
+    0x0000,                            /* GSP0_1  */
+    0x0009,                            /* CODE1_2 */
+    0x0026,                            /* CODE2_2 */
+    0x0007,                            /* GSP0_2  */
+    0x0000,                            /* CODE1_3 */
+    0x0000,                            /* CODE2_3 */
+    0x0000,                            /* GSP0_3  */
+    0x0000,                            /* CODE1_4 */
+    0x0000,                            /* CODE2_4 */
+    0x0000                             /* GSP0_4  */
+  };
+
+  int    i;
+  int    j;
+
+  for (i = 0; i < iLastPara; i++)
+  {
+    j = ((pswSpeechPara[i] & ~(~0 << n[i])) ^ dhf_mask[i]);
+    if (j)
+      break;
+  }
+
+  return !j;
+}
+
+
+/***************************************************************************
+ *
+ *   FUNCTION NAME:  decoderReset
+ *
+ *   PURPOSE:
+ *      resets all of the state variables for the decoder
+ *
+ *   INPUT:
+ *      None
+ *
+ *   OUTPUT:
+ *      None
+ *
+ *   RETURN:
+ *      None
+ *
+ *   REFERENCES: Sub-clause 10 of GSM Recomendation 06.02
+ *
+ *   KEYWORDS:
+ **************************************************************************/
+
+void   decoderReset(void)
+{
+/*_________________________________________________________________________
+ |                                                                         |
+ |   External declarations for decoder variables which need to be reset    |
+ |_________________________________________________________________________|
+*/
+
+  /* variables defined in sp_dec.c */
+  /* ----------------------------- */
+
+  extern Shortword gswPostFiltAgcGain,
+         gpswPostFiltStateNum[NP],
+         gpswPostFiltStateDenom[NP],
+         swPostEmphasisState,
+         pswSynthFiltState[NP],
+         pswOldFrmKsDec[NP],
+         pswOldFrmAsDec[NP],
+         pswOldFrmPFNum[NP],
+         pswOldFrmPFDenom[NP],
+         swOldR0Dec,
+         pswLtpStateBaseDec[LTP_LEN + S_LEN],
+         pswPPreState[LTP_LEN + S_LEN];
+
+  extern Shortword swMuteFlagOld;      /* error concealment */
+
+
+  /* variables defined in err_conc.c *//* error concealment */
+  /* ------------------------------- *//* error concealment */
+
+  extern Longword plSubfrEnergyMem[4]; /* error concealment */
+  extern Shortword swLevelMem[4],
+         lastR0,                       /* error concealment */
+         pswLastGood[18],              /* error concealment */
+         swState,
+         swLastFlag;                   /* error concealment */
+
+/*_________________________________________________________________________
+ |                                                                         |
+ |   Automatic Variables                                                   |
+ |_________________________________________________________________________|
+*/
+
+  int    i;
+
+/*_________________________________________________________________________
+ |                                                                         |
+ |   Executable code                                                       |
+ |_________________________________________________________________________|
+*/
+
+  /* reset all the decoder state variables */
+  /* ------------------------------------- */
+
+  swOldR0Dec = 0;
+
+  gswPostFiltAgcGain = 0;
+
+  swPostEmphasisState = 0;
+
+  for (i = 0; i < NP; i++)
+  {
+    gpswPostFiltStateNum[i] = 0;
+    gpswPostFiltStateDenom[i] = 0;
+    pswSynthFiltState[i] = 0;
+    pswOldFrmKsDec[i] = 0;
+    pswOldFrmAsDec[i] = 0;
+    pswOldFrmPFNum[i] = 0;
+    pswOldFrmPFDenom[i] = 0;
+  }
+
+  for (i = 0; i < (LTP_LEN + S_LEN); i++)
+  {
+    pswLtpStateBaseDec[i] = 0;
+    pswPPreState[i] = 0;
+  }
+
+
+  /* reset all the error concealment state variables */
+  /* ----------------------------------------------- */
+
+  swMuteFlagOld = 0;
+
+  lastR0 = 0;
+  swState = 7;
+  swLastFlag = 0;
+  for (i = 0; i < 3; i++)
+  {
+    plSubfrEnergyMem[i] = 80;
+    swLevelMem[i] = -72;
+  }
+  for (i = 0; i < 18; i++)
+  {
+    pswLastGood[i] = 0;
+  }
+
+
+}
+
+/***************************************************************************
+ *
+ *   FUNCTION NAME:  encoderHomingFrameTest
+ *
+ *   PURPOSE:
+ *      Checks if a frame of input samples matches the Encoder Homing Frame
+ *      pattern, which is 0x0008 for all 160 samples in the frame.
+ *
+ *   INPUT:
+ *      pswSpeech[]    one frame of speech samples
+ *
+ *   OUTPUT:
+ *      None
+ *
+ *   RETURN:
+ *      0       input frame does not match the Encoder Homing Frame pattern.
+ *      1       input frame matches the Encoder Homing Frame pattern.
+ *
+ *   REFERENCES: Sub-clause 10 of GSM Recomendation 06.02
+ *
+ *   KEYWORDS:
+ *      pswSpeech
+ **************************************************************************/
+
+int    encoderHomingFrameTest(Shortword pswSpeech[])
+{
+  int    i;
+  Shortword j;
+
+  for (i = 0; i < F_LEN; i++)
+  {
+    j = pswSpeech[i] ^ EHF_MASK;
+    if (j)
+      break;
+  }
+
+  return !j;
+}
+
+/***************************************************************************
+ *
+ *   FUNCTION NAME:  encoderReset
+ *
+ *   PURPOSE:
+ *      resets all of the state variables for the encoder
+ *
+ *   INPUT:
+ *      None
+ *
+ *   OUTPUT:
+ *      None
+ *
+ *   RETURN:
+ *      None
+ *
+ *   REFERENCES: Sub-clause 10 of GSM Recomendation 06.02
+ *
+ *   KEYWORDS:
+ **************************************************************************/
+
+void   encoderReset(void)
+{
+
+/*_________________________________________________________________________
+ |                                                                         |
+ |   External declarations for encoder variables which need to be reset    |
+ |_________________________________________________________________________|
+*/
+
+  /* variables defined in sp_enc.c */
+  /* ----------------------------- */
+
+  extern Shortword swOldR0;
+  extern Shortword swOldR0Index;
+
+  extern struct NormSw psnsWSfrmEngSpace[];
+
+  extern Shortword pswHPFXState[];
+  extern Shortword pswHPFYState[];
+  extern Shortword pswOldFrmKs[];
+  extern Shortword pswOldFrmAs[];
+  extern Shortword pswOldFrmSNWCoefs[];
+  extern Shortword pswWgtSpeechSpace[];
+
+  extern Shortword pswSpeech[];        /* input speech */
+
+  extern Shortword swPtch;
+
+
+  /* variables defined in sp_frm.c */
+  /* ----------------------------- */
+
+  extern Shortword pswAnalysisState[NP];
+
+  extern Shortword pswWStateNum[NP],
+         pswWStateDenom[NP];
+
+
+  /* variables defined in sp_sfrm.c */
+  /* ------------------------------ */
+
+  extern Shortword pswLtpStateBase[LTP_LEN + S_LEN];
+  extern Shortword pswHState[NP];
+  extern Shortword pswHNWState[HNW_BUFF_LEN];
+
+/*_________________________________________________________________________
+ |                                                                         |
+ |   Automatic Variables                                                   |
+ |_________________________________________________________________________|
+*/
+
+  int    i;
+
+/*_________________________________________________________________________
+ |                                                                         |
+ |   Executable code                                                       |
+ |_________________________________________________________________________|
+*/
+
+  /* reset all the encoder state variables */
+  /* ------------------------------------- */
+
+  swOldR0Index = 0;
+  swOldR0 = 0;
+
+  for (i = 0; i < 2 * N_SUB; i++)
+  {
+    psnsWSfrmEngSpace[i].man = 0;
+    psnsWSfrmEngSpace[i].sh = 0;
+  }
+
+  for (i = 0; i < 4; i++)
+    pswHPFXState[i] = 0;
+
+  for (i = 0; i < 8; i++)
+    pswHPFYState[i] = 0;
+
+  for (i = 0; i < NP; i++)
+  {
+    pswOldFrmKs[i] = 0;
+    pswOldFrmAs[i] = 0;
+    pswOldFrmSNWCoefs[i] = 0;
+    pswAnalysisState[i] = 0;
+    pswWStateNum[i] = 0;
+    pswWStateDenom[i] = 0;
+    pswHState[i] = 0;
+  }
+
+  for (i = 0; i < (F_LEN + LMAX + CG_INT_MACS / 2); i++)
+    pswWgtSpeechSpace[i] = 0;
+
+  for (i = 0; i < INBUFFSZ; i++)
+    pswSpeech[i] = 0;
+
+  for (i = 0; i < (LTP_LEN + S_LEN); i++)
+    pswLtpStateBase[i] = 0;
+
+  for (i = 0; i < HNW_BUFF_LEN; i++)
+    pswHNWState[i] = 0;
+
+  swPtch = 1;
+}
+
+/***************************************************************************
+ *
+ *   FUNCTION NAME:  resetDec
+ *
+ *   PURPOSE:
+ *      resets all of the state variables for the decoder, and for the
+ *      receive DTX and Comfort Noise.
+ *
+ *   INPUT:
+ *      None
+ *
+ *   OUTPUT:
+ *      None
+ *
+ *   RETURN:
+ *      None
+ *
+ *   REFERENCES: Sub-clause 10 of GSM Recomendation 06.02
+ *
+ *   KEYWORDS:
+ **************************************************************************/
+
+void   resetDec(void)
+{
+  decoderReset();                      /* reset all the state variables in
+                                        * the speech decoder */
+  dtxResetRx();                        /* reset all the receive DTX and CN
+                                        * state variables */
+}
+
+/***************************************************************************
+ *
+ *   FUNCTION NAME:  resetEnc
+ *
+ *   PURPOSE:
+ *      resets all of the state variables for the encoder and VAD, and for
+ *      the transmit DTX and Comfort Noise.
+ *
+ *   INPUT:
+ *      None
+ *
+ *   OUTPUT:
+ *      None
+ *
+ *   RETURN:
+ *      None
+ *
+ *   REFERENCES: Sub-clause 10 of GSM Recomendation 06.02
+ *
+ *   KEYWORDS:
+ **************************************************************************/
+
+void   resetEnc(void)
+{
+
+  encoderReset();                      /* reset all the state variables in
+                                        * the speech encoder */
+  vad_reset();                         /* reset all the VAD state variables */
+
+  dtxResetTx();                        /* reset all the transmit DTX and CN
+                                        * state variables */
+}
+
+/***************************************************************************
+ *
+ *   FUNCTION NAME:  dtxResetTx
+ *
+ *   PURPOSE:
+ *      reset all the transmit DTX and CN state variables
+ *
+ *   INPUT:
+ *      None
+ *
+ *   OUTPUT:
+ *      None
+ *
+ *   RETURN:
+ *      None
+ *
+ *   REFERENCES: Sub-clause 10 of GSM Recomendation 06.02
+ *
+ *   KEYWORDS:
+ **************************************************************************/
+
+void   dtxResetTx(void)
+{
+
+/*_________________________________________________________________________
+ |                                                                         |
+ |   External declarations for encoder variables which need to be reset    |
+ |_________________________________________________________________________|
+*/
+
+  /* variables defined in sp_enc.c */
+  /* ----------------------------- */
+
+  extern Shortword swTxGsHistPtr;
+
+
+  /* variables defined in dtx.c */
+  /* -------------------------- */
+
+  extern Shortword swVadFrmCnt;        /* Indicates the number of sequential
+                                        * frames where VAD == 0 */
+  extern short int siUpdPointer;
+  extern Shortword swNElapsed;
+
+/*_________________________________________________________________________
+ |                                                                         |
+ |   Automatic Variables                                                   |
+ |_________________________________________________________________________|
+*/
+
+
+/*_________________________________________________________________________
+ |                                                                         |
+ |   Executable code                                                       |
+ |_________________________________________________________________________|
+*/
+
+  /* reset all the transmit DTX and CN state variables */
+  /* ------------------------------------------------- */
+
+  swTxGsHistPtr = 0;
+
+  swVadFrmCnt = 0;
+
+  siUpdPointer = 0;
+
+  swNElapsed = 50;
+
+}
+
+/***************************************************************************
+ *
+ *   FUNCTION NAME:  dtxResetRx
+ *
+ *   PURPOSE:
+ *      reset all the receive DTX and CN state variables
+ *
+ *   INPUT:
+ *      None
+ *
+ *   OUTPUT:
+ *      None
+ *
+ *   RETURN:
+ *      None
+ *
+ *   REFERENCES: Sub-clause 10 of GSM Recomendation 06.02
+ *
+ *   KEYWORDS:
+ **************************************************************************/
+
+void   dtxResetRx(void)
+{
+
+/*_________________________________________________________________________
+ |                                                                         |
+ |   External declarations for encoder variables which need to be reset    |
+ |_________________________________________________________________________|
+*/
+
+  /* variables defined in sp_dec.c */
+  /* ----------------------------- */
+
+  extern Shortword swRxDTXState;
+  extern Shortword swDecoMode;
+  extern Shortword swDtxMuting;
+  extern Shortword swDtxBfiCnt;
+
+  extern Shortword swOldR0IndexDec;
+
+  extern Shortword swRxGsHistPtr;
+  extern Longword pL_RxGsHist[(OVERHANG - 1) * N_SUB];
+
+
+/*_________________________________________________________________________
+ |                                                                         |
+ |   Automatic Variables                                                   |
+ |_________________________________________________________________________|
+*/
+
+  int    i;
+
+
+/*_________________________________________________________________________
+ |                                                                         |
+ |   Executable code                                                       |
+ |_________________________________________________________________________|
+*/
+
+  /* reset all the receive DTX and CN state variables */
+  /* ------------------------------------------------ */
+
+  swRxDTXState = CNINTPER - 1;
+  swDecoMode = SPEECH;
+  swDtxMuting = 0;
+  swDtxBfiCnt = 0;
+
+  swOldR0IndexDec = 0;
+
+  swRxGsHistPtr = 0;
+
+  for (i = 0; i < (OVERHANG - 1) * N_SUB; i++)
+    pL_RxGsHist[i] = 0;
+
+}