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

语音压缩

开发平台:

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.  * Taming functions.                                                      *
  10.  **************************************************************************/
  11. #include "typedef.h"
  12. #include "basic_op.h"
  13. #include "oper_32b.h"
  14. #include "ld8a.h"
  15. #include "tab_ld8a.h"
  16. static Word32 L_exc_err[4];
  17. void Init_exc_err(void)
  18. {
  19.   Word16 i;
  20.   for(i=0; i<4; i++) L_exc_err[i] = 0x00004000L;   /* Q14 */
  21. }
  22. /**************************************************************************
  23.  * routine test_err - computes the accumulated potential error in the     *
  24.  * adaptive codebook contribution                                         *
  25.  **************************************************************************/
  26. Word16 test_err(  /* (o) flag set to 1 if taming is necessary  */
  27.  Word16 T0,       /* (i) integer part of pitch delay           */
  28.  Word16 T0_frac   /* (i) fractional part of pitch delay        */
  29. )
  30.  {
  31.     Word16 i, t1, zone1, zone2, flag;
  32.     Word32 L_maxloc, L_acc;
  33.     if(T0_frac > 0) {
  34.         t1 = add(T0, 1);
  35.     }
  36.     else {
  37.         t1 = T0;
  38.     }
  39.     i = sub(t1, (L_SUBFR+L_INTER10));
  40.     if(i < 0) {
  41.         i = 0;
  42.     }
  43.     zone1 = tab_zone[i];
  44.     i = add(t1, (L_INTER10 - 2));
  45.     zone2 = tab_zone[i];
  46.     L_maxloc = -1L;
  47.     flag = 0 ;
  48.     for(i=zone2; i>=zone1; i--) {
  49.         L_acc = L_sub(L_exc_err[i], L_maxloc);
  50.         if(L_acc > 0L) {
  51.                 L_maxloc = L_exc_err[i];
  52.         }
  53.     }
  54.     L_acc = L_sub(L_maxloc, L_THRESH_ERR);
  55.     if(L_acc > 0L) {
  56.         flag = 1;
  57.     }
  58.     return(flag);
  59. }
  60. /**************************************************************************
  61.  *routine update_exc_err - maintains the memory used to compute the error *
  62.  * function due to an adaptive codebook mismatch between encoder and      *
  63.  * decoder                                                                *
  64.  **************************************************************************/
  65. void update_exc_err(
  66.  Word16 gain_pit,      /* (i) pitch gain */
  67.  Word16 T0             /* (i) integer part of pitch delay */
  68. )
  69.  {
  70.     Word16 i, zone1, zone2, n;
  71.     Word32 L_worst, L_temp, L_acc;
  72.     Word16 hi, lo;
  73.     L_worst = -1L;
  74.     n = sub(T0, L_SUBFR);
  75.     if(n < 0) {
  76.         L_Extract(L_exc_err[0], &hi, &lo);
  77.         L_temp = Mpy_32_16(hi, lo, gain_pit);
  78.         L_temp = L_shl(L_temp, 1);
  79.         L_temp = L_add(0x00004000L, L_temp);
  80.         L_acc = L_sub(L_temp, L_worst);
  81.         if(L_acc > 0L) {
  82.                 L_worst = L_temp;
  83.         }
  84.         L_Extract(L_temp, &hi, &lo);
  85.         L_temp = Mpy_32_16(hi, lo, gain_pit);
  86.         L_temp = L_shl(L_temp, 1);
  87.         L_temp = L_add(0x00004000L, L_temp);
  88.         L_acc = L_sub(L_temp, L_worst);
  89.         if(L_acc > 0L) {
  90.                 L_worst = L_temp;
  91.         }
  92.     }
  93.     else {
  94.         zone1 = tab_zone[n];
  95.         i = sub(T0, 1);
  96.         zone2 = tab_zone[i];
  97.         for(i = zone1; i <= zone2; i++) {
  98.                 L_Extract(L_exc_err[i], &hi, &lo);
  99.                 L_temp = Mpy_32_16(hi, lo, gain_pit);
  100.                 L_temp = L_shl(L_temp, 1);
  101.                 L_temp = L_add(0x00004000L, L_temp);
  102.                 L_acc = L_sub(L_temp, L_worst);
  103.                 if(L_acc > 0L) L_worst = L_temp;
  104.         }
  105.     }
  106.     for(i=3; i>=1; i--) {
  107.         L_exc_err[i] = L_exc_err[i-1];
  108.     }
  109.     L_exc_err[0] = L_worst;
  110.     return;
  111. }