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

语音压缩

开发平台:

Unix_Linux

  1. c==========================================================================
  2. c
  3. c NAME
  4. c pctolsp2 
  5. c
  6. c FUNCTION
  7. c
  8. c Compute LSP from predictor polynomial.
  9. c
  10. c NOTE:  Much faster conversion can be performed
  11. c        if the LSP quantization is incorporated.
  12. c
  13. c SYNOPSIS
  14. c
  15. c subroutine pctolsp2(a,m,freq,lspflag)
  16. c
  17. c   formal 
  18. c                       data I/O
  19. c name type type function
  20. c -------------------------------------------------------------------
  21. c a real i a-polynomial a(0)=1
  22. c m int i order of a
  23. c freq real o lsp frequencies
  24. c lspflag logical o ill-conditioned lsp test
  25. c n int na grid points in search of zeros
  26. c of p-polynomials
  27. c eps real na precision for computing zeros
  28. c nb int na iteration limit?
  29. c
  30. c==========================================================================
  31. c
  32. c DESCRIPTION
  33. c
  34. c   Compute lsp frequencies by disection method as described in:
  35. c
  36. c Line Spectrum Pair (LSP) and Speech Data Compression,
  37. c F.K. Soong and B-H Juang,
  38. c       Proc. ICASSP 84, pp. 1.10.1-1.10.4
  39. c
  40. c CELP's LPC predictor coefficient convention is:
  41. c              p+1         -(i-1)
  42. c       A(z) = SUM   a   z          where a  = +1.0
  43. c              i=1    i                    1
  44. c
  45. c Kroon uses n=128, eps=1.e-06, nb=15 (this appears to be overkill!)
  46. c
  47. c**************************************************************************
  48. c-
  49. subroutine pctolsp2(a,m,freq,lspflag)
  50. c
  51. implicit undefined(a-z)
  52. integer m, maxord
  53. parameter (maxord=24)
  54. real freq(maxord), a(0:m)
  55. real p(maxord), q(maxord), lastfreq(maxord)
  56. real pi, df, ang, fm, tempfreq
  57. real fr, pxr, tpxr, tfr, pxm, pxl
  58. real fl, qxl, tqxr, tfl, qxm, qxr, tqxl
  59. integer mp, mh, rn, nf, mb, jc, i, j
  60. logical lspflag
  61. integer n, nb
  62. real eps
  63. parameter (n = 128)
  64. parameter (nb = 15)
  65. parameter (eps = 1.e-6)
  66. save lastfreq
  67. c
  68. pi=atan(1.)*4.
  69. mp=m+1
  70. mh=m/2
  71. rn=n
  72. c  generate p and q polynomials
  73. do 20 i=1,mh
  74.    p(i)=a(i)+a(m-i+1)
  75.    q(i)=a(i)-a(m-i+1)
  76. 20 continue
  77. c  compute p at f=0.
  78. fl=0.
  79. pxl=1.
  80. do 30 j=1,mh
  81.    pxl=pxl+p(j)
  82. 30 continue
  83. c  search for zeros of p
  84. nf=1
  85. df=.5/rn
  86. do 100 i=1,n
  87.    mb=0
  88.    fr=i*df
  89.    pxr=cos(mp*pi*fr)
  90.    do 80 j=1,mh
  91.       jc=mp-j*2
  92.       ang=jc*pi*fr
  93.       pxr=pxr+cos(ang)*p(j)
  94. 80    continue
  95.    tpxr=pxr
  96.    tfr=fr
  97.    if(pxl*pxr.gt.0.)go to 95
  98. 85    mb=mb+1
  99.    fm=fl+(fr-fl)/(pxl-pxr)*pxl
  100.    pxm=cos(mp*pi*fm)
  101.    do 90 j=1,mh
  102.       jc=mp-j*2
  103.       ang=jc*pi*fm
  104.       pxm=pxm+cos(ang)*p(j)
  105. 90    continue
  106.    if(pxm*pxl.gt.0.)then
  107.         pxl=pxm
  108.       fl=fm
  109.    else
  110.       pxr=pxm
  111.       fr=fm
  112.    endif
  113.    if(abs(pxm).gt.eps.and.mb.lt.4)go to 85
  114.    if ((pxl-pxr)*pxl .eq. 0) then
  115.       do 92 j=1,m
  116.  freq(j)=j*0.04545
  117. 92       continue
  118.       print *,' pctolsp2:  default lsps used, avoiding /0'
  119.       return
  120.    end if
  121.    freq(nf)=fl+(fr-fl)/(pxl-pxr)*pxl
  122.    nf=nf+2
  123.    if(nf.gt.m-1)go to 120
  124. 95    pxl=tpxr
  125.    fl=tfr
  126. 100 continue
  127. c  search for the zeros of q(z)
  128. 120 continue
  129. freq(m+1)=.5
  130. fl=freq(1)
  131. qxl=sin(mp*pi*fl)
  132. do 150 j=1,mh
  133.    jc=mp-j*2
  134.    ang=jc*pi*fl
  135.    qxl=qxl+sin(ang)*q(j)
  136. 150 continue
  137. do 200 i=3,mp,2
  138.    mb=0
  139.    fr=freq(i)
  140.    qxr=sin(mp*pi*fr)
  141.    do 155 j=1,mh
  142.       jc=mp-j*2
  143.       ang=jc*pi*fr
  144.       qxr=qxr+sin(ang)*q(j)
  145. 155    continue
  146.    tfl=fl
  147.    tqxl=qxl
  148.    tfr=fr
  149.    tqxr=qxr
  150. 160    mb=mb+1
  151.    fm=(fl+fr)*.5
  152.    qxm=sin(mp*pi*fm)
  153.    do 180 j=1,mh
  154.       jc=mp-j*2
  155.       ang=jc*pi*fm
  156.       qxm=qxm+sin(ang)*q(j)
  157. 180    continue
  158.    if(qxm*qxl.gt.0.)then
  159.       qxl=qxm
  160.       fl=fm
  161.    else
  162.       qxr=qxm
  163.       fr=fm
  164.    endif
  165.    if(abs(qxm).gt.eps*tqxl.and.mb.lt.nb)go to 160
  166.    if ((qxl-qxr)*qxl .eq. 0) then
  167.       do 93 j=1,m
  168.  freq(j)=lastfreq(j)
  169. 93       continue
  170.       print *,' pctolsp2:  last lsps used, avoiding /0'
  171.       return
  172.    end if
  173.    freq(i-1)=fl+(fr-fl)/(qxl-qxr)*qxl
  174.    fl=tfr
  175.    qxl=tqxr
  176. 200 continue
  177. c
  178. c *** ill-conditioned cases
  179. c
  180. lspflag = .false.
  181. if (freq(1) .eq. 0.0 .or. freq(1) .eq. 0.5) lspflag = .true.
  182. do 300 i = 2, m
  183.    if (freq(i) .eq. 0.0 .or. freq(i) .eq. 0.5) lspflag = .true.
  184. c *reorder lsps if non-monotonic
  185.    if (freq(i) .lt. freq(i-1)) then
  186.       lspflag = .true.
  187.       print *,' pctolsp2:  non-monotonic lsps'
  188.       tempfreq = freq(i)
  189.       freq(i) = freq(i-1)
  190.       freq(i-1) = tempfreq
  191.    end if
  192. 300 continue
  193. c *if non-monotonic after 1st pass, reset to last values
  194. do 310 i=2, m
  195.    if (freq(i) .lt. freq(i-1)) then
  196.       print *,' pctolsp2:  Reset to previous lsp values'
  197.       do 320 j=1, m
  198.          freq(j) = lastfreq(j)
  199. 320       continue
  200.       goto 325
  201.    end if
  202. 310 continue
  203. 325 do 330 i=1,m
  204.    lastfreq(i) = freq(i)
  205. 330 continue
  206. return
  207. end