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

语音压缩

开发平台:

Unix_Linux

  1. C==========================================================================
  2. C
  3. C ROUTINE
  4. C cgain
  5. C
  6. C FUNCTION
  7. C Find codeword gain and error (TERNARY CODE BOOK ASSUMED!)
  8. C
  9. C SYNOPSIS
  10. C               function cgain(ex, l, first, 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 (ternary codeword)
  18. C       l int i size of ex (dimension of codeword)
  19. C       first logical i first call flag
  20. C len int i length to truncate impulse response
  21. C       match real o negative partial squared error
  22. C       cgain real fun optimal gain for ex
  23. C
  24. C   global 
  25. C                       data    I/O
  26. C       name            type    type    function
  27. C       -------------------------------------------------------------------
  28. C  /ccsub/ see description include file
  29. C
  30. C==========================================================================
  31. C
  32. C DESCRIPTION
  33. C
  34. C For each code word find its gain and error:
  35. C    a.  Filter code words through impulse response
  36. C        of perceptual weighting filter (LPC filter with
  37. C        bandwidth broadening).
  38. C    b.  Correlate filtered result with actual second error
  39. C        signal (e0).
  40. C    c.  Compute MSPE gain and error for code book vector.
  41. C
  42. C Notes:  Codewords may contain many zeros (i.e., ex(1)=0).  The
  43. C code book could be accessed by a pointer to nonzero samples.
  44. C Because the code book is static, it`s silly to test its
  45. C samples as in the code below.
  46. C
  47. C Proper selection of the convolution length (len) depends on
  48. C the perceptual weighting filter's expansion factor (gamma)
  49. C which controls the damping of the impulse response.
  50. C
  51. C This is one of CELP's most computationally intensive
  52. C routines.  Neglecting overhead, the approximate number of
  53. C DSP instructions (add, multiply, multiply accumulate, or
  54. C compare) per second (IPS) is:
  55. C
  56. C                Code book size   MIPS
  57. C                --------------   ----
  58. C                    64           1.1
  59. C                   128           2.1
  60. C                   256           4.2
  61. C                   512 (max)     8.3
  62. C
  63. C         C:  convolution (recursive truncated end-point correction)
  64. C         R:  correlation
  65. C         E:  energy (recursive end-point correction)
  66. C         G:  gain quantization
  67. C
  68. C celp code book search complexity (doesn't fully exploit ternary values!):
  69. C implicit undefined(a-z)
  70. c
  71. c DSP chip instructions/operation:
  72. C integer MUL, ADD, SUB, MAC, MAD, CMP
  73. C parameter (MUL=1) !multiply
  74. C parameter (ADD=1) !add
  75. C parameter (SUB=1) !subtract
  76. C parameter (MAC=1) !multiply & accumulate
  77. C parameter (MAD=2) !multiply & add
  78. C parameter (CMP=1) !compare
  79. c
  80. c CELP algorithm parameters:
  81. C integer L, len, K, shift, g_bits
  82. C real p, F
  83. C parameter (L=60) !subframe length
  84. C parameter (len=30) !length to truncate calculations (<= L)
  85. C parameter (p=0.77) !code book sparsity
  86. C parameter (shift=2) !shift between code words
  87. C parameter (K=4) !number of subframes/frame
  88. C parameter (F=30.e-3) !time (seconds)/frame
  89. C parameter (g_bits=5) !cbgain bit allocation
  90. c
  91. C integer j
  92. C parameter (j=10)
  93. C integer N(j), i
  94. C real C, R, E, G, IPS
  95. C data N/1, 2, 4, 8, 16, 32, 64, 128, 256, 512/
  96. C print 1
  97. C1 format(10x,'N',10x,'C',13x,'R',12x,'E',15x,'G',13x,'MIPS')
  98. C do i = 1, j
  99. C    C = (335)*MAD + (N(i)-1)*shift*(1.-p)*len*ADD
  100. C    R = N(i)*L*MAC
  101. C    E = L*MAC + (N(i)-1)*((1.-p*p)*L*MAC + (p*p)*2*MAD)
  102. C    G = N(i)*(g_bits*(CMP+MUL+ADD) + 3*MUL+1*SUB)
  103. C    IPS = (C+R+E+G)*K/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 end do
  106. C end
  107. C
  108. C    N        C             R             E               G           MIPS
  109. C    1  8.9333333E-02  8.0000004E-03  8.0000004E-03  2.5333334E-03  0.1078667   
  110. C    2  9.1173328E-02  1.6000001E-02  1.1573013E-02  5.0666668E-03  0.1238130   
  111. C    4  9.4853334E-02  3.2000002E-02  1.8719040E-02  1.0133334E-02  0.1557057   
  112. C    8  0.1022133      6.4000003E-02  3.3011094E-02  2.0266667E-02  0.2194911   
  113. C   16  0.1169333      0.1280000      6.1595201E-02  4.0533334E-02  0.3470618   
  114. C   32  0.1463733      0.2560000      0.1187634      8.1066668E-02  0.6022034   
  115. C   64  0.2052534      0.5120000      0.2330998      0.1621333       1.112487   
  116. C  128  0.3230133       1.024000      0.4617727      0.3242667       2.133053   
  117. C  256  0.5585334       2.048000      0.9191184      0.6485333       4.174185   
  118. C  512   1.029573       4.096000       1.833810       1.297067       8.256450  
  119. C
  120. C==========================================================================
  121. C
  122. C CALLED BY
  123. C
  124. C cbsearch
  125. C
  126. C CALLS
  127. C
  128. C gainencode2
  129. C
  130. C==========================================================================
  131. C
  132. C REFERENCES
  133. C
  134. C Tremain, Thomas E., Joseph P. Campbell, Jr and Vanoy C. Welch,
  135. C "A 4.8 kbps Code Excited Linear Predictive Coder," Proceedings
  136. C of the Mobile Satellite Conference, 3-5 May 1988, pp. 491-496.
  137. C
  138. C Campbell, Joseph P. Jr., Vanoy C. Welch and Thomas E. Tremain,
  139. C "The New 4800 bps Voice Coding Standard," Military and 
  140. C Government Speech Tech, 1989, p. 64-70.
  141. C
  142. C Lin, Daniel, "New Approaches to Stochastic Coding of Speech
  143. C Sources at Very Low Bit Rates," Signal Processing III:  Theories
  144. C and Applications (Proceedings of EUSIPCO-86), 1986, p.445.
  145. C
  146. C Xydeas, C.S., M.A. Ireton and D.K. Baghbadrani, "Theory and
  147. C Real Time Implementation of a CELP Coder at 4.8 and 6.0 kbits/s
  148. C Using Ternary Code Excitation," Fifth International Conference on
  149. C Digital Processing of Signals in Communications, 1988, p. 167.
  150. C
  151. C Ess, Mike, "Simple Convolution on the Cray X-MP,"
  152. C Supercomputer, March 1988, p. 35
  153. C
  154. C Supercomputer, July 1988, p. 24
  155. C
  156. C==========================================================================
  157. C*-
  158. function cgain(ex, l, first, len, match)
  159. implicit undefined(a-z)
  160. integer l, len
  161. real ex(l), match, cgain
  162. logical first
  163. include 'ccsub.com'
  164. convex #include "ccsub.com"
  165. real cor, eng, y(maxl), y59save, y60save, gainencode2
  166. integer i, j
  167. c
  168. save y, y59save, y60save, eng
  169. c
  170. if (first) then
  171. c
  172. c    For first code word, calculate and save convolution
  173. c    of code word with truncated (to len) impulse response:
  174. c
  175. c    NOTES: A standard convolution of two L point sequences
  176. c           produces 2L-1 points, however, this convolution
  177. c           generates only the first L points.
  178. c
  179. c           A "scalar times vector accumulation" method is used
  180. c           to exploit (skip) zero samples of the code words:
  181. c
  182. c           min(L-i+1, len)
  183. c    y         =  SUM  ex * h   , where i = 1, ..., L points
  184. c     i+j-1, t    j=1    i   j
  185. c
  186. c                 ex |1 2  .  .  .  L|
  187. c    h |x x len ... 2 1|               = y(1)
  188. c      h |x x len ... 2 1|             = y(2)
  189. c                       :                 :
  190. c                  h |x x len ... 2 1| = y(L)
  191. c
  192.    do 10 i = 1, l
  193.       y(i) = 0.0
  194. 10    continue
  195.    do 40 i = 1, l
  196.       if (nint(ex(i)) .ne. 0) then
  197.          do 30 j = 1, min(l-i+1, len)
  198.             y(i+j-1) = y(i+j-1) + ex(i)*h(j)
  199. 30          continue
  200.       end if
  201. 40    continue
  202. else
  203. c
  204. c    End correct the convolution sum on subsequent code words:
  205. c    (Do two end corrections for a shift by 2 code book)
  206. c
  207. c    y     =  0
  208. c     0, 0
  209. c    y     =  y        + ex * h   where i = 1, ..., L points
  210. c     i, m     i-1, m-1   -m   i  and   m = 1, ..., cbsize-1 code words
  211. c
  212. c    NOTE:  The data movements in loops "do 59 ..." and "do 69 ..."
  213. c           are performed many times and can be quite time consuming.
  214. c           Therefore, special precautions should be taken when
  215. c           implementing this.  Some implementation suggestions:
  216. c           1.  Circular buffers with pointers to eliminate data moves.
  217. c           2.  Fast "block move" operation as offered on some DSPs.
  218. c
  219. c
  220. c    First shift
  221. c
  222.    if (nint(ex(2)) .ne. 0) then
  223. c       *ternary stochastic code book (-1, 0, +1)
  224.       if (nint(ex(2)) .eq. 1) then
  225.          do 50 i = len, 2, -1
  226.             y(i-1) = y(i-1) + h(i)
  227. 50          continue
  228.       else
  229.          do 55 i = len, 2, -1
  230.             y(i-1) = y(i-1) - h(i)
  231. 55          continue
  232.       end if
  233.    end if
  234.    do 59 i = l, 2, -1
  235.       y(i) = y(i-1)
  236. 59    continue
  237.    y(1) = ex(2)*h(1)
  238. c
  239. c    Second shift
  240. c
  241.    if (nint(ex(1)) .ne. 0) then
  242. c       *ternary stochastic code book (-1, 0, +1)
  243.       if (nint(ex(1)) .eq. 1) then
  244.          do 60 i = len, 2, -1
  245.             y(i-1) = y(i-1) + h(i)
  246. 60          continue
  247.       else
  248.          do 65 i = len, 2, -1
  249.             y(i-1) = y(i-1) - h(i)
  250. 65          continue
  251.       end if
  252.    end if
  253.    do 69 i = l, 2, -1
  254.       y(i) = y(i-1)
  255. 69    continue
  256.    y(1) = ex(1)*h(1)
  257. end if
  258. c
  259. c Calculate correlation and energy:
  260. c e0 = spectrum & pitch prediction residual
  261. c y  = error weighting filtered code words
  262. c
  263. c ///  CELP's computations are focused in this correlation ///
  264. c - For a 512 code book this correlation takes 4 MIPS!
  265. c - Decimation?, Down-sample & decimate?, FEC codes?
  266. cor = 0.0
  267. do 70 i = 1, l
  268.    cor = cor + y(i)*e0(i)
  269. 70 continue
  270. c
  271. c *End correct energy on subsequent code words:
  272. if (nint(ex(1)).eq.0 .and. nint(ex(2)).eq.0 .and. .not.first) then
  273.    eng = eng - y59save*y59save-y60save*y60save
  274. else
  275.    eng = 0.0
  276.    do 80 i = 1, l
  277.       eng = eng + y(i)*y(i)
  278. 80    continue
  279. end if
  280. y59save = y(l-1)
  281. y60save = y(l)
  282. c
  283. c Compute gain and error:
  284. c   NOTE: Actual MSPE = e0.e0 - cgain(2*cor-cgain*eng)
  285. c since e0.e0 is independent of the code word,
  286. c minimizing MSPE is equivalent to maximizing:
  287. c      match = cgain(2*cor-cgain*eng)
  288. c If unquantized cgain is used, this simplifies:
  289. c      match = cor*cgain
  290. c
  291. c Independent (open-loop) quantization of gain and match (index):
  292. c
  293. if (eng .le. 0.0) eng = 1.0
  294. cgain = cor/eng
  295. match = cor*cgain
  296. c
  297. c Joint (closed-loop) quantization of gain and match (index):
  298. c (Beware that the match score can be negative!)
  299. c
  300. c>>> cgain = gainencode2(cor, eng, cbgbits, cbgtype, i)
  301. c>>> match = cgain*(2.*cor - cgain*eng)
  302. c
  303. return
  304. end