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

语音压缩

开发平台:

Unix_Linux

  1. /**************************************************************************
  2. *
  3. * ROUTINE
  4. *               cbsearch
  5. *
  6. * FUNCTION
  7. *               find optimal MSPE excitation code word
  8. *
  9. * SYNOPSIS
  10. *               subroutine cbsearch(l, v)
  11. *
  12. *   formal 
  13. *
  14. *                       data    I/O
  15. *       name            type    type    function
  16. *       -------------------------------------------------------------------
  17. *       l               int     i       length of vectors
  18. *       v(l)            float   o       optimum excitation segment found
  19. *
  20. *   external 
  21. *                       data    I/O
  22. *       name            type    type    function
  23. *       -------------------------------------------------------------------
  24. * cbgbits int i code book gain bit allocation
  25. * cbindex int i/o code book index
  26. * gindex int i/o gain index
  27. * ncsize int i code book size
  28. * no int i filter order  predictor
  29. * h[] float i impulse response
  30. * x[]; float i code book
  31. * cbgtype[]; char i code book gain quantizer type
  32. * cb_gain_vid int i
  33. * cb_qgain_vid int i
  34. * cb_match_vid int i
  35. * cb_exc_vid int i
  36. * cb_ir_vid int i
  37. * dbcon_vid int     i
  38. * mxsw int i modified excitation switch
  39. *
  40. ***************************************************************************
  41. *
  42. * DESCRIPTION
  43. *
  44. *  Code book search is performed by closed-loop analysis using conventional
  45. *  minimum squared prediction error (MSPE) criteria of the perceptually
  46. *  weighted error signal.  The code book is overlaped to allow recursive
  47. *  computational savings in routine cgain:
  48. *
  49. * index code book
  50. * +-------------------------+
  51. * 1 | 2(M-1)       2(M-1)+L-1 |
  52. * 2 | 2(M-2)       2(M-2)+L-1 |
  53. * : | :            :   |
  54. * N-1 | .            .   |
  55. * N | .            .   |
  56. * : | 2            61   |
  57. * : | 0            59   |
  58. * +-------------------------+
  59. *
  60. * where: M = maximum code book size
  61. *        N = actual code book search size (any value between 1 & M)
  62. *        L = code word length
  63. *
  64. * each code word is:  2(M-index) -> 2(M-index)+L-1
  65. *  
  66. ***************************************************************************
  67. *
  68. *   global 
  69. *
  70. *
  71. * CODE BOOK VARIABLES:
  72. * err real error for each code book entry
  73. * gain real gain for each code book entry
  74. *
  75. ***************************************************************************
  76. * CALLED BY
  77. *
  78. *       csub
  79. *
  80. * CALLS
  81. *
  82. * cgain   [gainencode]   save_sg   mexcite3
  83. *
  84. ***************************************************************************
  85. *
  86. *
  87. * REFERENCES
  88. *
  89. * Tremain, Thomas E., Joseph P. Campbell, Jr and Vanoy C. Welch,
  90. * "A 4.8 kbps Code Excited Linear Predictive Coder," Proceedings
  91. * of the Mobile Satellite Conference, 3-5 May 1988, pp. 491-496.
  92. *
  93. * Campbell, Joseph P. Jr., Vanoy C. Welch and Thomas E. Tremain,
  94. * "An Expandable Error-Protected 4800 bps CELP Coder (U.S. Federal
  95. * Standard 4800 bps Voice Coder)," Proceedings of ICASSP, 1989.
  96. * (and Proceedings of Speech Tech, 1989.)
  97. *
  98. *************************************************************************/
  99. #define TRUE 1
  100. #define FALSE 0
  101. #define LEN 30 /* length of truncated impulse response */
  102. #include "ccsub.h"
  103. #include <math.h>
  104. extern int cbgbits, cbindex, gindex, ncsize, mxsw;
  105. extern float h[MAXLP], x[MAXCODE];
  106. extern char cbgtype[10];
  107. #ifdef SUNGRAPH
  108. extern int cb_gain_vid, cb_qgain_vid, cb_match_vid, cb_exc_vid, cb_ir_vid;
  109. extern int dbcon_vid;
  110. #endif
  111. cbsearch(l, v)
  112. int l;
  113. float v[];
  114. {
  115.   int i, codeword;
  116.   float emax, gain[MAXNCSIZE], err[MAXNCSIZE], cgain(), gainencode();
  117.   float quangain, oldgain;
  118. #ifdef SUNGRAPH
  119.   float dbcon;
  120. #endif
  121. #ifdef SUNGRAPH
  122.   /* *save impulse response in file 'codebook' */
  123.   /* *(same as impulse response in file 'pitch')             */
  124.   
  125.   save_sg(cb_ir_vid, h, l, "save cb_ir_vid");
  126. #endif
  127.   
  128.   /* *find gain and -error term for each code word */
  129.   /* *and search for best code word (max -error term) */
  130.   /* *(codewords are overlapped by shifts of -2 */
  131.   /* * along the code vector x) */
  132.   /* *NOTE: gain(i) & err(i) can be replaced by scalars   */  
  133.   codeword = 2*MAXNCSIZE - 2;
  134.   cbindex = 1;
  135.   gain[0] = cgain(&x[codeword], l, TRUE, LEN, &err[0]);
  136.   emax = *err;
  137.   codeword -= 2;
  138.   for (i = 1; i < ncsize; i++)
  139.   {
  140.     gain[i] = cgain(&x[codeword], l, FALSE, LEN, &err[i]);
  141.     codeword -= 2;
  142.     if (err[i] >= emax)
  143.     {
  144.       emax = err[i];
  145.       cbindex = i + 1;
  146.     }
  147.   }
  148.   /*   if (err(cbindex).lt.0.0)print *,' CB match<0',frame,err(cbindex) */
  149.   /* *pointer to best code word */
  150.   codeword = 2*(MAXNCSIZE - cbindex);
  151.   /* *OPTIONAL (may be useful for integer DSPs) */
  152.   /* *given best code word, recompute its gain to */
  153.   /* *correct any accumulated errors in recursions */
  154.   gain[cbindex-1] = cgain(&x[codeword], l, TRUE, l, &err[cbindex-1]);
  155. #ifdef SUNGRAPH
  156.   /* *save code book gain in file 'codebook' */
  157.   /* *if closed-loop quant, this is QUANTIZED gain */
  158.   
  159.   save_sg(cb_gain_vid, &gain[cbindex-1], 1, "save cb_gain_vid");
  160.   /* *save code book error in file 'codebook' */
  161.   
  162.   save_sg(cb_match_vid, err, ncsize, "save cb_error_vid");
  163. #endif
  164.   oldgain = gain[cbindex - 1];
  165.   /* *constrained excitation */
  166.   if (mxsw) 
  167.     mexcite3(&gain[cbindex - 1]);
  168.   /* *gain quantization, UNNECESSARY for closed-loop quant */
  169.   
  170.   if (strncmp(cbgtype, "none", 4) != 0)
  171.     if (cbgbits == 5)
  172.       gain[cbindex-1] = gainencode(gain[cbindex-1], &gindex);
  173.   else
  174.     printf("cbsearch: not quantizing cbgainn");
  175.     
  176.   /* *scale selected code word vector -> excitation array */
  177.   /* *call VDECODE? */
  178.   
  179.   for (i = 0; i < l; i++)
  180.     v[i] = gain[cbindex - 1] * x[i + codeword];
  181. #ifdef SUNGRAPH
  182.   /* *save quantized code book gain in file 'codebook' */
  183.   
  184.   if (oldgain != 0)
  185.     dbcon = 20.0 * log10(fabs(oldgain / gain[cbindex - 1]));
  186.   quangain = gain[cbindex - 1];
  187.   
  188.   save_sg(cb_qgain_vid, &quangain, 1, "save cb_qgain_vid");
  189.   save_sg(dbcon_vid, &dbcon, 1, "save dbcon_vid");
  190.   
  191.   /* *save code book excitation in file 'codebook' */
  192.   
  193.   save_sg(cb_exc_vid,v,l, "save cb_exc_vid");
  194.   
  195. #endif
  196. }