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

语音压缩

开发平台:

C/C++

  1. /*
  2.    ITU-T G.729 Annex C - Reference C code for floating point
  3.                          implementation of G.729
  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.  File : DE_ACELP.C
  17.  Used for the floating point version of both
  18.  G.729 main body and G.729A
  19. */
  20. #include "typedef.h"
  21. #include "version.h"
  22. #ifdef VER_G729A
  23.  #include "ld8a.h"
  24. #else
  25.  #include "ld8k.h"
  26. #endif
  27. /*-----------------------------------------------------------*
  28.  *  Function  decod_ACELP()                                  *
  29.  *  ~~~~~~~~~~~~~~~~~~~~~~~                                  *
  30.  *   Algebraic codebook decoder.                             *
  31.  *----------------------------------------------------------*/
  32. void decod_ACELP(
  33.  int sign,              /* input : signs of 4 pulses     */
  34.  int index,             /* input : positions of 4 pulses */
  35.  FLOAT cod[]            /* output: innovative codevector */
  36. )
  37. {
  38.    int pos[4];
  39.    int i, j;
  40.    /* decode the positions of 4 pulses */
  41.    i = index & 7;
  42.    pos[0] = i*5;
  43.    index >>= 3;
  44.    i = index & 7;
  45.    pos[1] = i*5 + 1;
  46.    index >>= 3;
  47.    i = index & 7;
  48.    pos[2] = i*5 + 2;
  49.    index >>= 3;
  50.    j = index & 1;
  51.    index >>= 1;
  52.    i = index & 7;
  53.    pos[3] = i*5 + 3 + j;
  54.    /* find the algebraic codeword */
  55.    for (i = 0; i < L_SUBFR; i++) cod[i] = 0;
  56.    /* decode the signs of 4 pulses */
  57.    for (j=0; j<4; j++)
  58.    {
  59.      i = sign & 1;
  60.      sign >>= 1;
  61.      if (i != 0) {
  62.        cod[pos[j]] = (F)1.0;
  63.      }
  64.      else {
  65.        cod[pos[j]] = (F)-1.0;
  66.      }
  67.    }
  68.    return;
  69. }