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

语音压缩

开发平台:

Unix_Linux

  1. C==========================================================================
  2. C
  3. C ROUTINE
  4. C               psearch
  5. C
  6. C FUNCTION
  7. C               find pitch VQ parameters
  8. C
  9. C SYNOPSIS
  10. C               subroutine psearch(s, l)
  11. C
  12. C   formal 
  13. C
  14. C                       data    I/O
  15. C       name            type    type    function
  16. C       -------------------------------------------------------------------
  17. C       s               real    i       data segment
  18. C       l               int     i       dimension of s
  19. C
  20. C   global 
  21. C                       data    I/O
  22. C       name            type    type    function
  23. C       -------------------------------------------------------------------
  24. C  /ccsub/       see description include file
  25. #ifdef SUNGRAPH
  26. C  /sungraph_var/
  27. #endif
  28. C
  29. C==========================================================================
  30. C
  31. C DESCRIPTION
  32. C
  33. C  Pitch search is performed by closed-loop analysis using a modification
  34. C  of what is commonly called any one of the following: "self-excited",
  35. C  "adaptive code book" or "VQ" method.  This method was found to be
  36. C  superior to the conventional "filtering approach", especially for high
  37. C  pitched speakers.  The filtering and VQ methods are identical except when
  38. C  the delay is less than the frame length.  The pitch delay ranges from mmin
  39. C  to mmax (i.e., 20 to 147 including noninteger) lags every odd subframe
  40. C  while even subframes are searched and coded within 2**pbits(2) lags
  41. C  relative to the previous subframe.  This delta search greatly reduces
  42. C  the computational complexity and data rate while causing no percievable
  43. C  loss in speech quality.
  44. C
  45. C  The minimum squared prediction error (MSPE) search criteria is modified
  46. C  to check the error at submultiples of the delay to determine if it is
  47. C  within 1 dB of the MSPE.  The submultiple delay is selected if its error
  48. C  satisfies our modified criteria.  This results in a smooth "pitch" delay
  49. C  contour which produces higher quality speech and is crucial to the
  50. C  synthesizer's smoother in the presence of bit errors. 
  51. C  
  52. C==========================================================================
  53. C
  54. C CALLED BY
  55. C
  56. C       csub
  57. C
  58. C CALLS
  59. C
  60. C movfr, pgain, delay, pitchencode
  61. C
  62. C==========================================================================
  63. C
  64. C REFERENCES
  65. C
  66. C Tremain, Thomas E., Joseph P. Campbell, Jr and Vanoy C. Welch,
  67. C "A 4.8 kbps Code Excited Linear Predictive Coder," Proceedings
  68. C of the Mobile Satellite Conference, 3-5 May 1988, pp. 491-496.
  69. C
  70. C Campbell, Joseph P. Jr., Vanoy C. Welch and Thomas E. Tremain,
  71. C "An Expandable Error-Protected 4800 bps CELP Coder (U.S. Federal
  72. C Standard 4800 bps Voice Coder)," Proceedings of ICASSP, 1989.
  73. C (and Proceedings of Speech Tech, 1989.)
  74. C
  75. C Kroon, Peter and Bishnu Atal, "On Improving the Performance of
  76. C Pitch Predictions in Speech Coding Systems," IEEE Speech Coding
  77. C Workshop, September 1989.
  78. C
  79. C Marques, J.S., et al., "Pitch Prediction with Fractional Delays
  80. C in CELP Coding," European Conference on Speech Communication and
  81. C Technology, September, 1989.
  82. C
  83. C**************************************************************************
  84. C*-
  85. subroutine psearch(s, l)
  86. implicit undefined (a-z)
  87. integer l
  88. real s(l)
  89. include 'ccsub.com'
  90. convex #include "ccsub.com"
  91. #ifdef SUNGRAPH
  92. include 'sungraph_var.com'
  93. convex #include "sungraph_var.com"
  94. integer saveindex
  95. #endif
  96. real g(0:maxpd-1), match(0:maxpd-1), emax, pgain, pitchencode
  97. integer submult(0:maxpd-1,0:3), bigptr, subptr, topptr, maxptr, oldptr
  98. integer maxbufptr, bufptr, lag, i, j, m, len, start, nrange
  99. logical first, whole, fraction, sub, neigh
  100. c *see warning below - / max (maxl, maxlp)
  101. parameter (maxbufptr = mmax+maxno+2*maxlp+maxnp-1)
  102. real v0(maxbufptr), v0shift(maxlp), frac
  103. c *length of truncated impulse response
  104. parameter (len = 30)
  105. c
  106. c Choose type of pitch delay search:
  107. c
  108. c *two stage hierarchical search of
  109. c *integer and neighboring noninteger delays
  110. if (pstype .eq. 'hier') then
  111.    whole=.true.
  112.    fraction=.false.
  113.    sub=.true.
  114.    neigh=.true.
  115.    nrange = 3
  116. c
  117. c *integer only search
  118. else if (pstype .eq. 'intg') then
  119.    whole=.true.
  120.    fraction=.false.
  121.    sub=.true.
  122.    neigh=.false.
  123. c
  124. c *full exhaustive search
  125. else if (pstype .eq. 'full') then
  126.    whole=.true.
  127.    fraction=.true.
  128.    sub=.true.
  129.    neigh=.false.
  130. c
  131. else 
  132.    stop ' psearch: incorrect pitch search type (pstype)'
  133. end if
  134. c
  135. save oldptr, submult
  136. c
  137. data oldptr/1/
  138. c
  139. c
  140. if (len .gt. l) stop ' psearch:  impulse response too long'
  141. c
  142. bufptr = mmax+no+2*l+maxnp-1
  143. if (maxlp .lt. maxl) stop ' psearch:  maxlp < maxl'
  144. #ifdef SUNGRAPH
  145. c *save impulse response in file 'pitch'
  146. call save_sg(pitch_ir_vid,h,l,'save pitch_ir_vid')
  147. #endif
  148. c
  149. c *clear match array
  150. do 10 i = 0, plevel1-1
  151.    match(i) = 0.0
  152. 10 continue
  153. c
  154. c *update adaptive code book (pitch memory)
  155. call movefr(idb,d1b,v0(bufptr-idb-l+1))
  156. c
  157. c *initial conditions
  158. if (nseg .eq. 1) then
  159.    bb(3) = 0.0
  160.    bb(1) = mmin
  161. c *load pitch submultiple delay table
  162.    open(unit=8, file='./submult.h', status='old', err=22)
  163.    do 20 i = 0, maxpd-1
  164.       read(8, *, err=22) (submult(i,j), j=0,3)
  165. 20    continue
  166.    close(8)
  167.    goto 25
  168. 22       stop ' celp:  Problem with file "submult.h"'
  169. 25    continue
  170.    goto 999
  171. end if
  172. #ifdef SUNGRAPH
  173. saveindex = bufptr-idb-l+1
  174. c
  175. c *save fndpp_v0 in file 'error'
  176. call save_sg(fndpp_v0_vid, v0(saveindex), l,'save fndpp_v0_vid')
  177. #endif
  178. c
  179. c *find allowable pointer range (minptr to maxptr)
  180. if (mod(nseg,2) .eq. 0) then
  181. c *delta delay coding on even subframes
  182.    minptr = oldptr - (plevel2/2-1)
  183.    maxptr = oldptr + (plevel2/2)
  184.    if (minptr .lt. 0) then
  185.       minptr = 0
  186.       maxptr = plevel2 - 1
  187.    end if
  188.    if (maxptr .gt. plevel1-1) then
  189.       maxptr = plevel1 - 1
  190.       minptr = plevel1 - plevel2
  191.    end if
  192. else
  193. c *full range coding on odd subframes
  194.    minptr = 0
  195.    maxptr = plevel1 - 1
  196. end if
  197. c
  198. start = bufptr-l+1
  199. c
  200. c *find gain and match score for integer pitch delays
  201. c *(using end-point correction on unity spaced delays)
  202. if (whole) then
  203.    first = .true.
  204.    do 30 i = minptr, maxptr
  205.       m    = int(pdelay(i))
  206.       frac = pdelay(i) - m
  207.       if (abs(frac) .lt. 1.e-4) then
  208.          lag   = start - m
  209.          g(i)  = pgain(v0(lag), l, first, m, len, match(i))
  210.          first = .false.
  211.       else
  212.          match(i) = 0.0
  213.       end if
  214. 30    continue
  215. end if
  216. c
  217. c *find gain and match score for fractional delays
  218. c *(beware of combining this loop with above loop!)
  219. c *(could use end-point correction on unity spaced delays)
  220. if (fraction) then
  221.    do 40 i = minptr, maxptr
  222.       m    = int(pdelay(i))
  223.       frac = pdelay(i) - m
  224.       if (abs(frac) .ge. 1.e-4) then
  225.          call delay(v0, bufptr, start, l, frac, m, v0shift)
  226.          g(i) = pgain(v0shift, l, .true., 69, len, match(i))
  227.       end if
  228. 40    continue
  229. end if
  230. c
  231. c *find pointer to top (MSPE) match score (topptr)
  232. c *search for best match score (max -error term)
  233. topptr= minptr
  234. emax  = match(topptr)
  235. do 50 i = minptr, maxptr
  236.    if (match(i) .gt. emax) then
  237.       topptr= i
  238.       emax  = match(topptr)
  239.    end if
  240. 50 continue
  241. c
  242. c *for full search (odd) subframes:
  243. c *select shortest delay of 2, 3, or 4 submultiples
  244. c *if its match is within 1 dB of MSPE to favor
  245. c *smooth "pitch"
  246. tauptr = topptr
  247. if (sub) then
  248.    if (mod(nseg,2) .ne. 0) then
  249. c *for each submultiple {2, 3 & 4}
  250.       do 70 i = 1, submult(topptr,0)
  251. c *find best neighborhood match for given submultiple
  252.          bigptr = submult(topptr,i)
  253.          do 60 subptr = max(submult(topptr,i) - 8, minptr),
  254.      &                         min(submult(topptr,i) + 8, maxptr)
  255.                if (match(subptr) .gt. match(bigptr)) bigptr = subptr
  256. 60          continue
  257. c *select submultiple match if within 1 dB MSPE match
  258.          if (match(bigptr) .ge. 0.88*match(topptr)) then
  259.             tauptr = bigptr
  260.          end if
  261. 70       continue
  262.    end if
  263. end if
  264. c *search tauptr's neighboring delays
  265. c *(to be used with earlier stages of searching)
  266. c *find gain and match score for neighboring delays
  267. c *and find best neighborhood match
  268. c *(could use end-point correction on unity spaced delays)
  269. if (neigh) then
  270.    bigptr = tauptr
  271.    do 90 i = max(tauptr - nrange, minptr), min(tauptr + nrange, maxptr)
  272.       if (i .ne. tauptr) then
  273.          m    = int(pdelay(i))
  274.          frac = pdelay(i) - m
  275.          lag  = start - m
  276.          if (abs(frac) .lt. 1.e-4) then
  277.             g(i) = pgain(v0(lag), l, .true., m, len, match(i))
  278.          else
  279.             call delay(v0, bufptr, start, l, frac, m, v0shift)
  280.             g(i) = pgain(v0shift, l, .true., 69, len, match(i))
  281.          end if
  282.          if (match(i) .gt. match(tauptr)) bigptr = i
  283.       end if
  284. 90    continue
  285.    tauptr = bigptr
  286. end if
  287. c
  288. c *OPTIONAL (may be useful for integer DSPs)
  289. c *given chosen pointer to delay (tauptr), recompute its
  290. c *gain to correct errors accumulated in recursions
  291. c *and errors due to truncation
  292. m    = int(pdelay(tauptr))
  293. frac = pdelay(tauptr) - m
  294. lag  = start - m
  295. if (abs(frac) .lt. 1.e-4) then
  296. c    integer delay:
  297.    g(tauptr) = pgain(v0(lag), l, .true., m, l, match(tauptr))
  298. else
  299. c    fractional delay:
  300.    call delay(v0, bufptr, start, l, frac, m, v0shift)
  301.    g(tauptr) = pgain(v0shift, l, .true., 69, l, match(tauptr))
  302. end if
  303. c
  304. c *place pitch parameters in common bb "structure"
  305. bb(3)   = g(tauptr)
  306. bb(1)   = pdelay(tauptr)
  307. c
  308. c *save pitch pointer to determine delta delay
  309. oldptr = tauptr
  310. #ifdef SUNGRAPH
  311. c *save pitch match score function in file 'pitch'
  312. call save_sg(pitch_match_vid, match, plevel1,'save pitch_error_vid')
  313. #endif
  314. c
  315. 999 continue
  316. #ifdef SUNGRAPH
  317. c
  318. c *save unquantized pitch gain in file 'pitch'
  319. call save_sg(pitch_gain_vid,bb(3),1,'save pitch_gain_vid')
  320. #endif
  321. c
  322. c *write clamped pitch gain file for quantizer design
  323. copt write (21,*) max(min(bb(3), 2.0), -1.0)
  324. c
  325. c *pitch quantization bb(3)
  326. if (ptype .ne. 'none') then
  327.    bb(3) = pitchencode(bb(3),pbits(3),ptype,pindex)
  328. else
  329.    print *, ' psearch:  no pitch quantization!'
  330. end if
  331. #ifdef SUNGRAPH
  332. c *save quantized pitch gain in file 'pitch'
  333. call save_sg(pitch_qgain_vid,bb(3),1,'save pitch_qgain_vid')
  334. #endif
  335. c
  336. return
  337. end