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

语音压缩

开发平台:

C/C++

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