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

语音压缩

开发平台:

C/C++

  1. #define mmax(A,B)      ((A)>(B)?(A):(B))
  2. #define mmin(A,B)       ((A)<(B)?(A):(B))
  3. /**************************************************************************
  4. *
  5. * NAME
  6. * mexcite
  7. *
  8. * FUNCTION
  9. * Modify the stochastic code book excitation gain
  10. *
  11. * SYNOPSIS
  12. * subroutine mexcite1(l)
  13. * subroutine mexcite2(l)
  14. * subroutine mexcite3(cgain)
  15. *
  16. *   formal 
  17. *                       data    I/O
  18. *       name            type    type    function
  19. *       ------------------------------------------------------------------
  20. *       l int i length of error signal
  21. * cgain float i/o stochastic code book gain
  22. *
  23. *   global 
  24. *                       data    I/O
  25. *       name            type    type    function
  26. *       ------------------------------------------------------------------
  27. *  /ccsub/ see description include file
  28. *       e0 float i error signal array
  29. *
  30. ***************************************************************************
  31. *
  32. * DESCRIPTION
  33. *
  34. * Depending on the current system state, the stochastic code book
  35. * excitation is reduced to a level that is low enough to produce
  36. * positive perceptual effects, yet is high enough so as not to upset
  37. * the dynamics of the system.  The main effect of the method is that
  38. * during sustained voiced sounds, the excitation level is attenuated
  39. * and in unvoiced and transition regions the level is amplified to a
  40. * level slightly more than that of standard CELP.
  41. *
  42. * The relative adaptive code book excitation component is
  43. * increased in voiced regions by decreasing the stochastic code book
  44. * excitation component.  The amount of decrease in the stochastic
  45. * component depends on the efficiency of the adaptive component.
  46. * More reconstruction burden is placed on the adaptive component as
  47. * its efficiency increases.  The efficiency is measured by the
  48. * closeness (in the crosscorrelation sense) of the residual signals
  49. *       before and after pitch prediction.  When the efficiency is high
  50. *       (e.g., > 0.9), the stochastic component is amplified slightly
  51. *       (e.g., one quantizer level). 
  52. *
  53. * The procedure for modifying the stochastic gain outside the
  54. * search loop is:
  55. * 1)  Measure the efficiency of the adaptive component (ccor)
  56. * 2)  Search the stochastic code book for the optimum codeword
  57. * 3)  Modify the stochastic code book gain
  58. *
  59. * This method is compatible with Federal Standard 1016.
  60. *
  61. *
  62. *
  63. ***************************************************************************
  64. *
  65. * CALLED BY
  66. *
  67. * csub csearch
  68. *
  69. * CALLS
  70. *
  71. ***************************************************************************
  72. * REFERENCES
  73. *
  74. * Shoham, Yair, "Constrained-Stochastic Excitation Coding of Speech
  75. * at 4.8 kbps," in Advances in Speech Coding, ed. B. Atal, V.
  76. * Cuperman, and A. Gersho, submitted to Kluwer Academic Publishers.
  77. *
  78. * Shoham, Yair, "Constrained-Stochastic Excitation Coding of Speech," 
  79. * Abstracts of the IEEE Workshop on Speech Coding for
  80. * Telecommunications, 1989, p. 65.
  81. *
  82. ***************************************************************************/
  83. #include <math.h>
  84. #include "ccsub.h"
  85. #ifdef SUNGRAPH
  86. extern int gain_vid, ccor_vid;
  87. #endif
  88. extern float e0[MAXLP];
  89. static float ccor;
  90. static float e1, e0save[60];
  91. mexcite1(l)
  92. int l;
  93. {
  94.   int i;
  95.   /* *e1 = Euclidean norm of the first error signal */
  96.   /* (note: the error signal array e0 is reused) */
  97.   e1 = 1e-6;
  98.   for (i = 0; i < l; i++)
  99.   {
  100.     e0save[i] = e0[i];
  101.     e1 += e0[i] * e0[i];
  102.   }
  103. }
  104. mexcite2(l)
  105. int l;
  106. {
  107.   int i;
  108.   /* *ccor = crosscorrelation of the residual signals before  */
  109.   /* *and after pitch prediction */
  110.   /* *(note: the error signal array e0 is reused */
  111.   ccor = 1e-6;
  112.   for (i = 0; i < l; i++)
  113.     ccor += e0[i] * e0save[i];
  114.   /* *normalize the crosscorrelation */
  115.   ccor = ccor / e1;
  116. }
  117. mexcite3(cgain)
  118. float *cgain;
  119. {
  120.   float scale;
  121.   /* *square root crosscorrelation scaling */
  122.   scale = sqrt(fabs(ccor));
  123.   /* *modify scale */
  124.   if (scale < 0.2)
  125.     scale = 0.2;
  126.   else if (scale > 0.9) 
  127.     scale = scale * 1.4;
  128.   /* *modify the stochastic component */
  129.   *cgain = *cgain * scale;
  130. #ifdef SUNGRAPH
  131.   save_sg(gain_vid, &scale, 1, "save gain_vid");
  132.   save_sg(ccor_vid, &ccor, 1, "save ccor_vid");
  133. #endif
  134. }