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

语音压缩

开发平台:

Unix_Linux

  1. C==========================================================================
  2. C
  3. C ROUTINE
  4. C pgain
  5. C
  6. C FUNCTION
  7. C Find pitch gain and error
  8. C
  9. C SYNOPSIS
  10. C               function pgain(ex, l, first, m, len, match)
  11. C
  12. C   formal 
  13. C
  14. C                       data    I/O
  15. C       name            type    type    function
  16. C       -------------------------------------------------------------------
  17. C       ex(l) real i excitation vector
  18. C       l int i size of ex
  19. C       first logical i first call flag
  20. C m int i pitch lag
  21. C len int i length to truncate impulse response
  22. C       match real o negative partial squared error
  23. C       pgain real fun optimal gain for ex
  24. C
  25. C   global 
  26. C                       data    I/O
  27. C       name            type    type    function
  28. C       -------------------------------------------------------------------
  29. C  /ccsub/ see description include file
  30. C
  31. C==========================================================================
  32. C
  33. C DESCRIPTION
  34. C
  35. C For each lag:
  36. C    a.  Filter first error signal (v0) through truncated
  37. C        impulse response of perceptual weighting filter
  38. C        (LPC filter with bandwidth broadening).
  39. C    b.  Correlate filtered result with actual first error
  40. C        signal (e0).
  41. C    c.  Compute first order pitch filter coefficient (pgain)
  42. C        and error (er) for each lag.
  43. C
  44. C Note:  Proper selection of the convolution length (len) depends on
  45. C        the perceptual weighting filter's expansion factor (gamma)
  46. C        which controls the damping of the impulse response.
  47. C
  48. C         This is one of CELP's most computationally intensive
  49. C         routines.  Neglecting overhead, the approximate number of
  50. C DSP instructions (add, multiply, multiply accumulate, or
  51. C compare) per second (IPS) is:
  52. C
  53. C         C:  convolution (recursive truncated end-point correction)
  54. C               C': convolution (recursive truncated end-point correction)
  55. C               R = E:  full correlation & energy
  56. C               R'= E': delta correlation & energy
  57. C               G:      gain quantization
  58. C               G':     delta gain quantization
  59. C
  60. C         IPS = 2.34 M (for integer delays)
  61. C
  62. c pitch search complexity for integer delays:
  63. C implicit undefined(a-z)
  64. c
  65. c DSP chip instructions/operation:
  66. C integer MUL, ADD, SUB, MAC, MAD, CMP
  67. C parameter (MUL=1) !multiply
  68. C parameter (ADD=1) !add
  69. C parameter (SUB=1) !subtract
  70. C parameter (MAC=1) !multiply & accumulate
  71. C parameter (MAD=2) !multiply & add
  72. C parameter (CMP=1) !compare
  73. c
  74. c CELP algorithm parameters:
  75. C integer L, len, K, Kp, Np, dmin
  76. C real F
  77. C parameter (L=60) !subframe length
  78. C parameter (len=30) !length to truncate calculations (<= L)
  79. C parameter (K=2) !number of full search subframes
  80. C parameter (Kp=2) !number of delta search subframes
  81. C parameter (F=30.e-3) !time (seconds)/frame
  82. C parameter (Np=32) !number of delta subframe delays
  83. C parameter (dmin=20) !minimum delay
  84. c
  85. C integer j
  86. C parameter (j=4)
  87. C integer N(j), i
  88. C real C, R, E, G, Cp, Rp, Ep, Gp, IPS
  89. C data N/32, 64, 128, 256/
  90. C print 1
  91. C1 format(10x,'N',10x,'C',13x,'R',12x,'E',15x,'G',13x,'MIPS')
  92. C do i = 1, j
  93. C    C = (len*(len+1)/2 + len*len)*MAC + (N(i)-1)*len*MAD
  94. C     &      + min(L-dmin,N(i))*(L-dmin)*ADD + (L/2-dmin)*(L-2*dmin)*ADD
  95. C    Cp= (len*(len+1)/2 + len*len)*MAC + (Np-1)*len*MAD
  96. C     &      + min(L-dmin,Np)*(L-dmin)*ADD + (L/2-dmin)*(L-2*dmin)*ADD
  97. C    R = N(i)*L*MAC
  98. C    Rp= Np*L*MAC
  99. C    E = R
  100. C    Ep= Rp
  101. C    G = N(i)*(1*CMP+1*MUL + 1*MUL)
  102. C    Gp= Np*(1*CMP+1*MUL + 1*MUL)
  103. C    IPS = ((C+R+E+G)*K + (Cp+Rp+Ep+Gp)*Kp)/F
  104. C    print *,N(i),C*K/1.e6/F,R*K/1.e6/F,E*K/1.e6/F,G*K/1.e6/F,IPS/1.e6
  105. C    print *,Np,Cp*Kp/1.e6/F,Rp*Kp/1.e6/F,Ep*Kp/1.e6/F,Gp*Kp/1.e6/F
  106. C end do
  107. C end
  108. C
  109. C  N          C             R            E               G             MIPS
  110. C  32  0.3136667      0.1280000      0.1280000      6.4000003E-03   1.152133    
  111. C  32  0.3136667      0.1280000      0.1280000      6.4000003E-03
  112. C  64  0.4630000      0.2560000      0.2560000      1.2800001E-02   1.563867    
  113. C  32  0.3136667      0.1280000      0.1280000      6.4000003E-03
  114. C 128  0.7190000      0.5120000      0.5120000      2.5600001E-02   2.344667    
  115. C  32  0.3136667      0.1280000      0.1280000      6.4000003E-03
  116. C 256   1.231000       1.024000       1.024000      5.1200002E-02   3.906267    
  117. C  32  0.3136667      0.1280000      0.1280000      6.4000003E-03
  118. C
  119. C==========================================================================
  120. C
  121. C CALLED BY
  122. C
  123. C psearch
  124. C
  125. C CALLS
  126. C
  127. C
  128. C
  129. C==========================================================================
  130. C
  131. C REFERENCES
  132. C
  133. C Tremain, Thomas E., Joseph P. Campbell, Jr and Vanoy C. Welch,
  134. C "A 4.8 kbps Code Excited Linear Predictive Coder," Proceedings
  135. C of the Mobile Satellite Conference, 3-5 May 1988, pp. 491-496.
  136. C
  137. C Campbell, Joseph P. Jr., Vanoy C. Welch and Thomas E. Tremain,
  138. C "An Expandable Error-Protected 4800 bps CELP Coder (U.S. Federal
  139. C Standard 4800 bps Voice Coder)," Proceedings of ICASSP, 1989.
  140. C (and Proceedings of Speech Tech, 1989.)
  141. C
  142. C==========================================================================
  143. C*-
  144. function pgain(ex, l, first, m, len, match)
  145. implicit undefined(a-z)
  146. integer l, m, len
  147. real ex(l), match, pgain
  148. logical first
  149. include 'ccsub.com'
  150. convex #include "ccsub.com"
  151. real cor, eng, y(maxlp), y2(maxlp)
  152. integer i, j
  153. c
  154. save y
  155. c
  156. if (first) then
  157. c
  158. c    Calculate and save convolution of truncated (to len)
  159. c    impulse response for first lag of t (=mmin) samples:
  160. c
  161. c         min(i, len)
  162. c    y     =  SUM  h * ex       , where i = 1, ..., L points
  163. c     i, t    j=1   j    i-j+1
  164. c
  165. c               h |1 2...len x x|
  166. c    ex |L . . . 2 1|             = y(1)
  167. c      ex |L . . . 2 1|           = y(2)
  168. c                    :              :
  169. c              ex |L  . . .  2 1| = y(L)
  170. c
  171.    do 40 i = 1, l
  172.       y(i) = 0.0
  173.       do 30 j = 1, min(i, len)
  174.          y(i) = y(i) + h(j)*ex(i-j+1)
  175. 30       continue
  176. 40    continue
  177. else
  178. c
  179. c    End correct the convolution sum on subsequent pitch lags:
  180. c
  181. c    y     =  0
  182. c     0, t
  183. c    y     =  y        + ex  * h   where i = 1, ..., L points
  184. c     i, m     i-1, m-1   -m    i  and   m = t+1, ..., tmax lags
  185. c
  186.    do 50 i = len, 2, -1
  187.       y(i-1) = y(i-1) + ex(1)*h(i)
  188. 50    continue
  189.    do 51 i = l, 2, -1
  190.       y(i) = y(i-1)
  191. 51    continue
  192.    y(1) = ex(1)*h(1)
  193. end if
  194. c
  195. c For lags (m) shorter than frame size (l), replicate the short
  196. c adaptive codeword to the full codeword length by
  197. c overlapping and adding the convolutions:
  198. c
  199. do 60 i = 1, l
  200.    y2(i) = y(i)
  201. 60 continue
  202. if (m .lt. l) then
  203. c                             add in 2nd convolution
  204.    do 65 i = m+1, l
  205.       y2(i) = y(i) + y(i-m)
  206. 65    continue
  207.    if (m .lt. l/2) then
  208. c                             add in 3rd convolution
  209.       do 69 i = 2*m+1, l
  210.  y2(i) = y2(i) + y(i-2*m)
  211. 69       continue
  212.    end if
  213. end if
  214. c
  215. c Calculate correlation and energy:
  216. c e0 = r(n)   = spectrum prediction residual
  217. c y2 = r(n-m) = error weighting filtered reconstructed
  218. c               pitch prediction signal (m = correlation lag)
  219. c
  220. cor = 0.
  221. eng = 0.
  222. do 70 i = 1, l
  223.    cor = cor + y2(i)*e0(i)
  224.    eng = eng + y2(i)*y2(i)
  225. 70 continue
  226. c
  227. c Compute gain and error:
  228. c   NOTE: Actual MSPE = e0.e0 - pgain(2*cor-pgain*eng)
  229. c since e0.e0 is independent of the code word,
  230. c minimizing MSPE is equivalent to maximizing:
  231. c      match = pgain(2*cor-pgain*eng)   (1)
  232. c If unquantized pgain is used, this simplifies:
  233. c      match = cor*pgain
  234. c
  235. c   NOTE: Inferior results were obtained when quantized
  236. c pgain was used in equation (1)???
  237. c
  238. c   NOTE: When the delay is less than the frame length, "match"
  239. c         is only an approximation to the actual error.
  240. c
  241. c Independent (open-loop) quantization of gain and match (index):
  242. c
  243. if (eng .le. 0.) eng = 1.0
  244. pgain = cor/eng
  245. match = cor*pgain
  246. c
  247. return
  248. end