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

语音压缩

开发平台:

C/C++

  1. /**************************************************************************
  2. *
  3. * ROUTINE
  4. * gainencode
  5. *
  6. * FUNCTION
  7. *
  8. * encode and quantize code book gain
  9. *
  10. * SYNOPSIS
  11. * subroutine gainencode(input, index)
  12. *
  13. *   formal
  14. *
  15. *                       data    I/O
  16. *       name            type    type    function
  17. *       -------------------------------------------------------------------
  18. * input int i code book gain input (true value)
  19. * index float o encoded code book gain ZERO BASED index
  20. * gainencode float func encoded code book gain
  21. *
  22. ***************************************************************************
  23. *
  24. * DESCRIPTION
  25. *
  26. *
  27. *      Fast code book gain quantizer to allow practical quantization
  28. *      inside the code book search loop. A binary tree search quantization 
  29. *      is implemented below.
  30. *
  31. *
  32. ***************************************************************************
  33. *
  34. * CALLED BY
  35. *
  36. * cbsearch cgain
  37. *
  38. * CALLS
  39. *
  40. *
  41. ***************************************************************************
  42. *
  43. * REFERENCES
  44. *
  45. *
  46. **************************************************************************/
  47.  /* *Log quantization                               */
  48. static float gainlog5[32] =
  49. {
  50.  -1330., -870., -660., -520., -418., -340., -278., -224.,
  51.  -178., -136.,  -98.,  -64.,  -35.,  -13.,   -3.,   -1.,
  52.     1.,    3.,   13.,   35.,   64.,   98.,  136.,  178.,
  53.   224.,  278.,  340.,  418.,  520.,  660.,  870., 1330.
  54. };
  55. #include <math.h>
  56. float
  57. gainencode(input, index)
  58. float input;
  59. int *index;
  60. {
  61.   int i;
  62.   static float midpoints[31] = 
  63.   {
  64.     -1100., -765., -590., -469., -379., -309., -251., -201.,
  65.      -157., -117.,  -81.,  -49.5, -24.,   -8.,   -2.,    0.,
  66.         2.,    8.,   24.,   49.5,  81.,  117.,  157.,  201.,
  67.       251.,  309.,  379.,  469.,  590.,  765., 1100.
  68.   };
  69.   /* *Binary tree search for closest gain  */
  70.   for (*index = 15, i = 8; i >= 1; i = i >> 1)
  71.   {
  72.     if (input > midpoints[*index])
  73.       *index += i;
  74.     else
  75.       *index -= i;
  76.   }
  77.   if (input > midpoints[*index])
  78.     (*index)++;
  79.   /* *Return quantized gain and ZERO based index  */
  80.   return (gainlog5[*index]);
  81. }
  82.    
  83. /**************************************************************************
  84. *
  85. * ROUTINE
  86. * gainencode2
  87. *
  88. * FUNCTION
  89. *
  90. * encode and quantize code book gain
  91. *
  92. * SYNOPSIS
  93. * subroutine gainencode2(numer, denom, index)
  94. *
  95. *   formal
  96. *
  97. *                       data    I/O
  98. *       name            type    type    function
  99. *       -------------------------------------------------------------------
  100. * numer int i code book gain numerator
  101. * denom int i code book gain denominator
  102. * index float o encoded code book gain ZERO BASED index
  103. * gainencode2 float func encoded code book gain
  104. *
  105. ***************************************************************************
  106. *
  107. * DESCRIPTION
  108. *
  109. *
  110. *     Fast nonuniform division for code book gain quantization to allow
  111. *     practical quantization inside the code book search loop.  A binary
  112. *     tree search with cross multiply quantization is implemented below.
  113. *
  114. *
  115. *
  116. ***************************************************************************
  117. *
  118. * CALLED BY
  119. *
  120. * cbsearch cgain
  121. *
  122. * CALLS
  123. *
  124. *
  125. ***************************************************************************
  126. *
  127. * REFERENCES
  128. *
  129. *
  130. **************************************************************************/
  131. float
  132. gainencode2(numer, denom, index)
  133. float numer, denom;
  134. int *index;
  135. {
  136.   /* *Hard coded for 5 bit quantization to achieve high speed     */
  137.   int i;
  138.   static float midpoints[31] = 
  139.   {
  140.     -1100., -765., -590., -469., -379., -309., -251., -201.,
  141.      -157., -117.,  -81.,  -49.5, -24.,   -8.,   -2.,    0.,
  142.         2.,    8.,   24.,   49.5,  81.,  117.,  157.,  201.,
  143.       251.,  309.,  379.,  469.,  590.,  765., 1100.
  144.   };
  145.   /* *Binary tree search for closest gain  */
  146.   for (*index = 15, i = 8; i >= 1; i = i >> 1)
  147.   {
  148.     if (numer  > denom * midpoints[*index])
  149.       *index += i;
  150.     else
  151.       *index -= i;
  152.   }
  153.   if (numer > denom * midpoints[*index])
  154.     (*index)++;
  155.   /* *Return quantized gain and ZERO based index  */
  156.   return (gainlog5[*index]);
  157. }
  158.    
  159. /**************************************************************************
  160. *
  161. * ROUTINE
  162. * gaindecode
  163. *
  164. * FUNCTION
  165. *
  166. * decode code book gain from the gain index (gindex)
  167. * and bit index (bits).
  168. *
  169. * SYNOPSIS
  170. * subroutine gaindecode(gindex, bits, gain)
  171. *
  172. *   formal
  173. *
  174. *                       data    I/O
  175. *       name            type    type    function
  176. *       -------------------------------------------------------------------
  177. * gindex int i gain index value
  178. * bits int i # bits for encode
  179. * gain float o decoded code book gain value
  180. *
  181. ***************************************************************************
  182. *
  183. * CALLED BY
  184. *
  185. *       dcodcbg
  186. *
  187. * CALLS
  188. *
  189. *
  190. ***************************************************************************
  191. *
  192. * REFERENCES
  193. *
  194. *       Quantizing for Minimum Distorion
  195. *       J. Max
  196. *       IRE Trans. Inform. Theory, vol. IT-6, pp.7-12, Mar. 1960
  197. *
  198. ***************************************************************************
  199. *
  200. *       The data used in the table generation is from 3m3f.spd.
  201. *
  202. **************************************************************************/
  203. gaindecode(gindex, bits, gain)
  204. int gindex, bits;
  205. float *gain;
  206. {
  207.   /* Choose appropriate gain                                         */
  208.   if (bits == 5)
  209.     *gain = gainlog5[gindex];
  210.   else
  211.     printf("gaindecode: unquantized cbgainn");
  212. }