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

语音压缩

开发平台:

Unix_Linux

  1. c==========================================================================
  2. c
  3. c NAME
  4. c lsptopc 
  5. c
  6. c FUNCTION
  7. c
  8. c convert lsp frequencies to predictor coefficients
  9. c
  10. c SYNOPSIS
  11. c
  12. c subroutine lsptopc(f, pc)
  13. c   formal
  14. c data I/O
  15. c name type type function
  16. c -------------------------------------------------------------------
  17. c f real i lsp frequencies
  18. c pc real o LPC predictor coefficients
  19. c
  20. c   global 
  21. c                       data    I/O
  22. c       name            type    type    function
  23. c       -------------------------------------------------------------------
  24. c  /ccsub/       see description include file
  25. c
  26. c==========================================================================
  27. c
  28. c DESCRIPTION
  29. c
  30. c LSPTOPC converts line spectral frequencies to LPC predictor 
  31. c coefficients.  
  32. c
  33. c The analysis filter may be reconstructed:
  34. c
  35. c A(z) = 1/2 [ P(z) + Q(z) ]
  36. c
  37. c CELP's LPC predictor coefficient convention is:
  38. c              p+1         -(i-1)
  39. c       A(z) = SUM   a   z          where a  = +1.0
  40. c              i=1    i                    1
  41. c
  42. c**************************************************************************
  43. c-
  44. subroutine lsptopc(f, pc)
  45. implicit undefined(a-z)
  46. include 'ccsub.com'
  47. convex #include "ccsub.com"
  48. c
  49. real f(maxno),pc(maxno+1)
  50. real freq(maxno),p(maxno/2),q(maxno/2)
  51. real a(maxno/2+1),a1(maxno/2+1),a2(maxno/2+1)
  52. real b(maxno/2+1),b1(maxno/2+1),b2(maxno/2+1)
  53. real pi,xx,xf
  54. integer i,j,k,noh
  55. logical lspflag
  56. c
  57. c *** check input for ill-conditioned cases
  58. c
  59. if (f(1).le.0.0 .or. f(1).ge.0.5) print *,' lsptopc:  ',
  60.      & 'LSPs out of bounds; f(1)=',f(1),' at frame', frame
  61. lspflag = .false.
  62. do 69 i = 2, no
  63.    if (f(i) .le. f(i-1)) lspflag = .true.
  64.    if (f(i).le.0.0 .or. f(i).ge.0.5) print *,' lsptopc:  ',
  65.      &    'LSPs out of bounds; f(',i,')=',f(i),' at frame', frame
  66. 69 continue
  67. if (lspflag) print *,' lsptopc:  nonmonotonic LSPs at frame', frame
  68. c
  69. c *** initialization
  70. c
  71. pi=4.*atan(1.)
  72. noh=no/2
  73. do 10 j=1,no
  74.    freq(j)=f(j)
  75. 10 continue
  76. do 100 i=1,noh+1
  77.    a(i) =0.
  78.    a1(i)=0.
  79.    a2(i)=0.
  80.    b(i) =0.
  81.    b1(i)=0.
  82.    b2(i)=0.
  83. 100 continue
  84. c
  85. c *** lsp filter parameters
  86. c
  87. do 110 i=1,noh
  88.    p(i)=-2.*cos(2.*pi*freq(2*i-1))
  89.    q(i)=-2.*cos(2.*pi*freq(2*i))
  90. 110 continue
  91. c
  92. c *** impulse response of analysis filter
  93. c
  94. xf = 0.
  95. do 120 k=1,no+1
  96.    xx=0.
  97.    if (k.eq.1) xx=1.
  98.    a(1)=xx+xf
  99.    b(1)=xx-xf
  100.    xf=xx
  101.    do 130 i=1,noh
  102.       a(i+1)=a(i)+p(i)*a1(i)+a2(i)
  103.       b(i+1)=b(i)+q(i)*b1(i)+b2(i)
  104.       a2(i)=a1(i)
  105.       a1(i)=a(i)
  106.       b2(i)=b1(i)
  107.       b1(i)=b(i)
  108. 130    continue
  109.    if (k.eq.1) go to 120
  110.    pc(k-1)=-.5*(a(noh+1)+b(noh+1))
  111. 120 continue
  112. c
  113. c *** convert to CELP's predictor coefficient array configuration
  114. c
  115. do 140 i = no, 1, -1
  116.    pc(i+1) = -pc(i)
  117. 140 continue
  118. pc(1)=1.
  119. return
  120. end