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

语音压缩

开发平台:

Unix_Linux

  1. C==========================================================================
  2. C
  3. C ROUTINE
  4. C codebook (main)
  5. C
  6. C FUNCTION
  7. C Generate code book vector for CELP coder
  8. C
  9. C==========================================================================
  10. C
  11. C DESCRIPTION
  12. C
  13. C Generate a sparse ternary code book vector x by center clipping
  14. C and limiting a zero-mean unit-variance Gaussian sequence.  For
  15. C a desired sparsity, the center clipping threshold "THRESH" is
  16. C determined from F (the cumulative distribution function of a
  17. C standardized normal random variable):
  18. C
  19. C sparsity = 1 - 2[1 - F(THRESH)]
  20. C
  21. C Sparsity THRESH
  22. C -------- ------
  23. C 75% 1.15
  24. C 77% 1.2
  25. C 86.6% 1.5
  26. C 90% 1.645
  27. C
  28. C==========================================================================
  29. C
  30. C REFERENCES
  31. C
  32. C CRC Standard Mathematical Tables,
  33. C The Normal Probability Function and Related Functions.
  34. C
  35. C==========================================================================
  36. C FILES
  37. C
  38. C The data is output in file "codebook.h"
  39. C
  40. C**************************************************************************
  41. C
  42. program codebook
  43. implicit undefined(a-z)
  44. integer M, L, MAXCODE, WIDTH, i, j, k
  45. parameter (M = 512, L = 60)
  46. parameter (MAXCODE = 2*(M-1)+L)
  47. parameter (WIDTH = 20)
  48. real x(0:MAXCODE+1), THRESH
  49. parameter (THRESH = 1.2)
  50. c
  51. c *open file for code book data
  52. open(unit=10, file='codebook.h', status='new')
  53. k = 0
  54. do 50 i = 0, MAXCODE/2
  55. c *get a pair of G(0,1) samples
  56.    call noise(x(k), x(k+1))
  57. c *center clip ternary samples
  58.    do 20 j = 0, 1
  59.       if (abs(x(k+j)) .lt. THRESH) then
  60.          x(k+j) = 0.0
  61.       else
  62.          x(k+j) = sign(1.0, x(k+j))
  63.       end if
  64. 20    continue
  65.    k = k + 2
  66. 50 continue
  67. c *write samples to file (skip first & last sample)
  68. k = 1
  69. do 80 i = 1, MAXCODE/WIDTH
  70. c    write (10, 90) (int(x(j)), j=k,k-1+WIDTH)
  71.    write (10, 90) (x(j), j=k,k-1+WIDTH)
  72.    k = k + WIDTH
  73. 80 continue
  74. c write (10, 91) (int(x(j)), j=k,k-1+mod(MAXCODE,WIDTH))
  75. write (10, 91) (x(j), j=k,k-1+mod(MAXCODE,WIDTH))
  76. stop 'codebook.h generated'
  77. c90 format(1x, 20(i3,','))
  78. 90 format(1x, 20(f4.0,','))
  79. c91 format(1x, i3, ',', i3)
  80. 91 format(1x, f4.0, ',', f4.0)
  81. end
  82. C==========================================================================
  83. C
  84. C ROUTINE
  85. C               noise
  86. C
  87. C FUNCTION
  88. C
  89. C               Generates gaussian noise using the polar method.
  90. C SYNOPSIS
  91. C               noise(x1, x2)
  92. C   formal 
  93. C
  94. C                       data    I/O
  95. C       name            type    type    function
  96. C       -------------------------------------------------------------------
  97. C       x1              r       o       a sample of noise source
  98. C       x2              r       o       another sample of noise source
  99. C
  100. C==========================================================================
  101. C       
  102. C USAGE
  103. C
  104. C noise generates two samples of a Gaussian noise
  105. C source for each call using the polar method.
  106. C
  107. C==========================================================================
  108. C
  109. C REFERENCES
  110. C
  111. C       Knuth, The Art of Programming, Volume 2
  112. C
  113. C**************************************************************************
  114. C*-
  115. subroutine noise (x1, x2)
  116. implicit undefined(a-z)
  117. real x1, x2
  118. integer random, i, j
  119. real f(2), f1, f2, s
  120. c
  121. c f(i) are samples from a uniform distribution
  122. c in the range of 0.0 inclusive to 1.0 inclusive. 
  123. c
  124. 10 do 30 i = 1, 2
  125.    do 20 j = 1, 4
  126.       f(i) = (float(random()+32768))/65535.
  127. 20    continue
  128. 30 continue
  129. f1 = 2.*f(1) - 1.
  130. f2 = 2.*f(2) - 1.
  131. s  = f1*f1 + f2*f2
  132. if (s .ge. 1.) goto 10
  133. s  = sqrt(-2.*alog(s)/s)
  134. x1 = f1*s
  135. x2 = f2*s
  136. return
  137. end
  138. C==========================================================================
  139. C
  140. C ROUTINE
  141. C random
  142. C
  143. C FUNCTION
  144. C
  145. C Pseudo random number generator.
  146. C
  147. C SYNOPSIS
  148. C function random()
  149. C
  150. C   formal 
  151. C                       data    I/O
  152. C       name            type    type    function
  153. C       -------------------------------------------------------------------
  154. C random i fun uniformly distributed
  155. C over -32768 to 32767
  156. C==========================================================================
  157. C
  158. C DESCRIPTION
  159. C
  160. C See reference.
  161. C
  162. C==========================================================================
  163. C
  164. C REFERENCE
  165. C
  166. C Knuth, The Art of Programming, Volume 2, p. 27.
  167. C
  168. C==========================================================================
  169. C*-
  170. function random ()
  171. implicit undefined(a-z)
  172. integer random
  173. integer MIDTAP, MAXTAP
  174. parameter (MIDTAP=2, MAXTAP=5)
  175. integer y(MAXTAP), j, k, temp
  176. save y, j, k
  177. data y /-21161, -8478, 30892, -10216, 16950/
  178. data j/MIDTAP/, k/MAXTAP/
  179. c
  180. c simulate 2's complement 16-bit addition
  181. c
  182. temp = and (y(k) + y(j), 65535)
  183. cAlli temp = iand (y(k) + y(j), 65535)
  184. if (temp .gt. 32767) temp = temp - 65536
  185. y(k) = temp
  186. random = temp
  187. k = k - 1
  188. if (k .le. 0) k = MAXTAP
  189. j = j - 1
  190. if (j .le. 0) j = MAXTAP
  191. return
  192. end