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

语音压缩

开发平台:

Unix_Linux

  1. C==========================================================================
  2. C
  3. C ROUTINE
  4. C               pitchvq
  5. C
  6. C FUNCTION
  7. C               Pitch VQ (n-taps, where n = 0, ..., 3)
  8. C "self-excited" or "vq" or "adaptive code book"
  9. C
  10. C SYNOPSIS
  11. C               subroutine pitchvq(rar, idim, buf, idimb, b, type)
  12. C
  13. C   formal 
  14. C
  15. C                       data    I/O
  16. C       name            type    type    function
  17. C       -------------------------------------------------------------------
  18. C rar real i/o Data segement/Filtered data segment
  19. C idim int i Dimension of data segement RAR
  20. C buf real i Data buffer, dim IDIMB
  21. C idimb int i Dimension of data buffer is 
  22. C max(M) + IDIM+1
  23. C b(1) real i Pitch delay (M)
  24. C b(2-4) real i pitch predictor coefficients. 
  25. C BETA1=B(2),BETA2=B(3), BETA3=B(4)
  26. C For a 1-tap predictor B(2)=B(4)=0.0
  27. C type char i Type 'long' calls ldelay.f, the
  28. C delay routine using long 
  29. C interpolation windows.  Type 'short'
  30. C calls delay.f, the short delay
  31. C routine.
  32. C==========================================================================
  33. C       
  34. C USAGE
  35. C
  36. C    Adaptive code book (pitch) synthesis routine:
  37. C
  38. C    1) For lags < frame size:  gain-shape adaptive code book VQ
  39. C
  40. C    2) For lags => frame size this is equivalent to a pitch synthesis "filter"
  41. C
  42. C                              -[b(1)-1]        -b(1)        -[b(1)+1]
  43. C       H(z) =  1 /  1 + b(2) z         + b(3) z     + b(4) z
  44. C
  45. C       NOTE: largest delay must not exceed the value IDIMB-IDIM
  46. C
  47. c==========================================================================
  48. c
  49. c REFERENCES
  50. c
  51. c Singhal & Atal, Improving Performance of Multi-Pulse LPC Coders at
  52. c Low Bit Rates, ICASSP, 1984.
  53. c
  54. c Rose & Barnwell.  The Self Excited Vocoder-An Alternate Approach
  55. c to Toll Quality at 4800 bps, ICASSP, 1986, pp. 453-456.
  56. c
  57. c Kleijn, Krasinski and Ketchum, Improved Speech Quality and
  58. c Efficient Vector Quantization in SELP, ICASSP, 1988.
  59. c
  60. C**************************************************************************
  61. C*-
  62. subroutine pitchvq(rar, idim, buf, idimb, b, type)
  63. implicit undefined(a-z)
  64. integer idim, idimb
  65. character*(*) type
  66. real rar(idim), buf(idimb), b(4), frac
  67. include 'ccsub.h'
  68. convex #include "ccsub.h"
  69. integer k, m, i, start
  70. real buf2(maxlp)
  71. C
  72. k = idimb-idim
  73. start = k + 1
  74. m = int(b(1))
  75. frac = b(1)-m
  76. c
  77. c update memory
  78. c
  79. do 10 i = 1, k
  80.    buf(i) = buf(i+idim)
  81. 10 continue
  82. c
  83. c update memory with selected pitch memory
  84. c from selected delay (m)
  85. c
  86. if (abs(frac) .lt. 1.e-4) then
  87.    do 20 i = 1, idim
  88.       buf(i+k) = buf(i+k-m)
  89. 20    continue
  90. end if
  91. c
  92. c fractional update if fractional part isn't "zero"
  93. c
  94. if (abs(frac) .gt. 1.e-4) then
  95.    if (type.eq.'long') then
  96.       call ldelay(buf, idimb, start, idim, frac, m, buf2)
  97.    else
  98.       call delay(buf, idimb, start, idim, frac, m, buf2)
  99.    end if
  100.    do 30 i = 1, idim
  101.       buf(i+k) = buf2(i)
  102. 30    continue
  103. end if
  104. c
  105. c return "rar" with scaled memory added
  106. c to stochastic contribution
  107. c
  108. do 40 i = 1, idim
  109.    buf(i+k) = b(3)*buf(i+k) + rar(i)
  110.    rar(i)   = buf(i+k)
  111. 40 continue
  112. return
  113. end