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

语音压缩

开发平台:

Unix_Linux

  1. /**************************************************************************
  2. *
  3. * ROUTINE
  4. *               find
  5. *
  6. * FUNCTION
  7. *                
  8. *               computes filter coefficients, cepstral coefficients, and
  9. * filter coefficient autocorrelations
  10. *
  11. * SYNOPSIS
  12. *               subroutine find(m, nf, r, cep, ra, alpha, a, rc)
  13. *
  14. *   formal 
  15. *
  16. *                       data    I/O
  17. *       name            type    type    function
  18. *       -------------------------------------------------------------------
  19. *       m int i filter order
  20. * nf int i number of terms to be found for
  21. * the cepstrum
  22. * r float i auto correlation sequence
  23. * cep float o cepstral coefficients
  24. * ra float o filter autocorrelation sequence
  25. * a float o filter coefficients
  26. * rc float o reflection coefficients
  27. *
  28. ***************************************************************************
  29. *
  30. * DESCRIPTION
  31. *
  32. * See references.  For use with dist.c
  33. *
  34. ***************************************************************************
  35. *
  36. * CALLED BY
  37. *
  38. * dist
  39. *
  40. * CALLS
  41. *
  42. *
  43. ***************************************************************************
  44. * REFERENCES
  45. *
  46. * "Distance Measures for Speech Processing", A.H. Gray  
  47. * and J.D. Markel, IEEE Trans. on ASSP, Vol. ASSP-24, 
  48. * no. 5, Oct. 1976
  49. *
  50. * "Quantization and Bit Allocation in Speech Processing", 
  51. * A.H. Gray and J.D. Markel, IEEE Trans. on ASSP, Vol. ASSP-24
  52. * no. 6, Dec. 1976
  53. *
  54. * "A Note on Quantization and Bit Allocation in Speech Processing", 
  55. * A.H. Gray and J.D. Markel, IEEE Trans. on ASSP, Vol. ASSP-25
  56. * no. 3, June 1977
  57. *
  58. **************************************************************************/
  59. #include "ccsub.h"
  60. #include <stdio.h>
  61. find(m, nf, r, cep, ra, alpha, a, rc)
  62. int m, nf;
  63. float r[], cep[], ra[], *alpha, a[], rc[];
  64. {
  65.   int i, j;
  66.   float q, at;
  67.   
  68.   a[0] = 1.0;
  69.   if (r[0] == 0)
  70.   {
  71.     printf("find: r[0] = 0.0, resetting to 1e-6n");
  72.     r[0] = 1e-6;
  73.   }
  74.   rc[0] = a[1] = -r[1] / r[0];
  75.   *alpha = r[0] * (1.0 - a[1] * a[1]);
  76.   for (i = 2; i <= m; i++)
  77.   {
  78.     q = r[i];
  79.     for (j = 1; j < i; j++)
  80.       q += a[j] * r[i - j];
  81.     q = -q / *alpha;
  82.     rc[i - 1] = q;
  83.     for (j = 1; j <= i/2; j++)
  84.     {
  85.       at = a[j]+q*a[i - j];
  86.       a[i - j] += q * a[j];
  87.       a[j] = at;
  88.     }
  89.     a[i] = q;
  90.     *alpha *= (1.0 - q * q);
  91.     /*    *kill job if unstable filter */
  92.     if (*alpha <= 0.0)
  93.     {
  94.       fprintf(stderr, "find: unstable filtern");
  95.       exit(1);
  96.     }
  97.   }
  98.   /* *** evaluation of cepstrum */
  99.   cep[0] = a[1];
  100.   for (i = 2; i <= m; i++)
  101.   {
  102.     cep[i - 1] = (float)i * a[i];
  103.     for (j = 1; j < i; j++)
  104.       cep[i - 1] -= cep[j - 1] * a[i - j];
  105.   }
  106.   if (nf > m)
  107.   {
  108.     for (i = m ; i < nf; i++)
  109.     {
  110.       cep[i] = 0.0;
  111.       for (j = 1; j <= m; j++)
  112.         cep[i] -= cep[i - j]*a[j];
  113.     }
  114.     for (i = 0; i < nf; i++)
  115.       cep[i] = -cep[i] / (i + 1.0);
  116.   }
  117.   /* *** evaluation of polynomial autocorrelation */
  118.   for (i = 0; i <= m; i++)
  119.   
  120.   /*bug fix (see last reference) */
  121.   {
  122.     ra[i] = 0.0;
  123.     for (j = 0; j < m - i + 1; j++)
  124.       ra[i] += a[j] * a[i + j];
  125.   }
  126. }