diff host.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/host.c	Fri Jun 14 23:27:16 2024 +0000
@@ -0,0 +1,347 @@
+/***************************************************************************
+ *
+ *   File Name:  host.c
+ *
+ *   Purpose:  Contains functions for file I/O and formatting, no signal
+ *      processing.
+ *
+ *      The functions in this file are listed below.  All are level 2
+ *      fuctions, where level 0 is main(), except for fillBitAlloc() which
+ *      is level 3.  The two "Interface" routines perform truncation of the
+ *      three least significant bits of the 16 bit linear input.  The others
+ *      are simply file I/O functions and data reformatters.
+ *
+ *      fillBitAlloc()
+ *      hostEncoderInterface()
+ *      readDecfile()
+ *      speechDecoderHostInterface()
+ *      writeEncfile()
+ *
+ **************************************************************************/
+
+/*_________________________________________________________________________
+ |                                                                         |
+ |                            Include Files                                |
+ |_________________________________________________________________________|
+*/
+
+#include <stdio.h>
+#include "typedefs.h"
+
+/***************************************************************************
+ *
+ *   FUNCTION NAME: fillBitAlloc
+ *
+ *   PURPOSE:
+ *
+ *     Arrange speech parameters for encoder output
+ *
+ *   INPUTS:
+ *
+ *     The speechcoders codewords:
+ *     iR0 - Frame energy
+ *     piVqIndeces[0:2] - LPC vector quantizer codewords
+ *     iSoftInterp - Soft interpolation bit 1 or 0
+ *     iVoicing - voicing mode 0,1,2,3
+ *     piLags[0:3] - Frame and delta lag codewords
+ *     piCodeWrdsA[0:3] - VSELP codevector 1
+ *     piCodeWrdsB[0:3] - VSELP codevector 2 (n/a for voiced modes)
+ *     piGsp0s[0:3] - GSP0 codewords
+ *     swVadFlag - voice activity detection flag
+ *     swSP - Speech flag
+ *
+ *   OUTPUTS:
+ *
+ *     pswBAlloc[0:20] - an array into which the coded data is moved
+ *
+ *   RETURN VALUE:
+ *
+ *     none
+ *
+ *   REFERENCES: Sub-clause 2.1 and 4.1.12 of GSM Recomendation 06.20
+ *
+ **************************************************************************/
+
+void   fillBitAlloc(int iVoicing, int iR0, int *piVqIndeces,
+                           int iSoftInterp, int *piLags,
+                           int *piCodeWrdsA, int *piCodeWrdsB,
+                           int *piGsp0s, Shortword swVadFlag,
+                           Shortword swSP, Shortword *pswBAlloc)
+{
+
+/*_________________________________________________________________________
+ |                                                                         |
+ |                            Automatic Variables                          |
+ |_________________________________________________________________________|
+*/
+
+  int    i;
+  Shortword *pswNxt;
+
+/*_________________________________________________________________________
+ |                                                                         |
+ |                            Executable Code                              |
+ |_________________________________________________________________________|
+*/
+
+  pswNxt = pswBAlloc;
+  *pswNxt++ = iR0;
+  for (i = 0; i < 3; i++)
+    *pswNxt++ = *piVqIndeces++;
+  *pswNxt++ = iSoftInterp;
+  *pswNxt++ = iVoicing;
+
+  /* check voicing mode */
+  if (iVoicing)
+  {
+    /* voiced mode */
+    for (i = 0; i < N_SUB; i++)
+    {
+      *pswNxt++ = *piLags++;
+      *pswNxt++ = *piCodeWrdsA++;
+      *pswNxt++ = *piGsp0s++;
+    }
+  }
+  else
+  {                                    /* unvoiced frame */
+    for (i = 0; i < N_SUB; i++)
+    {
+      *pswNxt++ = *piCodeWrdsA++;
+      *pswNxt++ = *piCodeWrdsB++;
+      *pswNxt++ = *piGsp0s++;
+    }
+  }
+  *pswNxt++ = swVadFlag;
+  *pswNxt++ = swSP;
+}
+
+/***************************************************************************
+ *
+ *   FUNCTION NAME: hostEncoderInterface
+ *
+ *   PURPOSE:
+ *
+ *     Read in speech data from a file.  Zero the least significant 3 bits.
+ *
+ *
+ *   INPUTS:
+ *
+ *     pfileInSpeech
+ *                     FILE pointer to the binary input file
+ *
+ *     iNumToRead
+ *                     Number of samples to read from the file, typically
+ *                     160 (20 ms of speech).
+ *
+ *
+ *   OUTPUTS:
+ *
+ *     pswSamplesRead[]
+ *                     The speech samples read in from the file.
+ *
+ *
+ *   RETURN VALUE:
+ *
+ *     iNumRead
+ *                     The number of samples actually read.
+ *
+ *   IMPLEMENTATION:
+ *
+ *     The input speech file should be in "native" format. This means that
+ *     the file is to be read (by this program) and written (by another
+ *     program) as short ints (not chars).
+ *
+ *     If not enough samples are available in the file, the number actually
+ *     read is returned.  If the read fails to fill the requested iNumToRead
+ *     samples, then the rest are zeroed.
+ *
+ *     In all cases the least significant 3 bits of all speech samples are
+ *     zeroed.
+ *
+ *   REFERENCES: Sub-clause 4.1 of GSM Recomendation 06.20
+ *
+ *   KEYWORDS: read, read speech, get speech data
+ *
+ **************************************************************************/
+
+int    hostEncoderInterface(FILE *pfileInSpeech, int iNumToRead,
+                                   Shortword pswSamplesRead[])
+{
+
+/*_________________________________________________________________________
+ |                                                                         |
+ |                            Automatic Variables                          |
+ |_________________________________________________________________________|
+*/
+  int    iNumRead,
+         i;
+
+/*_________________________________________________________________________
+ |                                                                         |
+ |                              Executable Code                            |
+ |_________________________________________________________________________|
+*/
+
+  iNumRead = fread((char *) pswSamplesRead, sizeof (Shortword),
+                   iNumToRead, pfileInSpeech);
+
+  /* Delete the 3 LSB's - 13 bit speech input */
+  /*------------------------------------------*/
+
+  for (i = 0; i < iNumRead; i++)
+  {
+    pswSamplesRead[i] &= 0xfff8;
+  }
+
+
+  /* Fill out the iNumToRead buffer with zeroes */
+  /*--------------------------------------------*/
+
+  if (iNumRead != iNumToRead)
+  {
+    for (i = iNumRead; i < iNumToRead; i++)
+    {
+      pswSamplesRead[i] = 0;
+    }
+  }
+  return (iNumRead);
+}
+
+/***************************************************************************
+ *
+ *   FUNCTION NAME:  readDecfile
+ *
+ *   PURPOSE:
+ *      Reads decoder parameter input file
+ *
+ *   INPUT:
+ *      infile           decoder parameter input file.
+ *
+ *   OUTPUT:
+ *      pswSpeechPara    array of received 16-bit values
+ *
+ *   RETURN:
+ *      0                successfully read a complete frame of data
+ *
+ *   REFERENCES: Sub-clause 4.2 of GSM Recomendation 06.20
+ *
+ *   KEYWORDS: pswSpeechPara
+ *
+ **************************************************************************/
+
+int    readDecfile(FILE *infile, Shortword pswSpeechPara[])
+{
+  if (fread((char *) pswSpeechPara, sizeof (Shortword), 22, infile) == 0)
+    return (1);
+  else
+    return (0);
+}
+
+/***************************************************************************
+ *
+ *   FUNCTION NAME: speechDecoderHostInterface
+ *
+ *   PURPOSE:
+ *     The purpose of this function is to truncate the linear pcm and write
+ *     it into the output file
+ *
+ *   INPUTS:
+ *
+ *     F_LEN
+ *
+ *                     160 = linear pcm output frame size
+ *
+ *     pswDecodedSpeechFrame[0:F_LEN-1]
+ *
+ *                     16 bit linear pcm
+ *
+ *   OUTPUTS:
+ *
+ *     fpfileSpeechOut
+ *
+ *                     13 bit linear pcm stored to file given by this pointer
+ *
+ *   RETURN VALUE:
+ *
+ *     none
+ *
+ *   IMPLEMENTATION:
+ *
+ *   REFERENCES: Sub-clause 4.2 of GSM Recomendation 06.20
+ *
+ *   KEYWORDS: synthesis, speechdecoder, decoding, truncation
+ *
+ **************************************************************************/
+
+void   speechDecoderHostInterface(Shortword pswDecodedSpeechFrame[],
+                                         FILE *fpfileSpeechOut)
+{
+
+/*_________________________________________________________________________
+ |                                                                         |
+ |                              Local Constants                            |
+ |_________________________________________________________________________|
+*/
+
+#define  PCM_MASK     0xfff8           /* 16 to 13 bit linear PCM mask */
+
+/*_________________________________________________________________________
+ |                                                                         |
+ |                            Automatic Variables                          |
+ |_________________________________________________________________________|
+*/
+
+  short int i;
+
+/*_________________________________________________________________________
+ |                                                                         |
+ |                              Executable Code                            |
+ |_________________________________________________________________________|
+*/
+
+  /* truncate the 16 bit linear pcm to 13 bits */
+  /* ----------------------------------------- */
+
+  for (i = 0; i < F_LEN; i++)
+  {
+    pswDecodedSpeechFrame[i] = pswDecodedSpeechFrame[i] & PCM_MASK;
+  }
+
+  /* F_LEN samples of linear pcm to output file */
+  /* ------------------------------------------ */
+
+  fwrite((char *) pswDecodedSpeechFrame, sizeof (Shortword),
+         F_LEN, fpfileSpeechOut);
+}
+
+/***************************************************************************
+ *
+ *   FUNCTION NAME:  writeEncfile
+ *
+ *   PURPOSE:
+ *      Writes encoded parameters to ouput file
+ *
+ *   INPUT:
+ *      pswSpeechPara        array of encoded parameter words.
+ *
+ *   OUTPUT:
+ *      fpfileEnc        16-bit encoded values.
+ *
+ *   RETURN:
+ *      i                number of bytes written
+ *
+ *   REFERENCES: Sub-clause 4.1 of GSM Recomendation 06.20
+ *
+ *   KEYWORDS: pswSpeechPara, fpfileEnc
+ *
+ **************************************************************************
+*/
+
+int    writeEncfile(Shortword pswSpeechPara[], FILE *fpfileEnc)
+{
+  int    i;
+
+  i = fwrite((char *) pswSpeechPara, sizeof (Shortword), 20, fpfileEnc);
+
+  return (i);
+}