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

语音压缩

开发平台:

C/C++

  1. /*****************************************************************************
  2. *
  3. * NAME
  4. *       durbin
  5. *
  6. * FUNCTION
  7. *
  8. *       Durbin recursion to do autocorrelation analysis.
  9. *       Converts autocorrelation sequence to reflection coefficients
  10. *       and prediciton coefficients.
  11. *
  12. * SYNOPSIS
  13. *
  14. *       subroutine durbin (c0, c, a, n)
  15. *
  16. *   formal 
  17. *                       data    I/O
  18. *       name            type    type    function
  19. *       -------------------------------------------------------------------
  20. *       c0              real    i       c(0)
  21. * c[n] real i auto-correlation coefficients
  22. *       a[n]            real    o       prediction coefficients (voiced-> +a1)
  23. *       n               int     i       number of reflection coefficients
  24. *       
  25. ****************************************************************************
  26. *       
  27. * DESCRIPTION
  28. *
  29. *       This performs the classical Durbin recursion
  30. *       on the correlation sequence c0, c[0], c[1] . . .
  31. *       to obtain n reflection coefficients (rc).
  32. *
  33. * The sign convention used defines the first reflection coefficient
  34. * as the normalized first autocorrelation coefficient, which results
  35. * in positive values of rc[0] for voiced speech.
  36. *
  37. ****************************************************************************
  38. *
  39. * CALLED BY
  40. *
  41. * autohf
  42. *
  43. * CALLS
  44. *
  45. ****************************************************************************
  46. *       
  47. * REFERENCES
  48. *
  49. * Parsons, Voice and Speech Processing, McGraw-Hill, 1987, p.160&378.
  50. *
  51. ****************************************************************************/
  52. #include "ccsub.h"
  53. durbin(c0, c, a, n)
  54. int n;
  55. float c0, *c, *a;
  56. {
  57.   int i, j;
  58.   float alpha, beta, rc[MAXNO], tmp[MAXNO];
  59.   /* If zero energy, set rc's to zero & return  */
  60.   if (c0 <= 0.0) 
  61.   {
  62.     for (i = 0; i < n; i++)
  63.       rc[i] = 0.0;
  64.     return;
  65.   }
  66.   /* Intialization   */
  67.   alpha = c0;
  68.   *a = rc[0] = -*c / c0;
  69.   beta = *c;
  70.   /* Recursion   */
  71.   for (i = 1; i < n; i++)
  72.   {
  73.      alpha = alpha + beta * rc[i - 1];
  74.      beta = *(c+i);
  75.      for (j = 0; j <= i - 1; j++)
  76.        beta = beta + *(c+j) * *(a+i-j-1);
  77.      rc[i] = -beta / alpha;
  78.      for (j = 0; j <= i - 1; j++)
  79.        tmp[j] = rc[i] * *(a+i-j-1);
  80.      for (j = 0; j <= i - 1; j++)
  81.        *(a+j) = *(a+j) + tmp[j];
  82.      *(a+i) = rc[i];
  83.    }
  84. }