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

语音压缩

开发平台:

Unix_Linux

  1. C==========================================================================
  2. C
  3. C ROUTINE
  4. C delay
  5. C
  6. C FUNCTION
  7. C Time delay a bandlimited signal
  8. C using point-by-point recursion
  9. C
  10. C SYNOPSIS
  11. C subroutine delay(x, bufr, start, n, d, m, y)
  12. C
  13. C   formal 
  14. C                       data    I/O
  15. C       name            type    type    function
  16. C       -------------------------------------------------------------------
  17. C x(n) real i signal input (output in last 60)
  18. C bufr int i length of input sequence x(n)
  19. C start int i beginning of output sequence
  20. C n int i length of output sequence
  21. C d real i fractional pitch
  22. C m int i integer pitch
  23. C y(n) real o delayed input signal
  24. C==========================================================================
  25. C
  26. C DESCRIPTION
  27. C
  28. C Subroutine to time delay a bandlimited signal by resampling the
  29. C reconstructed data (aka sinc interpolation).  The well known
  30. C reconstruction formula is:
  31. C
  32. C              |    M2      sin[pi(t-nT)/T]    M2
  33. C   y(n) = X(t)| = SUM x(n) --------------- = SUM x(n) sinc[(t-nT)/T]
  34. C              |   n=M1         pi(t-nT)/T    n=M1
  35. C              |t=n+d
  36. C
  37. C The interpolating (sinc) function is Hamming windowed to bandlimit
  38. C the signal to reduce aliasing.
  39. C
  40. C Multiple simultaneous time delays may be efficiently calculated
  41. C by polyphase filtering.  Polyphase filters decimate the unused
  42. C filter coefficients.  See Chapter 6 in C&R for details. 
  43. C==========================================================================
  44. C
  45. C REFERENCES
  46. C
  47. C Crochiere & Rabiner, Multirate Digital Signal Processing,
  48. C P-H 1983, Chapters 2 and 6.
  49. C
  50. C Kroon & Atal, "Pitch Predictors with High Temporal Resolution,"
  51. C ICASSP '90, S12.6
  52. C
  53. C**************************************************************************
  54. C
  55. subroutine delay(x, bufr, start, n, d, m, y)
  56. implicit undefined(a-z)
  57. integer n, bufr, start
  58. real x(bufr), y(0:n-1), d
  59. integer nfrac, i, j, k, m, qd, M1, M2
  60. c * 5 fractional delays calculated over an 8 point interpolation (-4 to 3)
  61. parameter (nfrac = 5, M1 = -4, M2 = 3)
  62. integer twelfths(nfrac)
  63. real sinc, wsinc(M1:M2, nfrac), hwin(12*M1:12*(M2+1)), frac(nfrac)
  64. logical first
  65. c
  66. save first, hwin, wsinc
  67. c
  68. data first /.true./
  69. data twelfths/3,    4,          6,   8,          9/
  70. data frac/    0.25, 0.33333333, 0.5, 0.66666667, 0.75/
  71. c
  72. c Generate Hamming windowed sinc interpolating function
  73. c for each allowable fraction.  The interpolating functions
  74. c are stored in time reverse order (i.e., delay appears as
  75. c advance) to align with the adaptive code book v0 array.
  76. c The interp filters are:
  77. c wsinc(.,1) frac = 1/4 (3/12)
  78. c wsinc(.,2) frac = 1/3 (4/12)
  79. c . .
  80. c wsinc(.,5) frac = 3/4 (9/12)
  81. c
  82. if (first) then
  83.    call ham(hwin, 12*(M2-M1+1)+1)
  84.    do 20 i = 1, nfrac
  85.       do 10 j = M1, M2
  86.          wsinc(j,i) = sinc(frac(i)+j)*hwin(12*j+twelfths(i))
  87. 10       continue
  88. 20    continue
  89.    first = .false.
  90. end if
  91. c
  92. k=qd(d)
  93. c
  94. c Resample:
  95. do 80 i = 0, n-1
  96.    x(start+i) = 0.0
  97.    do 70 j = M1, M2
  98.       x(start+i) = x(start+i) + x(start-m+i+j)*wsinc(j,k)
  99. 70    continue
  100. 80 continue
  101. c
  102. c The v0 array in psearch.F/pgain.f must be zero above "start"
  103. c because of overlap and add convolution techniques used in pgain.
  104. c
  105. do 100 i = 0, n-1
  106.    y(i) = x(start + i)
  107.    x(start + i) = 0
  108. 100 continue
  109. return
  110. end
  111. c
  112. c Sinc function
  113. c
  114. function sinc(arg)
  115. implicit undefined(a-z)
  116. real sinc, arg, pi
  117. pi = 4.0*atan(1.0)
  118. if (arg .eq. 0.0) then
  119.    sinc = 1.0
  120. else
  121.    sinc = sin(pi*arg)/(pi*arg)
  122. end if
  123. return
  124. end
  125. c
  126. c Quantize d function 
  127. c
  128. function qd(d)
  129. implicit undefined(a-z)
  130. real d
  131. integer qd, i, k, nfrac
  132. parameter (nfrac = 5)
  133. real frac(nfrac)
  134. logical ok
  135. data frac/0.25, 0.33333333, 0.5, 0.66666667, 0.75/
  136. c
  137. ok = .false.
  138. do 50 i = 1, nfrac
  139.    if (abs(d-frac(i)) .lt. 1.e-2) then
  140.       k = i
  141.       ok = .true.
  142.    end if
  143. 50 continue
  144. if (.not. ok) then
  145.    print *,'delay.f:  Invalid pitch delay = ',d
  146.    stop
  147. end if
  148. qd=k
  149. return
  150. end
  151. c