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

语音压缩

开发平台:

Unix_Linux

  1. c==========================================================================
  2. c
  3. c ROUTINE
  4. c               lsp34
  5. c
  6. c FUNCTION
  7. c                
  8. c               independent nonuniform scalar line spectral pair quantizer
  9. c
  10. c SYNOPSIS
  11. c               subroutine lsp34(freq, no, bits, findex)
  12. c
  13. c   formal 
  14. c
  15. c                       data    I/O
  16. c       name            type    type    function
  17. c       -------------------------------------------------------------------
  18. c       freq real i/o input frequency array/
  19. c output quantized frequency array
  20. c no int i order
  21. c bits int i bit allocation
  22. c findex int o frequency index array
  23. c
  24. c
  25. c==========================================================================
  26. c
  27. c DESCRIPTION
  28. c
  29. c Independent (nondifferential) scalar LSP quantization.  Determine
  30. c LSP quantization by refined sequential quantization.  Because the
  31. c quantization tables overlap, sequential quantization can produce a
  32. c nonmonotonic LSP vector.  For nonmonotinic LSPs, the quantization
  33. c is refined by adjusting the quantization for minimum error by
  34. c selecting 1 of the following 2 cases:
  35. c 1.  Quantize current LSP to next higher level
  36. c 2.  Quantize previous LSP to the next lower level
  37. c
  38. C==========================================================================
  39. C INPUT FILES
  40. C lsp34.tbl spectrum (34 bit LSP) coding
  41. C
  42. c**************************************************************************
  43. c
  44. subroutine lsp34(freq, no, bits, findex)
  45. c
  46. implicit undefined (a-z)
  47. include 'ccsub.h'
  48. convex #include "ccsub.h"
  49. c
  50. integer no
  51. integer findex(no), bits(no)
  52. real freq(maxno+1)
  53. real outputs(0:15), errorup, errordn
  54. integer fs, lsp(10, 0:15), levels, i, j
  55. parameter (fs = 8000)
  56. c
  57. include './lsp34.tbl'
  58. convex #include "./lsp34.table"
  59. c
  60. c *sequentially find closest quantized LSP indicies
  61. do 100 i = 1, no
  62.    freq(i) = float(fs)*freq(i)
  63.    levels  = 2**bits(i) - 1
  64.    do 20 j = 0, levels
  65.       outputs(j) = lsp(i, j)
  66. 20    continue
  67.    call quantize(freq(i), outputs, 2**bits(i), findex(i))
  68. c
  69. c *adjust quantization if nonmonotonically quantized
  70. c *find minimum quantization error adjustment
  71.    if (i .ge. 2) then
  72.       if (lsp(i,findex(i)) .le. lsp(i-1,findex(i-1))) then
  73.  errorup = abs(freq(i)   - lsp(i,  min(findex(i)+1,levels)))+
  74.      &            abs(freq(i-1) - lsp(i-1,findex(i-1)))
  75.  errordn = abs(freq(i)   - lsp(i,  findex(i)))              +
  76.      &    abs(freq(i-1) - lsp(i-1,max(findex(i-1)-1,0)))
  77. c
  78. c *adjust index for minimum error
  79. c *(and preserve monotonicity!) 
  80.  if (errorup .lt. errordn) then
  81.     findex(i) = min(findex(i)+1, levels)
  82. C new stuff
  83.          do 40 while 
  84.      &        (lsp(i,findex(i)).lt.lsp(i-1,findex(i-1)))
  85.           findex(i) = min(findex(i)+1, levels)
  86. 40     continue
  87. C end of new stuff
  88.  else
  89.     if (i .eq. 2) then
  90.                findex(i-1) = max(findex(i-1)-1, 0)
  91.             else
  92.                if (lsp(i-1, max(findex(i-1)-1,0)) .gt.
  93.      &                    lsp(i-2, findex(i-2))) then
  94.                   findex(i-1) = max(findex(i-1)-1, 0)
  95.                else
  96.           findex(i) = min(findex(i)+1, levels)
  97. C new stuff
  98.   do 30 while 
  99.      &     (lsp(i,findex(i)).lt.lsp(i-1,findex(i-1)))
  100.        findex(i) = min(findex(i)+1, levels)
  101. 30   continue
  102. C end of new stuff
  103.                end if
  104.     
  105.             end if
  106.  end if
  107.       end if
  108.    end if
  109. 100 continue
  110. c
  111. c *quantize lsp frequencies using indicies found above
  112. do 200 i = 1, no
  113.    freq(i) = lsp(i, findex(i))/float(fs)
  114. 200 continue
  115. return
  116. end