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

语音压缩

开发平台:

Unix_Linux

  1. C==========================================================================
  2. C
  3. C ROUTINE
  4. C ldelay_nr
  5. C
  6. C FUNCTION
  7. C Time delay a bandlimited signal
  8. C using blockwise recursion (aka "nonrecursive")
  9. C with a long interpolation filter (see delay_nr.f)
  10. C
  11. C SYNOPSIS
  12. C subroutine ldelay_nr(x, bufr, start, n, d, m, y)
  13. C
  14. C   formal 
  15. C                       data    I/O
  16. C       name            type    type    function
  17. C       -------------------------------------------------------------------
  18. C x(n) real i signal input
  19. C bufr int i length of input sequence x(n)
  20. C start int i beginning of output sequence
  21. C n int i length of input sequence
  22. C d real i fractional pitch
  23. C m int i integer pitch
  24. C y(n) real o delayed input signal
  25. C==========================================================================
  26. C
  27. C DESCRIPTION
  28. C
  29. C Subroutine to time delay a bandlimited signal by resampling the
  30. C reconstructed data (aka sinc interpolation).  The well known
  31. C reconstruction formula is:
  32. C
  33. C              |    M2      sin[pi(t-nT)/T]    M2
  34. C   y(n) = X(t)| = SUM x(n) --------------- = SUM x(n) sinc[(t-nT)/T]
  35. C              |   n=M1         pi(t-nT)/T    n=M1
  36. C              |t=n+d
  37. C
  38. C The interpolating (sinc) function is Hamming windowed to bandlimit
  39. C the signal to reduce aliasing.
  40. C
  41. C Multiple simultaneous time delays may be efficiently calculated
  42. C by polyphase filtering.  Polyphase filters decimate the unused
  43. C filter coefficients.  See Chapter 6 in C&R for details. 
  44. C==========================================================================
  45. C
  46. C REFERENCES
  47. C
  48. C Crochiere & Rabiner, Multirate Digital Signal Processing,
  49. C P-H 1983, Chapters 2 and 6.
  50. C
  51. C Kroon & Atal, "Pitch Predictors with High Temporal Resolution,"
  52. C ICASSP '90, S12.6
  53. C
  54. C
  55. C**************************************************************************
  56. C
  57. subroutine ldelay_nr(x, bufr, start, n, d, m, y)
  58. implicit undefined(a-z)
  59. include 'ccsub.h'
  60. convex #include "ccsub.h"
  61. integer n, bufr, start
  62. real x(bufr), y(0:n-1), d, pitch, pitch2, pitch3
  63. integer nfrac, i, j, k, k2, k3, m, mtwo, qd_nr, M1, M2
  64. c * 5 fractional delays plus zero delay = 6
  65. parameter (nfrac = 6, M1 = -10, M2 = 9)
  66. integer twelfths(nfrac)
  67. real sinc, wsinc(M1:M2, nfrac), hwin(12*M1:12*(M2+1)), frac(nfrac)
  68. logical first
  69. c
  70. save first, hwin, wsinc
  71. c
  72. data first /.true./
  73. data twelfths/3,    4,          6,   8,          9,    0/
  74. data frac/    0.25, 0.33333333, 0.5, 0.66666667, 0.75, 0.0/
  75. c
  76. c Generate Hamming windowed sinc interpolating function
  77. c for each allowable fraction.  The interpolating functions
  78. c are stored in time reverse order (i.e., delay appears as
  79. c advance) to allign with the adaptive code book v0 array.
  80. c The interp filters are:
  81. c wsinc(.,1) frac = 1/4 (3/12)
  82. c wsinc(.,2) frac = 1/3 (4/12)
  83. c . .
  84. c wsinc(.,5) frac = 3/4 (9/12)
  85. c wsinc(.,6) frac = 0   zero delay for programming ease
  86. c
  87. if (first) then
  88.    call ham(hwin, 12*(M2-M1+1)+1)
  89.    do 20 i = 1, nfrac
  90.       do 10 j = M1, M2
  91.          wsinc(j,i) = sinc(frac(i)+j)*hwin(12*j+twelfths(i))
  92. 10       continue
  93. 20    continue
  94.    first = .false.
  95. end if
  96. c
  97. k=qd_nr(d)
  98. c
  99. c Resample:
  100. c
  101. c If delay is greater than n (=60), then lay down n values at 
  102. c the appropriate delay.
  103. if (m .ge. n) then
  104.    do 80 i = 0, n-1+M1
  105.       y(i) = 0.0
  106.       do 70 j = M1, M2
  107.          y(i) = y(i) + x(i+j+start-m)*wsinc(j,k)
  108. 70       continue
  109. 80    continue
  110.    do 81 i=0,M2
  111.       x(start+i) = y(i)
  112. 81    continue
  113.           do 82 i = n+M1, n-1
  114.          y(i) = 0.0
  115.       do 83 j = M1, M2
  116.          y(i) = y(i) + x(i+j+start-m)*wsinc(j,k)
  117. 83       continue
  118. 82    continue
  119. else
  120. c If delay is less than n/2 (=30), then lay down two pitch 
  121. c periods with the appropriate delay, and part of third
  122. c pitch period with the appropriate delay.
  123.    pitch = m + d
  124.    if (m .lt. n/2) then
  125.              do 90 i = 0, m-1+M1
  126.          y(i) = 0.0
  127.          do 91 j = M1, M2
  128.             y(i) = y(i) + x(i+j+start-m)*wsinc(j,k)
  129. 91          continue
  130. 90       continue
  131.       do 990 i=0,M2
  132.          x(start+i) = y(i)
  133. 990       continue
  134.              do 901 i = m+M1, m-1
  135.          y(i) = 0.0
  136.          do 911 j = M1, M2
  137.             y(i) = y(i) + x(i+j+start-m)*wsinc(j,k)
  138. 911          continue
  139. 901       continue
  140.       pitch2 = 2*pitch
  141.       k2 = int(pitch2 - 2*m)
  142.       mtwo = int(pitch2)
  143.       d = pitch2 - (2*m + k2)
  144.       if (abs(d) .gt. 0.1 .and. abs(d) .lt. 0.9) then
  145.  k = qd_nr(d)
  146.       else
  147.  k = 6
  148.       end if
  149.              do 92 i = m, mtwo-1
  150.          y(i) = 0.0
  151.          do 93 j = M1, M2
  152.             y(i) = y(i) + x(i+j+start-2*m-k2)*wsinc(j,k)
  153. 93          continue
  154. 92       continue
  155.       pitch3 = 3*pitch
  156.       k3 = int(pitch3 - (3*m + k2))
  157.       d = pitch3 - (3*m + k2 + k3)
  158.       if (abs(d) .gt. 0.1 .and. abs(d) .lt. 0.9) then
  159.  k = qd_nr(d)
  160.       else
  161.  k = 6
  162.       end if
  163.              do 94 i = mtwo, n-1
  164.          y(i) = 0.0
  165.          do 95 j = M1, M2
  166.             y(i) = y(i) + x(i+j+start-m-mtwo-k3-k2)*wsinc(j,k)
  167. 95          continue
  168. 94       continue
  169.    else
  170. c If delay is greater than n/2 (=30), then lay down one pitch
  171. c period with the appropriate delay, and part of second 
  172. c pitch period with appropriate delay.
  173.              do 96 i = 0, m-1+M1
  174.          y(i) = 0.0
  175.          do 97 j = M1, M2
  176.             y(i) = y(i) + x(i+j+start-m)*wsinc(j,k)
  177. 97          continue
  178. 96       continue
  179.       do 991 i=0,M2
  180.  x(start+i)=y(i)
  181. 991       continue
  182.              do 960 i = m+M1, m-1
  183.          y(i) = 0.0
  184.          do 970 j = M1, M2
  185.             y(i) = y(i) + x(i+j+start-m)*wsinc(j,k)
  186. 970          continue
  187. 960       continue
  188.       pitch2 = 2*pitch
  189.       k2 = int(pitch2 - 2*m)
  190.       d = pitch2 - (2*m + k2)
  191.       if (abs(d) .gt. 0.1 .and. abs(d) .lt. 0.9) then
  192.  k = qd_nr(d)
  193.       else
  194.  k = 6
  195.       end if
  196.              do 98 i = m, n-1
  197.          y(i) = 0.0
  198.          do 99 j = M1, M2
  199.             y(i) = y(i) + x(i+j+start-2*m-k2)*wsinc(j,k)
  200. 99          continue
  201. 98       continue
  202.    end if
  203. end if 
  204. do 992 i=0,M2
  205.    x(start+i)=0
  206. 992 continue
  207. return
  208. end