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

语音压缩

开发平台:

Unix_Linux

  1. c==========================================================================
  2. c
  3. c ROUTINE
  4. c intanaly
  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 analysis. 
  10. c
  11. c
  12. c SYNOPSIS
  13. c subroutine intanaly(lspnew, nn, lsp)
  14. c
  15. c   formal 
  16. c
  17. c                       data    I/O
  18. c       name            type    type    function
  19. c       -------------------------------------------------------------------
  20. c lspnew real i new frequency array
  21. c nn int i number of segments/frame
  22. c lsp real o interpolated frequency matrix
  23. c
  24. c   global 
  25. c                       data    I/O
  26. c       name            type    type    function
  27. c       -------------------------------------------------------------------
  28. c  /ccsub/       see description include file
  29. c
  30. c==========================================================================
  31. c
  32. c DESCRIPTION
  33. c This routine linearly interpolates lsp's for analysis in
  34. c nn (=4) subframes.  This is a combination of inter- and 
  35. c intra-frame interpolation.  There are two routines, one for the 
  36. c analyzer and one for the synthesizer.
  37. c
  38. c The lsps are interpolated from two transmitted frames,
  39. c  old and new.  The lsp interpolation is calculated as follows:
  40. c
  41. c superframe:        old                  new
  42. c  
  43. c  |                |              |
  44. c  |---------------------|---------------------|
  45. c  |                |              |
  46. c
  47. c        /
  48. c        /
  49. c
  50. c subframe:         1       2        3        4
  51. c      |                  |
  52. c        ...---|--------|--------|--------|--------|
  53. c      |                  |
  54. c   v       v        v        v
  55. c
  56. c weighting:
  57. c old:     7/8     5/8      3/8      1/8
  58. c new:     1/8     3/8      5/8      7/8
  59. c
  60. c Note: This is dependent on nn = ll/l = 4!
  61. c
  62. c**************************************************************************
  63. c
  64. subroutine intanaly(lspnew, nn, lsp)
  65. c
  66. implicit undefined(a-z)
  67. integer nn
  68. include 'ccsub.com'
  69. convex #include "ccsub.com"
  70. real lspnew(no), lsp(maxno, nn)
  71. integer i, j
  72. logical nonmono
  73. real lspold(maxno), oldlsp(maxno)
  74. real tempfreq, w(2, 4)
  75. c
  76. data w/0.875, 0.125,
  77.      &         0.625, 0.375, 
  78.      &         0.375, 0.625, 
  79.      &         0.125, 0.875/
  80. c
  81. save lspold, oldlsp
  82. c
  83. data lspold  /.03,.05,.09,.13,.19,.23,.29,.33,.39,.44/
  84. c
  85. do 100 i=1,nn
  86. c
  87. c *interpolate lsp's
  88.    do 20 j=1,no
  89.       lsp(j,i)=w(1,i)*lspold(j)+w(2,i)*lspnew(j)
  90. 20    continue
  91. c.......................*OPTIONAL bug checker
  92. c *check for monotonically increasing lsp's
  93. c *swap crossed LSPs
  94.    do 30 j=2,no
  95.       if (lsp(j,i) .le. lsp(j-1,i)) then
  96.          print *,' intanaly:  Swapping nonmono lsps @ frame', frame
  97.          tempfreq=lsp(j,i)
  98.          lsp(j,i)=lsp(j-1,i)
  99.          lsp(j-1,i)=tempfreq
  100.       end if
  101. 30    continue
  102. c
  103. c *recheck for monotonically increasing lsp's
  104. c *substitute old LSPs (they must be really messed up!)
  105.    nonmono = .false.
  106.    do 32 j=2,no
  107.       if (lsp(j,i) .le. lsp(j-1,i)) nonmono = .true.
  108. 32    continue
  109.    if (nonmono) then
  110.       print *,' intanaly:  Resetting interp LSP at frame', frame
  111.       do 34 j = 1, no
  112.          if (i .eq. 1) then
  113.             lsp(j,i)=oldlsp(j)
  114.          else
  115.             lsp(j,i)=lsp(j,i-1)
  116.          end if
  117. 34       continue
  118.    end if
  119. 100 continue
  120. c.......................
  121. c
  122. c *save lsp's for next pass
  123. do 40 i=1,no
  124.    lspold(i)=lspnew(i)
  125.    oldlsp(i)=lsp(i,nn)
  126. 40 continue
  127. return 
  128. end