DEC_LAG3.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 Dec_lag3                                                   *
  10.  *             ~~~~~~~~                                                   *
  11.  *   Decoding of fractional pitch lag with 1/3 resolution.                *
  12.  * See "Enc_lag3.c" for more details about the encoding procedure.        *
  13.  *------------------------------------------------------------------------*/
  14. #include "typedef.h"
  15. #include "basic_op.h"
  16. #include "ld8a.h"
  17. void Dec_lag3(
  18.   Word16 index,       /* input : received pitch index           */
  19.   Word16 pit_min,     /* input : minimum pitch lag              */
  20.   Word16 pit_max,     /* input : maximum pitch lag              */
  21.   Word16 i_subfr,     /* input : subframe flag                  */
  22.   Word16 *T0,         /* output: integer part of pitch lag      */
  23.   Word16 *T0_frac     /* output: fractional part of pitch lag   */
  24. )
  25. {
  26.   Word16 i;
  27.   Word16 T0_min, T0_max;
  28.   if (i_subfr == 0)                  /* if 1st subframe */
  29.   {
  30.     if (sub(index, 197) < 0)
  31.     {
  32.       /* *T0 = (index+2)/3 + 19 */
  33.       *T0 = add(mult(add(index, 2), 10923), 19);
  34.       /* *T0_frac = index - *T0*3 + 58 */
  35.       i = add(add(*T0, *T0), *T0);
  36.       *T0_frac = add(sub(index, i), 58);
  37.     }
  38.     else
  39.     {
  40.       *T0 = sub(index, 112);
  41.       *T0_frac = 0;
  42.     }
  43.   }
  44.   else  /* second subframe */
  45.   {
  46.     /* find T0_min and T0_max for 2nd subframe */
  47.     T0_min = sub(*T0, 5);
  48.     if (sub(T0_min, pit_min) < 0)
  49.     {
  50.       T0_min = pit_min;
  51.     }
  52.     T0_max = add(T0_min, 9);
  53.     if (sub(T0_max, pit_max) > 0)
  54.     {
  55.       T0_max = pit_max;
  56.       T0_min = sub(T0_max, 9);
  57.     }
  58.     /* i = (index+2)/3 - 1 */
  59.     /* *T0 = i + t0_min;    */
  60.     i = sub(mult(add(index, 2), 10923), 1);
  61.     *T0 = add(i, T0_min);
  62.     /* t0_frac = index - 2 - i*3; */
  63.     i = add(add(i, i), i);
  64.     *T0_frac = sub(sub(index, 2), i);
  65.   }
  66.   return;
  67. }