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

语音压缩

开发平台:

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 : TAMING.C
  17.  Used for the floating point version of both
  18.  G.729 main body and G.729A
  19. */
  20. /**************************************************************************
  21.  * Taming functions.                                                      *
  22.  **************************************************************************/
  23. #include "typedef.h"
  24. #include "version.h"
  25. #ifdef VER_G729A
  26.  #include "ld8a.h"
  27. #else
  28.  #include "ld8k.h"
  29. #endif
  30. static FLOAT exc_err[4];
  31. void init_exc_err(void)
  32. {
  33.   int i;
  34.   for(i=0; i<4; i++) exc_err[i] = (FLOAT)1.;
  35.   return;
  36. }
  37. /**************************************************************************
  38.  * routine test_err - computes the accumulated potential error in the     *
  39.  * adaptive codebook contribution                                         *
  40.  **************************************************************************/
  41. int test_err( /* (o) flag set to 1 if taming is necessary  */
  42. int t0,       /* (i) integer part of pitch delay           */
  43. int t0_frac   /* (i) fractional part of pitch delay        */
  44. )
  45. {
  46.     int i, t1, zone1, zone2, flag;
  47.     FLOAT maxloc;
  48.     t1 = (t0_frac > 0) ? (t0+1) : t0;
  49.     i = t1 - L_SUBFR - L_INTER10;
  50.     if(i < 0) i = 0;
  51.     zone1 = (int) ( (FLOAT)i * INV_L_SUBFR);
  52.     i = t1 + L_INTER10 - 2;
  53.     zone2 = (int)( (FLOAT)i * INV_L_SUBFR);
  54.     maxloc = (FLOAT)-1.;
  55.     flag = 0 ;
  56.     for(i=zone2; i>=zone1; i--) {
  57.         if(exc_err[i] > maxloc) maxloc = exc_err[i];
  58.     }
  59.     if(maxloc > THRESH_ERR) {
  60.         flag = 1;
  61.     }
  62.     return(flag);
  63. }
  64. /**************************************************************************
  65.  *routine update_exc_err - maintains the memory used to compute the error *
  66.  * function due to an adaptive codebook mismatch between encoder and      *
  67.  * decoder                                                                *
  68.  **************************************************************************/
  69. void update_exc_err(
  70.  FLOAT gain_pit,      /* (i) pitch gain */
  71.  int t0             /* (i) integer part of pitch delay */
  72. )
  73. {
  74.     int i, zone1, zone2, n;
  75.     FLOAT worst, temp;
  76.     worst = (FLOAT)-1.;
  77.     n = t0- L_SUBFR;
  78.     if(n < 0) {
  79.         temp = (FLOAT)1. + gain_pit * exc_err[0];
  80.         if(temp > worst) worst = temp;
  81.         temp = (FLOAT)1. + gain_pit * temp;
  82.         if(temp > worst) worst = temp;
  83.     }
  84.     else {
  85.         zone1 = (int) ((FLOAT)n * INV_L_SUBFR);
  86.         i = t0 - 1;
  87.         zone2 = (int)((FLOAT)i * INV_L_SUBFR);
  88.         for(i = zone1; i <= zone2; i++) {
  89.             temp = (FLOAT)1. + gain_pit * exc_err[i];
  90.             if(temp > worst) worst = temp;
  91.         }
  92.     }
  93.     for(i=3; i>=1; i--) exc_err[i] = exc_err[i-1];
  94.     exc_err[0] = worst;
  95.     return;
  96. }