smcbg.c
上传用户:tsjrly
上传日期:2021-02-19
资源大小:107k
文件大小:4k
源码类别:

语音压缩

开发平台:

C/C++

  1. /**************************************************************************
  2. *
  3. * ROUTINE
  4. *               smoothcbgain
  5. *
  6. * FUNCTION
  7. *
  8. *               smooth cbgain values when two errors detected in
  9. * Hamming block
  10. *
  11. * SYNOPSIS
  12. *               smoothcbgain(cbgain,twoerror,syndavg, gains, subframe)
  13. *
  14. *   formal
  15. *                       data    I/O
  16. *       name            type    type    function
  17. *       -------------------------------------------------------------------
  18. *       cbgain float i/o input cbgain
  19. * twoerror int i two error flag
  20. * syndavg float i error rate estimation parameter
  21. * gains float i vector of gains to calculate variance
  22. * subframe int i subframe number
  23. *
  24. *   external
  25. *                       data    I/O
  26. *       name            type    type    function
  27. *       -------------------------------------------------------------------
  28. * frame int i
  29. *
  30. ***************************************************************************
  31. *
  32. * DESCRIPTION
  33. *
  34. * Smoothing routine to smooth cbgain when errors are detected:
  35. *
  36. * If the variance of past cbgain values is within the range VARLIMIT,
  37. * the validity of the current cbgain value is tested.  If the current
  38. * value of cbgain is within the range CBGAINLIMIT, cbgain is passed.
  39. * If CBGAIN is not within  the range CBGAINLIMIT it is reset to the 
  40. * average value of the surrounding cbgain values.
  41. *
  42. * The array OLDCBGAIN contains past values of cbgain.  The array
  43. * GAINS contains current and future values of cbgain.  The array 
  44. * VECTOR is constructed from the arrays OLDCBGAIN and GAINS
  45. * depending on the current subframe.  CBGAIN is smoothed based on 
  46. * the statistics of VECTOR, which contains the nearest four
  47. * surrounding cbgain values, both past and future values, except
  48. * where future values are not available (subframes 3 and 4).
  49. *
  50. * NOTE:  The smoothing parameters should be capable of adapting
  51. * to various bit error rate estimates.  For example, different
  52. * values of SYNDAVG should select different levels of CBGAINLIMIT,
  53. * VARLIMIT, and SYNDAVG.
  54. *
  55. ***************************************************************************
  56. *
  57. * CALLED BY
  58. *
  59. *       celp
  60. *
  61. * CALLS
  62. *
  63. *       variance
  64. *
  65. **************************************************************************/
  66. #define CBGAINHISTORY 4
  67. #define CBGAINLIMIT 300.0
  68. #define VARLIMIT 30000.0
  69. #define SGAINLIMIT 9.0
  70. #define SVARLIMIT 10.0
  71. #define AVGLIMIT 6.0
  72. #define SYNDLIMIT 0.04
  73. #define TRUE 1
  74. #define FALSE 0
  75. #include <math.h>
  76. #include "ccsub.h"
  77. extern int frame;
  78. smoothcbgain(cbgain, twoerror, syndavg, gains, subframe)
  79. int twoerror, subframe;
  80. float *cbgain, syndavg, gains[];
  81. {
  82.   int i, sign;
  83.   static int enable;
  84.   float avg, var, abscbgain, vector[4];
  85.   static float oldcbgain[CBGAINHISTORY];
  86.   abscbgain = fabs(*cbgain);
  87.   if (subframe != 4)
  88.     enable = TRUE;
  89.   if ((twoerror || syndavg > SYNDLIMIT) && enable)
  90.   {
  91.     if (subframe == 1)
  92.     {
  93.       vector[0] = oldcbgain[0];
  94.       vector[1] = oldcbgain[1];
  95.       vector[2] = fabs(gains[1]);
  96.       vector[3] = fabs(gains[2]);
  97.     }
  98.     else if (subframe == 2)
  99.     {
  100.       vector[0] = oldcbgain[0];
  101.       vector[1] = oldcbgain[1];
  102.       vector[2] = fabs(gains[2]);
  103.       vector[3] = fabs(gains[3]);
  104.     }
  105.     else if (subframe == 3)
  106.     {
  107.       vector[0] = oldcbgain[0];
  108.       vector[1] = oldcbgain[1];
  109.       vector[2] = oldcbgain[2];
  110.       vector[3] = fabs(gains[3]);
  111.     }
  112.     else if (subframe == 4)
  113.     {
  114.       vector[0] = oldcbgain[0];
  115.       vector[1] = oldcbgain[1];
  116.       vector[2] = oldcbgain[2];
  117.       vector[3] = oldcbgain[3];
  118.     }
  119.     else
  120.       printf("smoothcbgain: Error in subframe numbern");
  121.     variance(vector, 4, &var, &avg);
  122.     sign = nint(*cbgain / fabs(*cbgain));
  123.     if (var < VARLIMIT &&
  124. (abscbgain > avg + CBGAINLIMIT || abscbgain < avg - CBGAINLIMIT))
  125.     {
  126.       abscbgain = avg;
  127.       printf("smoothcbgain:  cbgain value reset to avg cbgains at frame %d subframe %dn", frame, subframe);
  128.       *cbgain = sign * abscbgain;
  129.       if (subframe == 3)
  130.       {
  131. enable = FALSE;
  132. printf("smoothcbgain:  smoothing disabled for subframe 4n");
  133.       }
  134.     }
  135.     if (var < SVARLIMIT && abscbgain > SGAINLIMIT &&
  136. avg < AVGLIMIT && enable)
  137.     {
  138.       abscbgain = avg;
  139.       *cbgain = sign * abscbgain;
  140.       printf("smoothcbgain:  %s at frame %d subframe %dn",
  141.    "cbgain value reset to avg cbgains (silence?)", frame, subframe);
  142.       if (subframe == 3)
  143.       {
  144. enable = FALSE;
  145. printf("smoothcbgain:  smoothing disabled for subframe 4n");
  146.       }
  147.     }
  148.   }
  149.   for (i = CBGAINHISTORY - 1; i > 0; i--)
  150.     oldcbgain[i] = oldcbgain[i - 1];
  151.   oldcbgain[0] = abscbgain;
  152. }