smpg.c
上传用户:szhypcb168
上传日期:2007-01-06
资源大小:2187k
文件大小:4k
源码类别:

语音压缩

开发平台:

Unix_Linux

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