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

语音压缩

开发平台:

C/C++

  1. /**************************************************************************
  2. *
  3. * ROUTINE
  4. *               smoothtau
  5. *
  6. * FUNCTION
  7. *
  8. *               smooth tau values when two errors detected in Hamming block
  9. *
  10. * SYNOPSIS
  11. *               smoothtau(tau,twoerror,syndavg,tau3,subframe)
  12. *
  13. *   formal
  14. *
  15. *                       data    I/O
  16. *       name            type    type    function
  17. *       -------------------------------------------------------------------
  18. *       tau float i/o input tau
  19. * twoerror int i two error flag
  20. * syndavg float i error rate estimation parameter
  21. * tau3 int i third tau value
  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 tau (pitch lag) when errors are detected:
  35. *
  36. * If the variance of past tau values is within the range VARLIMIT
  37. * (indicating voiced speech) the validity of the current tau value
  38. * is tested.  If the current value of TAU is within the range TAULIMIT,
  39. * TAU is passed.  If TAU is not within that range TAULIMIT, TAU is reset 
  40. * to the average value of taus. 
  41. *
  42. * The array OLDTAU contains past values of tau.  The array VECTOR
  43. * is constructed from the array OLDTAU and TAU3 for subframes 1
  44. * and 2 (TAU3 is a future absolute tau value).  For subframes 3
  45. * and 4 there are no valid future values (since delta taus in the 
  46. * future are not valid), therefore the array VECTOR is constructed 
  47. * entirely from the array OLDTAU.  Decisions concering smoothing of 
  48. * a particular tau are made on the variance of the array VECTOR and 
  49. * the tau in question (TAU).
  50. *
  51. * If the value of tau is smoothed in subframe 3, smoothing is disabled
  52. * for subframe 4 of the same frame since the tau value in subframe 4
  53. * is a delta based on subframe 3.
  54. *
  55. * Note:  The smoothing parameters should be capable of adapting
  56. * to various bit error rate estimates. For example, different
  57. * values of SYNDAVG should select different levels of TAULIMIT and
  58. * VARLIMIT.
  59. *
  60. ***************************************************************************
  61. *
  62. * CALLED BY
  63. *
  64. *       celp
  65. *
  66. * CALLS
  67. *
  68. *
  69. *
  70. **************************************************************************/
  71. #include <math.h>
  72. #define TAUHISTORY 4
  73. #define TAULIMIT 15
  74. #define VARLIMIT 15
  75. #define SYNDLIMIT       0.04
  76. #define TRUE            1
  77. #define FALSE           0
  78. extern int frame;
  79. smoothtau(tau, twoerror, syndavg, tau3, subframe)
  80. int twoerror, subframe;
  81. float *tau, syndavg, tau3;
  82. {
  83.   int i;
  84.   static int enable;
  85.   float avg, var, vector[4];
  86.   static float oldtau[TAUHISTORY];
  87.   if (subframe != 4)
  88.     enable = TRUE;
  89.   if ((twoerror || syndavg > SYNDLIMIT) && enable)
  90.   {
  91.     if (subframe == 1)
  92.     {
  93.       vector[0] = oldtau[0];
  94.       vector[1] = oldtau[1];
  95.       vector[2] = oldtau[2];
  96.       vector[3] = tau3;
  97.     }
  98.     else if (subframe == 2)
  99.     {
  100.       vector[0] = oldtau[0];
  101.       vector[1] = oldtau[1];
  102.       vector[2] = oldtau[2];
  103.       vector[3] = tau3;
  104.     }
  105.     else if (subframe == 3)
  106.     {
  107.       vector[0] = oldtau[0];
  108.       vector[1] = oldtau[1];
  109.       vector[2] = oldtau[2];
  110.       vector[3] = oldtau[3];
  111.     }
  112.     else if (subframe == 4)
  113.     {
  114.       vector[0] = oldtau[0];
  115.       vector[1] = oldtau[1];
  116.       vector[2] = oldtau[2];
  117.       vector[3] = oldtau[3];
  118.     }
  119.     else
  120.       printf("smoothtau: Error in subframe numbern");
  121.     variance(vector, 4, &var, &avg);
  122.     if (var < VARLIMIT && (*tau >= avg + TAULIMIT || *tau <= avg - TAULIMIT))
  123.     {
  124.       *tau = nint(avg);
  125.       printf("smoothtau: tau value reset to avg at frame %d subframe %dn",
  126.       frame, subframe);
  127.       if (subframe == 3)
  128.       {
  129. enable = FALSE;
  130. printf("smoothpgain: tau smoothing disabled for subframe 4n");
  131.       }
  132.     }
  133.   }
  134.   for (i = TAUHISTORY - 1; i > 0; i--)
  135.     oldtau[i] = oldtau[i - 1];
  136.   oldtau[0] = *tau;
  137. }