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

语音压缩

开发平台:

Unix_Linux

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