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

语音压缩

开发平台:

C/C++

  1. /**************************************************************************
  2. *
  3. * ROUTINE
  4. *               pitchvq
  5. *
  6. * FUNCTION
  7. * Pitch VQ (n-taps, where n = 0, ..., 3)
  8. * "self-excited" or "vq" or "adaptive code book"
  9. *
  10. * SYNOPSIS
  11. *               subroutine pitchvq(rar, idim, buf, idimb, b, type)
  12. *
  13. *   formal
  14. *
  15. *                       data    I/O
  16. *       name            type    type    function
  17. *       -------------------------------------------------------------------
  18. * rar float i/o Data segement/Filtered data segment
  19. * idim int i Dimension of data segement RAR
  20. * buf float i/o Data buffer, dim IDIMB
  21. * idimb int i Dimension of data buffer is
  22. * max(M) + IDIM+1
  23. * b[0] float i Pitch delay (M)
  24. * b[1-3] float i pitch predictor coefficients.
  25. * BETA1=B(2),BETA2=B(3), BETA3=B(4)
  26. * For a 1-tap predictor B(2)=B(4)=0.0
  27. * type char i Type "long" calls ldelay.c, the 
  28. * delay routine using long interpola-
  29. * tion windows.  Type "short" calls
  30. * delay.c, the short delay routine.
  31. *
  32. ***************************************************************************
  33. *
  34. * CALLED BY
  35. *
  36. * celp   confg
  37. *
  38. * CALLS
  39. *
  40. * delay
  41. *
  42. *
  43. ***************************************************************************
  44. *
  45. * USAGE
  46. *
  47. *    Adaptive code book (pitch) synthesis routine:
  48. *
  49. *    1) For lags < frame size:  gain-shape adaptive code book VQ
  50. *
  51. *    2) For lags => frame size this is equivalent to a pitch synthesis "filter"
  52. *
  53. *                              -[b(1)-1]        -b(1)        -[b(1)+1]
  54. *       H(z) =  1 /  1 + b(2) z         + b(3) z     + b(4) z
  55. *
  56. *       NOTE: largest delay must not exceed the value IDIMB-IDIM
  57. *
  58. *
  59. ***************************************************************************
  60. *
  61. * REFERENCES
  62. *
  63. * Singhal & Atal, Improving Performance of Multi-Pulse LPC Coders at
  64. * Low Bit Rates, ICASSP, 1984.
  65. *
  66. * Rose & Barnwell.  The Self Excited Vocoder-An Alternate Approcch 
  67. * to Toll Quality at 4800 bps, ICASSP, 1986, pp. 453-456.
  68. *
  69. * Kleijn, Krasinski and Ketchum, Improved Speech Quality and 
  70. * Efficient Vector Quantization in SELP, ICASSP, 1988.
  71. *
  72. **************************************************************************/
  73. #include <math.h>
  74. #include "ccsub.h"
  75. pitchvq(rar, idim, buf, idimb, b, type)
  76. int idim, idimb;
  77. float rar[], buf[], b[];
  78. char type[];
  79. {
  80.   int k, m, i, start;
  81.   float buf2[MAXLP], frac;
  82.   k = idimb - idim;
  83.   start = k + 1;
  84.   m = b[0];
  85.   frac = b[0] - m;
  86.   /* *update memory  */
  87.   for (i = 0; i < k; i++)
  88.     buf[i] = buf[i + idim];
  89.   /* *update memory with selected pitch memory from selected delay (m)    */
  90.   if (fabs(frac) < 1.e-4)
  91.   {
  92.     for (i = k; i < idimb; i++)
  93.       buf[i] = buf[i - m];
  94.   }
  95.   /* *fractional update if fractional part isn't "zero"  */
  96.   if (fabs(frac) > 1.e-4)
  97.   {
  98.     if (strcmp(type,"long") == 0)
  99.       ldelay(buf, start, idim, frac, m, buf2);
  100.     else
  101.       delay(buf, start, idim, frac, m, buf2);
  102.     for (i = 0; i < idim; i++)
  103.       buf[i + k] = buf2[i];
  104.   }
  105.   /* *return "rar" with scaled memory added to stochastic contribution  */
  106.   
  107.     for (i = 0; i < idim; i++)
  108.       buf[i + k] = rar[i] += b[2] * buf[i + k]; 
  109.                            
  110. }