DECODER.C
上传用户:meifeng08
上传日期:2013-06-18
资源大小:5304k
文件大小:5k
源码类别:

语音压缩

开发平台:

C/C++

  1. /*
  2.    ITU-T G.729A Speech Coder    ANSI-C Source Code
  3.    Version 1.1    Last modified: September 1996
  4.    Copyright (c) 1996,
  5.    AT&T, France Telecom, NTT, Universite de Sherbrooke
  6.    All rights reserved.
  7. */
  8. /*-----------------------------------------------------------------*
  9.  * Main program of the G.729a 8.0 kbit/s decoder.                  *
  10.  *                                                                 *
  11.  *    Usage : decoder  bitstream_file  synth_file                  *
  12.  *                                                                 *
  13.  *-----------------------------------------------------------------*/
  14. #include <stdlib.h>
  15. #include <stdio.h>
  16. #include "typedef.h"
  17. #include "basic_op.h"
  18. #include "ld8a.h"
  19.  Word16 bad_lsf;        /* bad LSF indicator   */
  20. /*
  21.    This variable should be always set to zero unless transmission errors
  22.    in LSP indices are detected.
  23.    This variable is useful if the channel coding designer decides to
  24.    perform error checking on these important parameters. If an error is
  25.    detected on the  LSP indices, the corresponding flag is
  26.    set to 1 signalling to the decoder to perform parameter substitution.
  27.    (The flags should be set back to 0 for correct transmission).
  28. */
  29. /*-----------------------------------------------------------------*
  30.  *            Main decoder routine                                 *
  31.  *-----------------------------------------------------------------*/
  32. int main(int argc, char *argv[] )
  33. {
  34.   Word16  synth_buf[L_FRAME+M], *synth; /* Synthesis                   */
  35.   Word16  parm[PRM_SIZE+1];             /* Synthesis parameters        */
  36.   Word16  serial[SERIAL_SIZE];          /* Serial stream               */
  37.   Word16  Az_dec[MP1*2];                /* Decoded Az for post-filter  */
  38.   Word16  T2[2];                        /* Pitch lag for 2 subframes   */
  39.   Word16  i, frame;
  40.   FILE   *f_syn, *f_serial;
  41.   printf("n");
  42.   printf("************   G.729a 8.0 KBIT/S SPEECH DECODER  ************n");
  43.   printf("n");
  44.   printf("------------------- Fixed point C simulation ----------------n");
  45.   printf("n");
  46.   printf("-----------------          Version 1.1        ---------------n");
  47.   printf("n");
  48.    /* Passed arguments */
  49.    if ( argc != 3)
  50.      {
  51.         printf("Usage :%s bitstream_file  outputspeech_filen",argv[0]);
  52.         printf("n");
  53.         printf("Format for bitstream_file:n");
  54.         printf("  One (2-byte) synchronization word n");
  55.         printf("  One (2-byte) size word,n");
  56.         printf("  80 words (2-byte) containing 80 bits.n");
  57.         printf("n");
  58.         printf("Format for outputspeech_file:n");
  59.         printf("  Synthesis is written to a binary file of 16 bits data.n");
  60.         exit( 1 );
  61.      }
  62.    /* Open file for synthesis and packed serial stream */
  63.    if( (f_serial = fopen(argv[1],"rb") ) == NULL )
  64.      {
  65.         printf("%s - Error opening file  %s !!n", argv[0], argv[1]);
  66.         exit(0);
  67.      }
  68.    if( (f_syn = fopen(argv[2], "wb") ) == NULL )
  69.      {
  70.         printf("%s - Error opening file  %s !!n", argv[0], argv[2]);
  71.         exit(0);
  72.      }
  73.    printf("Input bitstream file  :   %sn",argv[1]);
  74.    printf("Synthesis speech file :   %sn",argv[2]);
  75. /*-----------------------------------------------------------------*
  76.  *           Initialization of decoder                             *
  77.  *-----------------------------------------------------------------*/
  78.   for (i=0; i<M; i++) synth_buf[i] = 0;
  79.   synth = synth_buf + M;
  80.   bad_lsf = 0;          /* Initialize bad LSF indicator */
  81.   Init_Decod_ld8a();
  82.   Init_Post_Filter();
  83.   Init_Post_Process();
  84. /*-----------------------------------------------------------------*
  85.  *            Loop for each "L_FRAME" speech data                  *
  86.  *-----------------------------------------------------------------*/
  87.   frame = 0;
  88.   while( fread(serial, sizeof(Word16), SERIAL_SIZE, f_serial) == SERIAL_SIZE)
  89.   {
  90.     printf("Frame =%dr", frame++);
  91.     bits2prm_ld8k( &serial[2], &parm[1]);
  92.     /* the hardware detects frame erasures by checking if all bits
  93.        are set to zero
  94.      */
  95.     parm[0] = 0;           /* No frame erasure */
  96.     for (i=2; i < SERIAL_SIZE; i++)
  97.       if (serial[i] == 0 ) parm[0] = 1; /* frame erased     */
  98.     /* check pitch parity and put 1 in parm[4] if parity error */
  99.     parm[4] = Check_Parity_Pitch(parm[3], parm[4]);
  100.     Decod_ld8a(parm, synth, Az_dec, T2);
  101.     Post_Filter(synth, Az_dec, T2);        /* Post-filter */
  102.     Post_Process(synth, L_FRAME);
  103.     fwrite(synth, sizeof(short), L_FRAME, f_syn);
  104.   }
  105.   return(0);
  106. }