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

语音压缩

开发平台:

C/C++

  1. /*
  2. **
  3. ** File:    tame.c
  4. **
  5. ** Description: Functions used to avoid possible explosion of the decoder
  6. **              excitation in case of series of long term unstable filters
  7. **              and when the encoder and the decoder are de-synchronized
  8. **
  9. ** Functions:
  10. **
  11. **  Computing excitation error estimation :
  12. **      Update_Err()
  13. **  Test excitation error :
  14. **      Test_Err()
  15. */
  16. /*
  17.     ITU-T G.723 Speech Coder   ANSI-C Source Code     Version 5.0
  18.     copyright (c) 1995, AudioCodes, DSP Group, France Telecom,
  19.     Universite de Sherbrooke.  All rights reserved.
  20. */
  21. #include <stdlib.h>
  22. #include <stdio.h>
  23. #include "typedef.h"
  24. #include "basop.h"
  25. #include "cst_lbc.h"
  26. #include "lbccodec.h"
  27. #include "coder.h"
  28. #include "exc_lbc.h"
  29. #include "tame.h"
  30. #include "tab_lbc.h"
  31. /*
  32. **
  33. ** Function:        Update_Err()
  34. **
  35. ** Description:     Estimation of the excitation error associated
  36. **                  to the excitation signal when it is disturbed at
  37. **                  the decoder, the disturbing signal being filtered
  38. **                  by the long term synthesis filters
  39. **                  one value for (SubFrLen/2) samples
  40. **                  Updates the table CodStat.Err
  41. **
  42. ** Links to text:   Section
  43. **
  44. ** Arguments:
  45. **
  46. **  Word16 Olp      Center value for pitch delay
  47. **  Word16 AcLg     Offset value for pitch delay
  48. **  Word16 AcGn     Index of Gain LT filter
  49. **
  50. ** Outputs: None
  51. **
  52. ** Return value:    None
  53. **
  54. */
  55. void Update_Err(
  56.     Word16 Olp, Word16 AcLg, Word16 AcGn
  57. )
  58. {
  59.     Word16 *ptr_tab;
  60.     Word16 i, iz, temp1, temp2;
  61.     Word16 Lag;
  62.     Word32 Worst1, Worst0, L_temp;
  63.     Word16 beta;
  64.     Lag = Olp - (Word16)Pstep + AcLg;
  65.     /* Select Quantization tables */
  66.     i = 0 ;
  67.     ptr_tab = tabgain85;
  68.     if ( WrkRate == Rate63 ) {
  69.         if ( Olp >= (Word16) (SubFrLen-2) ) ptr_tab = tabgain170;
  70.     }
  71.     else {
  72.         ptr_tab = tabgain170;
  73.     }
  74.     beta = ptr_tab[(int)AcGn]; /* beta = gain * 8192 */
  75.     if(Lag <= (SubFrLen/2)) {
  76.         Worst0 = L_mls(CodStat.Err[0], beta);
  77.         Worst0 = L_shl(Worst0, 2);
  78.         Worst0 = L_add(Err0, Worst0);
  79.         Worst1 = Worst0;
  80.     }
  81.     else {
  82.         iz = mult(Lag, 1092);   /* Lag / 30 */
  83.         temp1 = add(iz, 1);
  84.         temp2 = sub(shl(temp1, 5), shl(temp1, 1));      /* 30 (iz+1) */
  85.         if(temp2 != Lag) {
  86.             if(iz == 1) {
  87.                 Worst0 = L_mls(CodStat.Err[0], beta);
  88.                 Worst0 = L_shl(Worst0, 2);
  89.                 Worst0 = L_add(Err0, Worst0);
  90.                 Worst1 = L_mls(CodStat.Err[1], beta);
  91.                 Worst1 = L_shl(Worst1, 2);
  92.                 Worst1 = L_add(Err0, Worst1);
  93.                 if(Worst0 > Worst1) Worst1 = Worst0;
  94.                 else Worst0 = Worst1;
  95.             }
  96.             else {
  97.                 Worst0 = L_mls(CodStat.Err[iz-2], beta);
  98.                 Worst0 = L_shl(Worst0, 2);
  99.                 Worst0 = L_add(Err0, Worst0);
  100.                 L_temp = L_mls(CodStat.Err[iz-1], beta);
  101.                 L_temp = L_shl(L_temp, 2);
  102.                 L_temp = L_add(Err0, L_temp);
  103.                 if(L_temp > Worst0) Worst0 = L_temp;
  104.                 Worst1 = L_mls(CodStat.Err[iz], beta);
  105.                 Worst1 = L_shl(Worst1, 2);
  106.                 Worst1 = L_add(Err0, Worst1);
  107.                 if(L_temp > Worst1) Worst1 = L_temp;
  108.             }
  109.         }
  110.         else {  /* Lag % SubFrLen = 0 */
  111.             Worst0 = L_mls(CodStat.Err[iz-1], beta);
  112.             Worst0 = L_shl(Worst0, 2);
  113.             Worst0 = L_add(Err0, Worst0);
  114.             Worst1 = L_mls(CodStat.Err[iz], beta);
  115.             Worst1 = L_shl(Worst1, 2);
  116.             Worst1 = L_add(Err0, Worst1);
  117.         }
  118.     }
  119.     for(i=4; i>=2; i--) {
  120.         CodStat.Err[i] = CodStat.Err[i-2];
  121.     }
  122.     CodStat.Err[0] = Worst0;
  123.     CodStat.Err[1] = Worst1;
  124.     return;
  125. }
  126. /*
  127. **
  128. ** Function:        Test_Err()
  129. **
  130. ** Description:     Check the error excitation maximum for
  131. **                  the subframe and computes an index iTest used to
  132. **                  calculate the maximum nb of filters (in Find_Acbk) :
  133. **                  Bound = Min(Nmin + iTest x pas, Nmax) , with
  134. **                  AcbkGainTable085 : pas = 2, Nmin = 51, Nmax = 85
  135. **                  AcbkGainTable170 : pas = 4, Nmin = 93, Nmax = 170
  136. **                  iTest depends on the relative difference between
  137. **                  errmax and a fixed threshold
  138. **
  139. ** Links to text:   Section
  140. **
  141. ** Arguments:
  142. **
  143. **  Word16 Lag1      1st long term Lag of the tested zone
  144. **  Word16 Lag2      2nd long term Lag of the tested zone
  145. **
  146. ** Outputs: None
  147. **
  148. ** Return value:
  149. **  Word16          index iTest used to compute Acbk number of filters
  150. */
  151. Word16 Test_Err(
  152.     Word16 Lag1, Word16 Lag2
  153. )
  154. {
  155.     int i, i1, i2;
  156.     Word16 zone1, zone2;
  157.     Word32 Acc, Err_max;
  158.     Word16 iTest;
  159.     i2 = Lag2 + ClPitchOrd/2;
  160.     zone2 = mult( (Word16) i2, (Word16) 1092);
  161.     i1 = - SubFrLen + 1 + Lag1 - ClPitchOrd/2;
  162.     if(i1 <= 0) i1 = 1;
  163.     zone1 = mult( (Word16) i1, (Word16) 1092);
  164.     Err_max = -1L;
  165.     for(i=zone2; i>=zone1; i--) {
  166.         Acc = L_sub(CodStat.Err[i], Err_max);
  167.         if(Acc > 0L) {
  168.                 Err_max = CodStat.Err[i];
  169.         }
  170.     }
  171.     Acc = L_sub(Err_max, ThreshErr);
  172.     if((Acc > 0L) || (CodStat.SinDet < 0 ) ) {
  173.         iTest = 0;
  174.     }
  175.     else {
  176.         Acc = L_negate(Acc);
  177.         Acc = L_shr(Acc, DEC);
  178.         iTest = extract_l(Acc);
  179.     }
  180.     return(iTest);
  181. }