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

语音压缩

开发平台:

Unix_Linux

  1. c==========================================================================
  2. c
  3. c ROUTINE
  4. c intsynth
  5. c
  6. c FUNCTION
  7. c Linearly interpolate between transmitted LSPs
  8. c to generate nn (=4) intermediate sets of LSP
  9. c frequencies for subframe synthesis. 
  10. c
  11. c
  12. c SYNOPSIS
  13. c subroutine intsynth(lspnew, nn, lsp, twoerror, syndavg, predgain
  14. c delta, avg, mini)
  15. c
  16. c   formal 
  17. c
  18. c                       data    I/O
  19. c       name            type    type    function
  20. c       -------------------------------------------------------------------
  21. c lspnew real i/o new frequency array
  22. c nn int i number of segments/frame
  23. c lsp real o interpolated frequency matrix
  24. c twoerror log i flag for occurrence of two errors
  25. c   in Hamming protected bits.
  26. c syndavg real i bit error estimation parameter
  27. c predgain real o prediction predgain
  28. c delta real o delta from last frame pred. predgain
  29. c avg real o average predition predgain
  30. c mini real o minimum lsp separation
  31. c
  32. c   global 
  33. c                       data    I/O
  34. c       name            type    type    function
  35. c       -------------------------------------------------------------------
  36. c  /ccsub/       see description include file
  37. c
  38. c==========================================================================
  39. c
  40. c DESCRIPTION
  41. c This routine interpolates lsp's for subframe synthesis.
  42. c This version is only for use with absolute scalar LSP coding!
  43. c The interpolated LSPs are identical to the interpolated set in 
  44. c transmitter provided there are no transmission errors.  If the 
  45. c LSP's are nonmonotonic, then LSP errors have occured and an 
  46. c attempt is made to "fix" them by repeating previous LSP values. 
  47. c If this correction fails (the vector is still nonomonotonic), 
  48. c then the entire previous LSP vector is repeated.  (This version 
  49. c ignores twoerror and syndavg.)
  50. c
  51. c**************************************************************************
  52. c
  53. subroutine intsynth(lspnew, nn, lsp, twoerror, syndavg, predgain,
  54.      & delta, avg, mini)
  55. c
  56. implicit undefined(a-z)
  57. include 'ccsub.com'
  58. convex #include "ccsub.com"
  59. integer nn
  60. real lspnew(no), lsp(maxno, nn), syndavg
  61. integer i, j, jj, index
  62. logical twoerror, nonmono
  63. real lspold(maxno), w(2, 4)
  64. c
  65. data w/0.875, 0.125,
  66.      &         0.625, 0.375, 
  67.      &         0.375, 0.625, 
  68.      &         0.125, 0.875/
  69. c
  70. save lspold, oldpredgain
  71. cSAVE save avg {if not passing to main routine}
  72. real temp(maxno+1),rc(maxno),predgain,oldpredgain
  73. real delta,avg,dlsp(maxno+1),mini
  74. c
  75. data lspold  /.03,.05,.09,.13,.19,.23,.29,.33,.39,.44/
  76. c
  77. c *try to fix any nonmonotonic LSPs by repeating pair
  78. do 10 i = 2, no
  79.    if (lspnew(i) .le. lspnew(i-1)) then
  80.       print *,' intsynth:  try to fix any nonmonotonic LSPs'
  81.       lspnew(i) = lspold(i)
  82.       lspnew(i-1) = lspold(i-1)
  83.    end if
  84. 10 continue
  85. c
  86. c *check fixed LSPs (also check for pairs too close?)
  87. nonmono = .false.
  88. do 20 i = 2, no
  89.    if (lspnew(i) .le. lspnew(i-1)) nonmono = .true.
  90. 20 continue
  91. c
  92. c *if fix fails, repeat entire LSP vector
  93. if (nonmono) then
  94.    print *,' intsynth:  repeat entire LSP vector'
  95.    print *,' syndavg=',syndavg,' twoerror=',twoerror,' frame=',frame
  96.    print *,' lspold       ', ' lspnew'
  97.    do 30 i = 1, no
  98.       print *, lspold(i), lspnew(i)
  99. 30    continue
  100.    do 40 i = 1, no
  101.       lspnew(i) = lspold(i)
  102. 40    continue
  103. end if
  104. c.......................*OPTIONAL (and not finished):
  105. c *if large prediction gain then
  106. c *repeat close LSP pair(s)
  107. j=0
  108. 69 j = j+1
  109. call lsptopc(lspnew,temp)
  110. call pctorc(temp,rc,no)
  111. predgain = 1.
  112. do 55 i = 1, no
  113.    predgain = predgain*(1.-rc(i)**2)
  114. 55 continue
  115. delta = predgain-oldpredgain
  116. c *check predgain & delta predgain
  117. CCCC if (predgain .gt. ---- .or. delta .gt. ...
  118. c *find index to minimum lsp difference
  119.    do 56 i = 2, no
  120.       dlsp(i)=lspnew(i)-lspnew(i-1)
  121. 56    continue
  122.    dlsp(1)=lspnew(1)
  123.    dlsp(no+1)=0.5-lspnew(no)
  124.    mini=1.
  125.    do 58 i = 1, no+1
  126.       if(dlsp(i) .lt. mini) then
  127.          mini=dlsp(i)
  128.          index=i
  129.       end if
  130. 58    continue
  131. CCCC    print *,' repeating close LSPs of index',index,'at frame',frame,j
  132. CCCC    if (index .eq. 1 .or. index .eq. no+1) then
  133. CCCC       lspnew(index) = lspold(index)
  134. CCCC    else     
  135. CCCC       lspnew(index) = lspold(index)
  136. CCCC       lspnew(index-1) = lspold(index-1)
  137. c *recheck
  138. CCCC    if (j .lt. no) goto 69
  139. CCCC end if
  140. avg = .95*avg + .05*predgain
  141. oldpredgain = predgain
  142. c.......................
  143. c
  144. c *interpolate lsp's
  145. do 100 i = 1, nn
  146.    do 50 j = 1, no
  147.       lsp(j,i) = w(1,i)*lspold(j)+w(2,i)*lspnew(j)
  148. 50    continue
  149. c
  150. c.......................*OPTIONAL bug checker
  151. c *check for monotonically increasing lsp's
  152.    nonmono = .false.
  153.    do 60 j = 2, no
  154.       if (lsp(j,i) .le. lsp(j-1,i)) nonmono = .true.
  155. 60    continue
  156.    if (nonmono) then
  157.       print *,' intsynth:  nonmono LSPs@frame',frame,'CANN''T HAPPEN'
  158.       print *,'LSPs=',(lsp(jj,i),jj=1,no)
  159.    end if
  160. 100 continue
  161. c.......................
  162. c
  163. c *update lsp history
  164. do 200 i = 1, no
  165.       lspold(i)  = lspnew(i)
  166. 200 continue
  167. return 
  168. end