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

语音压缩

开发平台:

Unix_Linux

  1. /**************************************************************************
  2. *
  3. * NAME
  4. * rctoac
  5. *
  6. * FUNCTION
  7. *
  8. * convert reflection coefficients to autocorrelation coefficients
  9. *
  10. * SYNOPSIS
  11. *
  12. * subroutine rctoac(rc, r, m)
  13. *
  14. *   formal 
  15. *                       data I/O
  16. * name type type function
  17. * -------------------------------------------------------------------
  18. * rc[m] float i reflection coefficients
  19. * r[m+1] float o normalized autocorrelation coeff.
  20. * m int i filter order
  21. *
  22. ***************************************************************************
  23. *
  24. * DESCRIPTION
  25. *
  26. * Convert reflection coefficients to autocorrelation coefficients.
  27. * Where the sign convention is:
  28. *
  29. * first reflection coefficient = +(normalized autocorrelation coef)
  30. *
  31. ***************************************************************************
  32. *
  33. * CALLED BY
  34. *
  35. * specdist
  36. *
  37. * CALLS
  38. *
  39. *
  40. *
  41. ***************************************************************************
  42. *
  43. * REFERENCES
  44. *
  45. * Atal & Hanauer, "Speech Analysis and Synthesis by Linear
  46. * Prediction of the Speech Wave," JASA, Vol 50 (2), 1971.
  47. *
  48. **************************************************************************/
  49. rctoac(rc, r, m)
  50. int m;
  51. float rc[], r[];
  52. {
  53.   float t[26], tj, tkj;
  54.   int k, j;
  55. /* array r contains the autocorrelation coefficients */
  56.   r[0] = 1.0;
  57.   for (k = 0; k < m; k++)
  58.     r[k+1] = rc[k];
  59.     
  60. /* compute predictor poly of diff deg and store in t
  61. compute autocorrelation function and store into r */
  62.   t[0] = 1.0;
  63.   t[1] = -r[1];
  64.   if (m > 1) 
  65.   {
  66.     for (k = 2; k <= m; k++)
  67.     {
  68.       for (j = 1; j <= k/2; j++)
  69.       {
  70.         tj  = t[j] - r[k] * t[k-j];
  71.         tkj = t[k-j] - r[k] * t[j];
  72.         t[j] = tj;
  73.         t[k-j]  = tkj;
  74.       }
  75.       t[k] = -r[k];
  76.       for (j = 1; j <= k-1; j++)
  77.       {
  78.         r[k] -= r[k-j]*t[j];
  79.       }
  80.     }
  81.   }
  82. }