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

语音压缩

开发平台:

C/C++

  1. /* Version 3.3    Last modified: December 26, 1995 */
  2. /*
  3.    ITU-T G.729 Speech Coder     ANSI-C Source Code
  4.    Copyright (c) 1995, AT&T, France Telecom, NTT, Universite de Sherbrooke.
  5.    All rights reserved.
  6. */
  7. /*-----------------------------------------------------------------*
  8.  * Main program of the ITU-T G.729  8 kbit/s decoder.              *
  9.  *                                                                 *
  10.  *    Usage : decoder  bitstream_file  synth_file                  *
  11.  *                                                                 *
  12.  *-----------------------------------------------------------------*/
  13. #include <stdlib.h>
  14. #include <stdio.h>
  15. #include "typedef.h"
  16. #include "basic_op.h"
  17. #include "ld8k.h"
  18. /*-----------------------------------------------------------------*
  19.  *            Main decoder routine                                 *
  20.  *-----------------------------------------------------------------*/
  21. int main(int argc, char *argv[] )
  22. {
  23.   Word16  synth_buf[L_FRAME+M], *synth; /* Synthesis                   */
  24.   Word16  parm[PRM_SIZE+1];             /* Synthesis parameters        */
  25.   Word16  serial[SERIAL_SIZE];          /* Serial stream               */
  26.   Word16  Az_dec[MP1*2], *ptr_Az;       /* Decoded Az for post-filter  */
  27.   Word16  T0_first;                     /* Pitch lag in 1st subframe   */
  28.   Word16  pst_out[L_FRAME];             /* Postfilter output           */
  29.   Word16  voicing;                      /* voicing from previous frame */
  30.   Word16  sf_voic;                      /* voicing for subframe        */
  31.   Word16  i, frame;
  32.   FILE   *f_syn, *f_serial;
  33.   printf("n");
  34.   printf("***********     ITU G.729 8 KBIT/S SPEECH CODER    ***********n");
  35.   printf("n");
  36.   printf("------------------- Fixed point C simulation -----------------n");
  37.   printf("n");
  38.   printf("-----------------          Version 3.3        ----------------n");
  39.   printf("n");
  40.    /* Passed arguments */
  41.    if ( argc != 3 )
  42.      {
  43.         printf("Usage :%s bitstream_file  outputspeech_filen",argv[0]);
  44.         printf("n");
  45.         printf("Format for bitstream_file:n");
  46.         printf("  One (2-byte) synchronization word,n");
  47.         printf("  One (2-byte) size word,n");
  48.         printf("  80 words (2-byte) containing 80 bits.n");
  49.         printf("n");
  50.         printf("Format for outputspeech_file:n");
  51.         printf("  Output is written to a binary file of 16 bits data.n");
  52.         exit( 1 );
  53.      }
  54.    /* Open file for synthesis and packed serial stream */
  55.    if( (f_serial = fopen(argv[1],"rb") ) == NULL )
  56.      {
  57.         printf("%s - Error opening file  %s !!n", argv[0], argv[1]);
  58.         exit(0);
  59.      }
  60.    if( (f_syn = fopen(argv[2], "wb") ) == NULL )
  61.      {
  62.         printf("%s - Error opening file  %s !!n", argv[0], argv[2]);
  63.         exit(0);
  64.      }
  65.    printf("Input bitstream file  :   %sn",argv[1]);
  66.    printf("Synthesis speech file :   %sn",argv[2]);
  67. /*-----------------------------------------------------------------*
  68.  *           Initialization of decoder                             *
  69.  *-----------------------------------------------------------------*/
  70.   for (i=0; i<M; i++) synth_buf[i] = 0;
  71.   synth = synth_buf + M;
  72.   Init_Decod_ld8k();
  73.   Init_Post_Filter();
  74.   Init_Post_Process();
  75.   voicing = 60;
  76. /*-----------------------------------------------------------------*
  77.  *            Loop for each "L_FRAME" speech data                  *
  78.  *-----------------------------------------------------------------*/
  79.   frame = 0;
  80.   while( fread(serial, sizeof(Word16), SERIAL_SIZE, f_serial) == SERIAL_SIZE)
  81.   {
  82.     bits2prm_ld8k( &serial[2], &parm[1]);
  83.     /* the hardware detects frame erasures by checking if all bits
  84.        are set to zero
  85.      */
  86.     parm[0] = 0;           /* No frame erasure */
  87.     for (i=2; i < SERIAL_SIZE; i++)
  88.       if (serial[i] == 0 ) parm[0] = 1; /* frame erased     */
  89.     /* check parity and put 1 in parm[4] if parity error */
  90.     parm[4] = Check_Parity_Pitch(parm[3], parm[4]);
  91.     Decod_ld8k(parm, voicing, synth, Az_dec, &T0_first);
  92.     /* Postfilter */
  93.     voicing = 0;
  94.     ptr_Az = Az_dec;
  95.     for(i=0; i<L_FRAME; i+=L_SUBFR) {
  96.        Post(T0_first, &synth[i], ptr_Az, &pst_out[i], &sf_voic);
  97.        if (sf_voic != 0) { voicing = sf_voic;}
  98.        ptr_Az += MP1;
  99.     }
  100.     Copy(&synth_buf[L_FRAME], &synth_buf[0], M);
  101.     Post_Process(pst_out, L_FRAME);
  102. #ifdef HARDW
  103.     {
  104.        Word16 *my_pt;
  105.        Word16 my_temp;
  106.        int my_i;
  107.        my_pt = pst_out;
  108.        for(my_i=0; my_i < L_FRAME; my_i++) {
  109.           my_temp = *my_pt;
  110.           my_temp = add( my_temp, (Word16) 4); /* rounding on 13 bit */
  111.           my_temp = my_temp & 0xFFF8; /* mask on 13 bit */
  112.           *my_pt++ = my_temp;
  113.        }
  114.     }
  115. #endif
  116.     fwrite(pst_out, sizeof(Word16), L_FRAME, f_syn);
  117.     frame++;
  118.     printf("Frame =%dr", frame);
  119.   }
  120.   return(0);
  121. }