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

语音压缩

开发平台:

C/C++

  1. /**************************************************************************
  2. *
  3. * ROUTINE
  4. * autohf
  5. *
  6. * FUNCTION
  7. * LPC autocorrelation analysis with high frequency compensation
  8. *
  9. *         NOTE:  If high frequency correction is not used (i.e., lambda=0),
  10. *                faster procedures may be used (e.g., Durbin's recursion
  11. *                      or LeRoux & Guegen fixed point method.
  12. *
  13. * SYNOPSIS
  14. * subroutine autohf(si, w, n, p, lambda, omega, a, rc)
  15. *
  16. *   formal 
  17. *                       data    I/O
  18. *       name            type    type    function
  19. *       -------------------------------------------------------------------
  20. * si(n) float i signal input
  21. * w(n) float i window (i.e., Hamming)
  22. * n int i length of input sequence
  23. * p int i order of LPC polynomial
  24. * lambda float i hF correction scale factor
  25. * omega float i bandwidth expansion factor
  26. * a float o LPC coefficients (1 to m+1)
  27. * rc float o reflection coefficients (1 to m)
  28. * (voiced-> +rc1)
  29. *
  30. *   external 
  31. *                       data    I/O
  32. *       name            type    type    function
  33. *       -------------------------------------------------------------------
  34. * frame int i
  35. *
  36. ***************************************************************************
  37. *
  38. * DESCRIPTION
  39. *
  40. *   Subroutine to perform HF corrected autocorrelation LPC analysis.
  41. * First, autocorrelation coefficients are calculated and high
  42. * frequency corrected to partially compensate for the analog
  43. * antialiasing filter*.  (Traditionally, this technique has only been
  44. * applied to covariance analysis, but it applies to autocorrelation
  45. * analysis as well).  Next, the autocorrelation function is converted
  46. * to reflection coefficients by the Schur recursion (aka LeRoux &
  47. * Guegen).  Then, the reflection coefficients are converted to LPC
  48. * predictor coefficients.  Finally, the predictors are bandwidth
  49. * expanded by omega.
  50. *
  51. * CELP's LPC predictor coefficient convention is:
  52. *              p+1         -(i-1)
  53. *       A(z) = SUM   a   z          where a  = +1.0
  54. *              i=1    i                    1
  55. *
  56. * The sign convention used defines the first reflection coefficient
  57. * as the normalized first autocorrelation coefficient, which results
  58. * in positive values of rc(1) for voiced speech.
  59. *
  60. ***************************************************************************
  61. *
  62. * CALLED BY
  63. *
  64. * celp
  65. *
  66. * CALLS
  67. *
  68. * actorc bwexp cor pctorc rctopc
  69. *
  70. ***************************************************************************
  71. *
  72. * REFERENCES
  73. *
  74. * *Atal & Schroeder, Predictive Coding of Speech Signals
  75. *  and Subjective Error Criteria, IEEE TASSP, June 1979.
  76. *
  77. **************************************************************************/
  78. #define TRUE 1
  79. #define FALSE 0
  80. #include <math.h>
  81. #include <stdio.h>
  82. #include "ccsub.h"
  83. extern int frame;
  84. autohf(si, w, n, p, lambda, omega, a, rc)
  85. int n, p;
  86. float si[], w[], lambda, omega, a[], rc[];
  87. {
  88.   int i, unstable;
  89.   float c0, c[MAXNO], alpha, lemin, atemp[MAXNO+1], s[MAXLL];
  90.   
  91.   setr(MAXNO+1, 0.0, atemp);
  92.   for (i = 0;  i < n ; i++)
  93.     s[i] = si[i] * w[i]; /* apply window */
  94.   unstable = FALSE;
  95.   cor(s, n, p, &c0, c); /* calculate autocorrelations */
  96.   if (c0 < 0.0) 
  97.     unstable = TRUE;
  98.   actorc(c0, c, rc, p, &alpha); /* convert autocorrelations */
  99.    /* to rc's */
  100.   lemin = lambda * c0 * alpha; /* unnormalized prediction  */
  101.    /* error scaled by lambda */
  102.   c0 = c0 + 0.375 * lemin;
  103.   c[0] = c[0] - 0.25 * lemin; /* high frequency correction */
  104.   c[1] = c[1] + 0.0625 * lemin; /* (eq. 16 Atal & Schroeder) */
  105.   actorc(c0, c, rc, p, &alpha); /* convert corrected */
  106.    /* autocorrelations to rc's */
  107.   rctopc(rc, atemp, p); /*convert corrected rc's to pc's*/
  108.   bwexp(omega, atemp, a, p); /* expand corrected pc's */
  109.   pctorc(a, rc, p); /* match rc's to expanded pc's */
  110.    /* and test for stability */
  111.   for (i = 0; i < p ; i++)
  112.   {
  113.     if (fabs(rc[i]) > 1.0)
  114.       unstable = TRUE;
  115.   }
  116.   if (unstable)
  117.   {
  118.     printf("autohf:  unstable lpc analysis at frame %dn",frame);
  119.     for (i = 0; i < p; i++)
  120.     {
  121.       a[i+1] = 0.0;
  122.       rc[i] = 0.0;
  123.     }
  124.   }
  125. }