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

语音压缩

开发平台:

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.  *  Function  Decod_ACELP()                                  *
  10.  *  ~~~~~~~~~~~~~~~~~~~~~~~                                  *
  11.  *   Algebraic codebook decoder.                             *
  12.  *----------------------------------------------------------*/
  13. #include "typedef.h"
  14. #include "basic_op.h"
  15. #include "ld8a.h"
  16. void Decod_ACELP(
  17.   Word16 sign,      /* (i)     : signs of 4 pulses.                       */
  18.   Word16 index,     /* (i)     : Positions of the 4 pulses.               */
  19.   Word16 cod[]      /* (o) Q13 : algebraic (fixed) codebook excitation    */
  20. )
  21. {
  22.   Word16 i, j;
  23.   Word16 pos[4];
  24.   /* Decode the positions */
  25.   i      = index & (Word16)7;
  26.   pos[0] = add(i, shl(i, 2));           /* pos0 =i*5 */
  27.   index  = shr(index, 3);
  28.   i      = index & (Word16)7;
  29.   i      = add(i, shl(i, 2));           /* pos1 =i*5+1 */
  30.   pos[1] = add(i, 1);
  31.   index  = shr(index, 3);
  32.   i      = index & (Word16)7;
  33.   i      = add(i, shl(i, 2));           /* pos2 =i*5+1 */
  34.   pos[2] = add(i, 2);
  35.   index  = shr(index, 3);
  36.   j      = index & (Word16)1;
  37.   index  = shr(index, 1);
  38.   i      = index & (Word16)7;
  39.   i      = add(i, shl(i, 2));           /* pos3 =i*5+3+j */
  40.   i      = add(i, 3);
  41.   pos[3] = add(i, j);
  42.   /* decode the signs  and build the codeword */
  43.   for (i=0; i<L_SUBFR; i++) {
  44.     cod[i] = 0;
  45.   }
  46.   for (j=0; j<4; j++)
  47.   {
  48.     i = sign & (Word16)1;
  49.     sign = shr(sign, 1);
  50.     if (i != 0) {
  51.       cod[pos[j]] = 8191;      /* Q13 +1.0 */
  52.     }
  53.     else {
  54.       cod[pos[j]] = -8192;     /* Q13 -1.0 */
  55.     }
  56.   }
  57.   return;
  58. }