decodera.c
上传用户:zhouyunkk
上传日期:2013-01-10
资源大小:59k
文件大小:4k
源码类别:

语音压缩

开发平台:

C/C++

  1. /*
  2.    ITU-T G.729 Annex C - Reference C code for floating point
  3.                          implementation of G.729 Annex A
  4.                          Version 1.01 of 15.September.98
  5. */
  6. /*
  7. ----------------------------------------------------------------------
  8.                     COPYRIGHT NOTICE
  9. ----------------------------------------------------------------------
  10.    ITU-T G.729 Annex C ANSI C source code
  11.    Copyright (C) 1998, AT&T, France Telecom, NTT, University of
  12.    Sherbrooke.  All rights reserved.
  13. ----------------------------------------------------------------------
  14. */
  15. /*-----------------------------------------------------------------*
  16.  * Main program of the G.729a 8.0 kbit/s decoder.                  *
  17.  *                                                                 *
  18.  *    Usage : decoder  bitstream_file  synth_file                  *
  19.  *                                                                 *
  20.  *-----------------------------------------------------------------*/
  21. #include "typedef.h"
  22. #include "ld8a.h"
  23. int bad_lsf;        /* bad LSF indicator   */
  24. /*
  25.    This variable should be always set to zero unless transmission errors
  26.    in LSP indices are detected.
  27.    This variable is useful if the channel coding designer decides to
  28.    perform error checking on these important parameters. If an error is
  29.    detected on the  LSP indices, the corresponding flag is
  30.    set to 1 signalling to the decoder to perform parameter substitution.
  31.    (The flags should be set back to 0 for correct transmission).
  32. */
  33. static FLOAT  synth_buf[L_FRAME+M];     /* Synthesis                  */
  34. FLOAT  *synth;
  35. static FLOAT  Az_dec[MP1*2];            /* Decoded Az for post-filter */
  36. static int T2[2];                       /* Decoded Pitch              */
  37. static int parm[PRM_SIZE+1];            /* Synthesis parameters */
  38. /*-----------------------------------------------------------------*
  39.  *           Initialization of decoder                             *
  40.  *-----------------------------------------------------------------*/
  41. void va_g729a_init_decoder()
  42. {  
  43. int i;
  44. for (i=0; i<M; i++) synth_buf[i] = (F)0.0;
  45. synth = synth_buf + M;
  46. bad_lsf = 0;          /* Initialize bad LSF indicator */
  47. init_decod_ld8a();
  48. init_post_filter();
  49. init_post_process();
  50. }
  51. /*-----------------------------------------------------------------*
  52.  *            Main decoder routine                                 *
  53.  * parm buffer length 11                                           *
  54.  * synth_short buffer space length (>=L_FRAME sizeof(short) bytes) *                             *
  55.  * bad frame indicator (bfi)            *
  56.  *-----------------------------------------------------------------*/
  57. void va_g729a_decoder(unsigned char * bitstream, short *synth_short, int bfi)
  58. {
  59.     int  i; 
  60.     FLOAT temp;
  61.     bits2prm_ld8k(bitstream, &parm[0]);
  62. parm[3] = check_parity_pitch(parm[2], parm[3] ); /* get parity check result */
  63. decod_ld8a(parm, synth, Az_dec, T2, bfi);             /* decoder */
  64. post_filter(synth, Az_dec, T2);                  /* Post-filter */
  65. post_process(synth, L_FRAME);                    /* Highpass filter */
  66. /*---------------------------------------------------------------*
  67.      * writes a FLOAT array as a Short to a output buf    *
  68.      *---------------------------------------------------------------*/
  69. for(i=0; i < L_FRAME; i++)
  70.     {
  71. /* round and convert to int  */
  72.         temp = synth[i];
  73.         if (temp >= (F)0.0)
  74. temp += (F)0.5;
  75.         else  temp -= (F)0.5;
  76.         if (temp >  (F)32767.0 ) temp =  (F)32767.0;
  77.         if (temp < (F)-32768.0 ) temp = (F)-32768.0;
  78.         synth_short[i] = (INT16) temp;
  79.     }
  80. }