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

语音压缩

开发平台:

Unix_Linux

  1. C==========================================================================
  2. C
  3. C ROUTINE
  4. C delay_nr
  5. C
  6. C FUNCTION
  7. C Time delay a bandlimited signal
  8. C using blockwise recursion (aka "nonrecursive")
  9. C
  10. C SYNOPSIS
  11. C subroutine delay_nr(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
  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 input 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. C
  56. subroutine delay_nr(x, bufr, start, n, d, m, y)
  57. implicit undefined(a-z)
  58. include 'ccsub.h'
  59. convex #include "ccsub.h"
  60. integer n, bufr, start
  61. real x(bufr), y(0:n-1), d, pitch, pitch2, pitch3
  62. integer nfrac, i, j, k, k2, k3, m, mtwo, qd_nr, M1, M2
  63. c * 5 fractional delays plus zero delay = 6
  64. parameter (nfrac = 6, M1 = -4, M2 = 3)
  65. integer twelfths(nfrac)
  66. real sinc, wsinc(M1:M2, nfrac), hwin(12*M1:12*(M2+1)), frac(nfrac)
  67. logical first
  68. c
  69. save first, hwin, wsinc
  70. c
  71. data first /.true./
  72. data twelfths/3,    4,          6,   8,          9,    0/
  73. data frac/    0.25, 0.33333333, 0.5, 0.66666667, 0.75, 0.0/
  74. c
  75. c Generate Hamming windowed sinc interpolating function
  76. c for each allowable fraction.  The interpolating functions
  77. c are stored in time reverse order (i.e., delay appears as
  78. c advance) to allign with the adaptive code book v0 array.
  79. c The interp filters are:
  80. c wsinc(.,1) frac = 1/4 (3/12)
  81. c wsinc(.,2) frac = 1/3 (4/12)
  82. c . .
  83. c wsinc(.,5) frac = 3/4 (9/12)
  84. c wsinc(.,6) frac = 0   zero delay for programming ease
  85. c
  86. if (first) then
  87.    call ham(hwin, 12*(M2-M1+1)+1)
  88.    do 20 i = 1, nfrac
  89.       do 10 j = M1, M2
  90.          wsinc(j,i) = sinc(frac(i)+j)*hwin(12*j+twelfths(i))
  91. 10       continue
  92. 20    continue
  93.    first = .false.
  94. end if
  95. c
  96. k=qd_nr(d)
  97. c
  98. c Resample:
  99. c
  100. c If delay is greater than n (=60), then lay down n values at 
  101. c the appropriate delay.
  102. if (m .ge. n) then
  103.    do 80 i = 0, n-1+M1
  104.       y(i) = 0.0
  105.       do 70 j = M1, M2
  106.          y(i) = y(i) + x(i+j+start-m)*wsinc(j,k)
  107. 70       continue
  108. 80    continue
  109.    do 81 i=0,M2
  110.       x(start+i) = y(i)
  111. 81    continue
  112.           do 82 i = n+M1, n-1
  113.          y(i) = 0.0
  114.       do 83 j = M1, M2
  115.          y(i) = y(i) + x(i+j+start-m)*wsinc(j,k)
  116. 83       continue
  117. 82    continue
  118. else
  119. c If delay is less than n/2 (=30), then lay down two pitch 
  120. c periods with the appropriate delay, and part of third
  121. c pitch period with the appropriate delay.
  122.    pitch = m + d
  123.    if (m .lt. n/2) then
  124.              do 90 i = 0, m-1+M1
  125.          y(i) = 0.0
  126.          do 91 j = M1, M2
  127.             y(i) = y(i) + x(i+j+start-m)*wsinc(j,k)
  128. 91          continue
  129. 90       continue
  130.       do 990 i=0,M2
  131.          x(start+i) = y(i)
  132. 990       continue
  133.              do 901 i = m+M1, m-1
  134.          y(i) = 0.0
  135.          do 911 j = M1, M2
  136.             y(i) = y(i) + x(i+j+start-m)*wsinc(j,k)
  137. 911          continue
  138. 901       continue
  139.       pitch2 = 2*pitch
  140.       k2 = int(pitch2 - 2*m)
  141.       mtwo = int(pitch2)
  142.       d = pitch2 - (2*m + k2)
  143.       if (abs(d) .gt. 0.1 .and. abs(d) .lt. 0.9) then
  144.  k = qd_nr(d)
  145.       else
  146.  k = 6
  147.       end if
  148.              do 92 i = m, mtwo-1
  149.          y(i) = 0.0
  150.          do 93 j = M1, M2
  151.             y(i) = y(i) + x(i+j+start-2*m-k2)*wsinc(j,k)
  152. 93          continue
  153. 92       continue
  154.       pitch3 = 3*pitch
  155.       k3 = int(pitch3 - (3*m + k2))
  156.       d = pitch3 - (3*m + k2 + k3)
  157.       if (abs(d) .gt. 0.1 .and. abs(d) .lt. 0.9) then
  158.  k = qd_nr(d)
  159.       else
  160.  k = 6
  161.       end if
  162.              do 94 i = mtwo, n-1
  163.          y(i) = 0.0
  164.          do 95 j = M1, M2
  165.             y(i) = y(i) + x(i+j+start-m-mtwo-k3-k2)*wsinc(j,k)
  166. 95          continue
  167. 94       continue
  168.    else
  169. c If delay is greater than n/2 (=30), then lay down one pitch
  170. c period with the appropriate delay, and part of second 
  171. c pitch period with appropriate delay.
  172.              do 96 i = 0, m-1+M1
  173.          y(i) = 0.0
  174.          do 97 j = M1, M2
  175.             y(i) = y(i) + x(i+j+start-m)*wsinc(j,k)
  176. 97          continue
  177. 96       continue
  178.       do 991 i=0,M2
  179.  x(start+i)=y(i)
  180. 991       continue
  181.              do 960 i = m+M1, m-1
  182.          y(i) = 0.0
  183.          do 970 j = M1, M2
  184.             y(i) = y(i) + x(i+j+start-m)*wsinc(j,k)
  185. 970          continue
  186. 960       continue
  187.       pitch2 = 2*pitch
  188.       k2 = int(pitch2 - 2*m)
  189.       d = pitch2 - (2*m + k2)
  190.       if (abs(d) .gt. 0.1 .and. abs(d) .lt. 0.9) then
  191.  k = qd_nr(d)
  192.       else
  193.  k = 6
  194.       end if
  195.              do 98 i = m, n-1
  196.          y(i) = 0.0
  197.          do 99 j = M1, M2
  198.             y(i) = y(i) + x(i+j+start-2*m-k2)*wsinc(j,k)
  199. 99          continue
  200. 98       continue
  201.    end if
  202. end if 
  203. do 992 i=0,M2
  204.    x(start+i)=0
  205. 992 continue
  206. return
  207. end
  208. c
  209. c Sinc function
  210. c
  211. copt function sinc(arg)
  212. copt implicit undefined(a-z)
  213. copt real sinc, arg, pi
  214. copt pi = 4.0*atan(1.0)
  215. copt if (arg .eq. 0.0) then
  216. copt    sinc = 1.0
  217. copt else
  218. copt    sinc = sin(pi*arg)/(pi*arg)
  219. copt end if
  220. copt return
  221. copt end
  222. c
  223. c Quantize d function 
  224. c
  225. function qd_nr(d)
  226. implicit undefined(a-z)
  227. real d
  228. integer qd_nr, i, k, nfrac
  229. parameter (nfrac = 5)
  230. real frac(nfrac)
  231. logical ok
  232. C
  233. C * The second and fourth elements of the data statement below
  234. C   when multiplied by 3 must be greater than 1 or 2 respectively.
  235. data frac/0.25, 0.33334, 0.5, 0.66667, 0.75/
  236. c
  237. ok = .false.
  238. do 50 i = 1, nfrac
  239.    if (abs(d-frac(i)) .lt. 1.e-2) then
  240.       k = i
  241.       ok = .true.
  242.    end if
  243. 50 continue
  244. if (.not. ok) then
  245.    print *,'delay.f:  Invalid pitch delay = ',d
  246.    stop
  247. end if
  248. qd_nr=k
  249. return
  250. end
  251. c