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

语音压缩

开发平台:

Unix_Linux

  1. ***************************************************************************
  2. *                                                                         *
  3. * CELP Voice Coder                                                  *
  4. * Version 3.2                                                   *
  5. *                                                                         *
  6. * The U.S. Government shall not be held liable for any damages      *
  7. * resulting from this code.  Further reproduction or distribution   *
  8. * of this code without prior written permission of the U.S.         *
  9. * Government is prohibited.  See NCS Technical Information Bulletin *
  10. * on FS 1016 CELP Speech Coding.   *                                                                         *   *
  11. ***************************************************************************
  12. C
  13. C ROUTINE
  14. C celp (main)
  15. C
  16. C FUNCTION
  17. C Code excited linear predictor (main routine)
  18. C
  19. C==========================================================================
  20. C
  21. C REFERENCES
  22. C
  23. C National Communication System Technical Information Bulletin
  24. C Federal Standard 1016 (to be published 1992).
  25. C
  26. C Campbell, Joseph P. Jr., Thomas E. Tremain and Vanoy C. Welch,
  27. C "The Federal Standard 1016 4800 bps CELP Voice Coder," Digital
  28. C Signal Processing, Academic Press, Vol1, No. 3, p. 145-155.
  29. C
  30. C Kemp, David, P., Retha A. Sueda and Thomas E. Tremain, "An
  31. C Evaluation of 4800 bps Voice Coders," Proceedings of the IEEE
  32. C International Conference on Acoustics, Speech and Signal Processing
  33. C (ICASSP), 1989, p. 200-203.
  34. C
  35. C Fenichel, R., "Federal Standard 1016," National Communications
  36. C System, Office of Technology and Standards, Washington, DC 20305-2010,
  37. C 14 February 1991.
  38. C
  39. C Campbell, Joseph P. Jr., Thomas E. Tremain and Vanoy C. Welch,
  40. C "The DoD 4.8 kbps Standard (Proposed Federal Standard 1016),"
  41. C "Advances in Speech Coding", Kluwer Academic Publishers, 1991,
  42. C Chapter 12, p. 121-133.
  43. C
  44. C   Tutorials:
  45. C Fallside, Frank and William Woods, Computer Speech Processing,
  46. C Prentice Hall International, 1985, Chapter 4 (by Bishnu Atal).
  47. C
  48. C==========================================================================
  49. C
  50. C 4800 bps CELP Characteristics
  51. C
  52. C                  Spectrum       Pitch            Code Book
  53. C                  -------------  ---------------  ----------------
  54. C       Update     30 ms          30/4 = 7.5 ms    30/4 = 7.5 ms
  55. C                  ll=240         lp=60            l=60
  56. C
  57. C       Order      10             256 (max) x 60   512 (max) x 60
  58. C                                 1 gain           1 gain
  59. C
  60. C       Analysis   Open loop      Closed loop      Closed loop
  61. C                  Correlation    Modified MSPE    MSPE VQ
  62. C                  30 ms Hamming  VQ, weight=0.8   weight=0.8
  63. C                  no preemphasis range 20 to 147  shift by 2
  64. C                  15 Hz BW exp   (w/ fractions)   77% sparsity
  65. C
  66. C       Bits per   34 indep LSP   index:  8+6+8+6  index:     9*4
  67. C        Frame     [3444433333]   gain(-1,2): 5*4  gain(+/-): 5*4
  68. C
  69. C       Bit Rate   1133.3 bps     1600 bps         1866.67 bps
  70. C
  71. C NOTE:  The remaining 200 bps are used as follows:  1 bit per frame
  72. C for synchronization, 4 bits per frame for forward error correction
  73. C and 1 bit per frame to provide future expansion(s) of the coder.
  74. C
  75. C==========================================================================
  76. C
  77. C UNPERMUTED BIT ASSIGNMENT
  78. C
  79. C lsp  1 1-3 lsp  6 20-22
  80. C lsp  2 4-7 lsp  7 23-25
  81. C lsp  3 8-11 lsp  8 26-28
  82. C lsp  4 12-15 lsp  9 29-31
  83. C lsp  5 16-19 lsp 10 32-34
  84. C
  85. C Subframe:   1   2   3    4
  86. C ---------- ----- ----- -----  -------
  87. C       pitch delay 35-42 ..... 87-94  .......
  88. C       delta delay ..... 62-67 .......  114-119
  89. C       pitch gain  43-47 68-72 95-99  120-124
  90. C       cbindex 48-56 73-81 100-108  125-133
  91. C       cbgain 57-61 82-86 109-113  134-138
  92. C
  93. C       future bit 139
  94. C       error control 140-143
  95. C       sync 144
  96. C
  97. C FORWARD ERROR CONTROL, HAMMING (15,11):
  98. C bits protected allocation rate parameter
  99. C 0 1 LSP
  100. C 40,41,42,92,93,94 1st-3rd MSBs 2 Pitch delay
  101. C 0 2 Delta pitch delay
  102. C 47,72,99,124     1st MSB 4 Pitch gain
  103. C 0 4 CB index
  104. C 0 4 CB gain
  105. C 139 1 1 Future bit
  106. C
  107. C SYNCHRONIZATION BIT
  108. C The sync bit (144) begins with 0 in the first frame, then alternates 
  109. C between 1 and 0 on successive frames.
  110. C
  111. C==========================================================================
  112. C INPUT FILES
  113. C ifile.spd  speech
  114. C ifile.chan channel (use for synthesis only)
  115. C lsp34.table spectrum (34 bit LSP) coding
  116. C pgain.table pitch gain gain coding
  117. C cbgain.table code book gain coding
  118. C codebook.h stochastic code book
  119. C pdelay.h adaptive code book (pitch) delay
  120. C pdencode.h pitch delay bit assignment encoding table
  121. C pddecode.h pitch delay bit assignment decoding table
  122. C submult.h submultiple pitch delay pointer table
  123. C bitprot.h bit protection (specifies FEC bits)
  124. C bitperm.h bit permutation (for burst errors)
  125. C
  126. C OUTPUT FILES
  127. C ofile.spd  speech (without high pass)
  128. C ofilehpf.spd speech (high passed)
  129. C ofilenpf.spd speech (no post filtering)
  130. C ofile.chan bit stream channel file
  131. C
  132. #ifdef SUNGRAPH
  133. C Sungraph (tm) Files:
  134. C ifile_ofile.sg_data  
  135. C channel.sg_data  
  136. C stream_error.sg_data
  137. C lsp1.sg_data  see sungraph_open.com
  138. C lsp2.sg_data
  139. C codebook.sg_data
  140. C constrain.sg_data
  141. C pitch.sg_data
  142. C error.sg_data
  143. C rc.sg_data
  144. #endif
  145. C**************************************************************************
  146. C*-
  147.         program celp
  148. implicit undefined (a-z)
  149. include 'ccsub.com'
  150. convex #include "ccsub.com"
  151.         real sold(maxll), snew(maxll), ssub(maxll)
  152. real v(maxll), vdecoded(maxll), hamw(maxll), hamws(maxll)
  153. real dpa(maxpa), dps(maxpa), ahpf(3), bhpf(3)
  154. real dppa(maxpa), dpps(maxpa)
  155. real ahpfo(3), bhpfo(3)
  156. real newfreq(maxno), unqfreq(maxno), rcn(maxno)
  157. real lsp(maxno,maxll/maxl), scale, descale, decodedgain, taus(4)
  158. real lambda, omega, alpha, beta, pddecode(0:maxpd-1)
  159. real predgain, preddiff, predavg, mindiff, dm(9), dm2(9)
  160. real cbg(maxll/maxl), pgs(maxll/maxl)
  161. integer cbi(maxll/maxl), pdencode(0:maxpd-1), pdtabi(0:maxpd-1)
  162. integer framesnr, framedm, framedm2, lnblnk
  163. integer i, j, k, l, ll, lp, nn, np
  164. integer nrec1, nrec2, nrec3, nrec9,  ierr, iodisk, oflen
  165. integer findex(maxno), error, total, ranseed, iflen
  166. integer*2 iarf(maxll), npf(maxll), pf(maxll)
  167. logical flag, snrflag, lspflag, analy, clip
  168. character*80 ifile, ofile, chfile, mfile
  169. character stype*10, anal*10
  170. data ranseed /1234567/, frame /1/, framesnr/0/
  171. data nrec1 /1/, nrec2 /1/, nrec3 /1/, nrec9 /1/
  172. c
  173. c *bit stream
  174. integer cbbits, pointer, streambits, ssum, mask(172)
  175. integer bitsum1, bitsum2, bitpointer, sbits(maxno), sync
  176. data sync /1/
  177. parameter (streambits=144)
  178. integer*2 stream(streambits), oldstream(streambits)
  179. integer pstream(streambits)
  180. integer*2 savestream(streambits), iint
  181. character*36 line
  182. c
  183. c *filter memories
  184. integer maxnop1
  185. parameter (maxnop1=maxno+1)
  186. real dhpf1(3), dhpf2(3), dsa(maxno+1), dss(maxno+1)
  187. real dhpf1o(3), dhpf2o(3)
  188. real dp1(maxno+1), dp2(maxno+1), dp3(2), dp4(2)
  189. real ip, op, sumsnr, sumdm(10), sumdm2(10)
  190. c
  191. c *initialize filter memories
  192. data d2a/maxnop1*0./, d2b/maxnop1*0./ 
  193. data d3a/maxnop1*0./, d3b/maxnop1*0./
  194. data d4a/maxnop1*0./, d4b/maxnop1*0./, d5/maxnop1*0./
  195. data d1a/maxpa*0./, d1b/maxpa*0./, d6/maxpa*0./
  196. data dhpf1/3*0./, dhpf2/3*0./, dsa/maxnop1*0./, dss/maxnop1*0./
  197. data dhpf1o/3*0./, dhpf2o/3*0./, syndavg/0./
  198. data dp1/maxnop1*0./, dp2/maxnop1*0./, dp3/2*0./, dp4/2*0./
  199. data ip/0./, op/0./, sumsnr/0./, sumdm/10*0/, sumdm2/10*0/
  200. data dpa/maxpa*0./, dps/maxpa*0./,dppa/maxpa*0./, dpps/maxpa*0./
  201. c
  202. c *error control coding parameters:
  203. real syndrun, ber, realerror, syndavg
  204. parameter (syndrun = 100.)
  205. integer codelength1, codelength2, paritylength
  206. parameter (codelength1 = 15)
  207. parameter (codelength2 = 11)
  208. parameter (paritylength = codelength1 - codelength2)
  209.         integer bitprotect(codelength2), codeword(codelength1)
  210.         integer hmatrix(codelength1), syndrometable(codelength1)
  211. integer paritybit, errorflag, bitpermute(streambits)
  212. integer perrorcount, syndrome, eccbits, errorcount
  213. logical twoerror, protect
  214. c
  215. #ifdef SUNGRAPH
  216. c
  217. c *** sungraph
  218. c *define sungraph functions
  219.         integer end_block, close_file, status
  220.         integer open_file, def_variable
  221. integer close_channel, open_var_channel, read_variable
  222. integer input_fid, num_read
  223. c *define sungraph files
  224. integer ifile_ofile_fid, channel_fid, lsp1_fid, lsp2_fid, constrain_fid
  225. integer cb_fid, pitch_fid, error_fid, stream_error_fid, rc_fid
  226. character temp_fname*80, str*17
  227. c *symbolic disk_io data types
  228. integer i2, i4, r4
  229. parameter (i2 = 1)
  230. parameter (i4 = 2)
  231. parameter (r4 = 3)
  232. c *nonhigh-passed old input speech for alignment
  233. real ssubnhp(maxll), soldnhp(maxll)
  234. c *sungraph variable id's
  235. include 'sgvar.com'
  236. convex #include "sgvar.com"
  237. #endif
  238. c
  239. c *** defaults
  240. c
  241. c Default command line i/o file names:
  242. data ifile /'../speech/3m3f.spd'/
  243. data ofile /'ofile'/, chfile /'chfile'/
  244. c Default code book parameters:
  245. data ncsize /512/, cbbits /9/, l /60/, mxsw /.true./
  246. c Default LPC analysis parameters:
  247. data ll /240/, no /10/
  248. c Default pitch analysis parameters:
  249. data lp /60/, np /1/, pstype /'hier'/, prewt /0.0/
  250. c Default noise weighting factor:
  251. data gamma /0.8/
  252. c Default input speech scale factor:
  253. data scale /1.0/, descale /1.0/
  254. c Default code book gain quantization:
  255. data cbgtype /'log'/, cbgbits /5/
  256. c Default pitch bit allocation (tau, np a's) (maxnp+1-2=2):
  257. data ptype /'max2'/, pbits /8, 6, 5, 2*0/
  258. c Default spectrum bit allocation (maxno-10=14):
  259. data stype /'kang'/, sbits /3,4,4,4,4,3,3,3,3,3/
  260. c Default error rate (eccbits=fecbits+future bit)
  261. data ber /0.0/, error /0/, total /0/, eccbits /5/
  262. c Default mask file
  263. data mfile /'none'/
  264. c
  265. c Spectrum analysis parameters (should be in cli!)
  266. data anal /'autohf'/
  267. copt Filter Coefficients for 2nd order 100 Hz HPF with 60 Hz notch:
  268. copt filter data ahpf/1., -1.99778, 1./, bhpf/1., -1.88, .89/
  269. c Filter Coefficients for 2nd order Butterworth 100 Hz HPF:
  270. data ahpf/0.946, -1.892, 0.946/, bhpf/1., -1.889033, 0.8948743/
  271. c Filter Coefficients for 2nd order Butterworth 275 Hz HPF:
  272. c275 data ahpfo/0.858, -1.716, 0.858/, bhpfo/1., -1.696452, 0.7368054/
  273. c Filter Coefficients for 2nd order Butterworth 100 Hz HPF:
  274. data ahpfo/0.946, -1.892, 0.946/, bhpfo/1., -1.889033, 0.8948743/
  275. c High frequency (stabilization) factor
  276. parameter (lambda = 0.0)
  277. c Bandwidth expansion for LPC analysis (15 Hz)
  278. parameter (omega = 0.994127)
  279. c Bandwidth expansions for postfilter
  280. parameter (alpha = 0.8)
  281. parameter (beta  = 0.5)
  282. c
  283. c *** handle underflows on Sun (Sun3 or Sun4)
  284. c This issue can be reviewed by reading the UNIX man pages
  285. c on ieee floating point (man -k ieee).
  286. c
  287. call abrupt_underflow()
  288. #include <f77/f77_floatingpoint.h>
  289. cSUN? call ieee_handler("set", "underflow", SIGFPE_DEFAULT)
  290. c
  291. c *** parse the command line
  292. c
  293. c celp [-i ifile] [-o ofile] [-c chan]
  294. c      [-p pfile] [-q qfile] [-m mfile] [-l lfile]
  295. c
  296. c note:  ncsize, no, and gamma are passed through common
  297. c note:  The calls to cli & cliend may be commented out and celp will
  298. c        operate properly with default values (without bells & whistles)
  299. c
  300. c ... If synthesizer only, 
  301. c
  302. c ... If synthesizer only, the command line interface (cli) is not
  303. c     used.  (Separate analysis is not provided since the combined
  304. c     analyzer and synthesizer generates a bit stream channel file.)
  305. c     The celp command syntax for synthesis only (analy=.false.) is:
  306. c
  307. c celp [input.chan] [ofile]
  308. c
  309. c where: input is input.chan ascii hex bit stream channel file
  310. c        output is ofile.spd speech file (postfiltered)
  311. c
  312. c *read command line,
  313. analy = .true.
  314. call cli(ifile, ofile, l, ll, lp, np, scale, descale, 
  315.      &           ber, mask, stype, sbits, eccbits, ssum, analy)
  316. c
  317. c *** initialize
  318. c *number of code words/LPC frame
  319. nn = ll/l
  320. c *dimension of d1a, d1b and d6???
  321. idb = mmax+maxnp-1+l
  322. c
  323. plevel1 = 2**pbits(1)
  324. c *levels of delta tau
  325. plevel2 = 2**pbits(2)
  326. c
  327. c *number of bits per subframe
  328. bitsum1 = cbbits+cbgbits+pbits(1)+pbits(3)
  329. bitsum2 = cbbits+cbgbits+pbits(2)+pbits(3)
  330. c
  331. c *enable/disable error control coding
  332. protect  = .true.
  333. errorflag= 0
  334. c *for double error detecting FEC codes (NOT USED)
  335. twoerror = .false.
  336. c
  337. snrflag  = .false.
  338. lspflag  = .true.
  339. c
  340. c *start nseg at 0 to do pitch on odd segments
  341. c (nseg is incremented before csub) 
  342.         nseg  = 0
  343. c
  344. c *generate matrix for error control coding
  345. call matrixgen(codelength1, codelength2, hmatrix, syndrometable)
  346. c
  347. c *generate Hamming windows
  348.         call ham(hamw,ll)
  349. c *UNNECESSARY, used for distortion diagnostics
  350.         call ham(hamws,l)
  351. c
  352. c
  353. c *** open and define files
  354. c
  355. if (analy) then
  356. #ifdef SUNGRAPH
  357. c
  358. c *sungraph (tm) files
  359. include 'sgopen.com'
  360. convex #include "sgopen.com"
  361. #else
  362. c *input file
  363. if (iodisk(3, 9, ifile, nrec9, iarf, ll) .ne. 0)
  364.      &    stop '*** Error opening ifile.spd'
  365. #endif
  366. end if
  367. c *postfiltered & nonpostfiltered output
  368. oflen = lnblnk(ofile)
  369. iflen = lnblnk(ifile)
  370. if(iodisk(4,1,ofile(1:oflen)//'.spd',nrec1,pf,l).ne.0)
  371.      &    stop '*** Error opening ofile.spd'
  372. cnpf if(iodisk(4,2,ofile(1:oflen)//'npf.spd',nrec2,npf,l).ne.0)
  373. cnpf     +    stop '*** Error opening ofilenpf.spd'
  374. if(iodisk(4,3,ofile(1:oflen)//'hpf.spd',nrec3,pf,l).ne.0)
  375.      &    stop '*** Error opening ofilehpf.spd'
  376. c
  377. c *bit stream channel file
  378. if (analy) then
  379.    open(unit=25, file=ofile(1:oflen)//'.chan')
  380. else
  381.    open(unit=25, file=ifile(1:iflen)//'.chan', status='old')
  382. end if
  383. c
  384. c *quantizer design (data collection) files
  385. copt open(unit=20, file='cbgain.data')
  386. copt open(unit=21, file='pgain.data')
  387. c
  388. c *read stochastic code book vector file (by 20)
  389. open(unit=11, file='./codebook.h', status='old', err=112)
  390. i = 1
  391. do 110 j = 1, (2*(maxncsize-1)+l)/20
  392.    read(11, *, err=112) (x(k), k=i,i-1+20)
  393.    i = i + 20
  394. 110 continue
  395. read(11, *, err=112) (x(k), k=i,i-1+mod((2*(maxncsize-1)+l),20))
  396. close(11)
  397. go to 115
  398. 112    stop ' celp:  Problem with file "codebook.h"'
  399. 115 continue
  400. c
  401. c *read adaptive code book index (pitch delay) file
  402. open(unit=12, file='./pdelay.h', status='old', err=122)
  403. do 120 i = 0, maxpd-1
  404.    read(12, *, err=122) pdelay(i)
  405. 120 continue
  406. close(12)
  407. go to 125
  408. 122    stop ' celp:  Problem with file "pdelay.h"'
  409. 125 continue
  410. c
  411. c *read pitch delay coding tables for bit assignment
  412. c *pdencode.h for encoding, pddecode.h for decoding
  413. c *generate pdtabi for delta delay coding
  414. open(unit=13, file='./pdencode.h', status='old', err=132)
  415. open(unit=14, file='./pddecode.h', status='old', err=142)
  416. do 130 i = 0, maxpd-1
  417.    read(13, '(z)', err=132) pdencode(i)
  418.    read(14, *, err=142) pddecode(i)
  419.    pdtabi(pdencode(i)) = i
  420. 130 continue
  421. close(13)
  422. close(14)
  423. go to 145
  424. 132    stop ' celp:  Problem with file "pdencode.h"'
  425. 142    stop ' celp:  Problem with file "pddecode.h"'
  426. 145 continue
  427. c
  428. c *read bit protection file
  429. open(unit=15, file='./bitprot.h', status='old', err=152)
  430.    read(15, *, err=152) bitprotect(1:codelength2)
  431. close(15)
  432. go to 155
  433. 152    stop ' celp:  Problem with file "bitprot.h"'
  434. 155 continue
  435. c
  436. c *read bit permutation file (by 12)
  437. open(unit=16, file='./bitperm.h', status='old', err=162)
  438. i = 1
  439. do 160 j = 1, streambits/12
  440.    read(16, *, err=162) (bitpermute(k), k=i,i+11)
  441.    i = i + 12
  442. 160 continue
  443. close(16)
  444. go to 165
  445. 162    stop ' celp:  Problem with file "bitperm.h"'
  446. 165 continue
  447. c
  448. c..................... m a i n  l o o p ........(fortran 77 do while)......
  449. c
  450. c
  451. c *** ANALYSIS ..................................................
  452. c
  453. c *** if synthesizer only, skip analyzer >>>>>>>>>>>>>>>>>>>>>>>>
  454. c
  455. 69 if (analy) then
  456.    pointer = 1
  457. c
  458. c *read speech segment s of size ll, until end of file
  459. c
  460. #ifdef SUNGRAPH
  461.    status=read_variable(input_fid, iarf, ll, num_read)
  462.    if (status .lt. 0) then
  463.       if (status .eq. -5) go to 999
  464.       call print_disk_read_error(status,'read_input_fid')
  465.    end if
  466. #else
  467.    if (iodisk(1, 9, ifile, nrec9, iarf, ll) .ne. ll) go to 999
  468. #endif
  469. c
  470. c *scale and convert to real speech 
  471. c *The ssub buffer used for subframe CELP analysis is 1/2 a
  472. c *frame behind the snew buffer and 1/2 a frame ahead of the 
  473. c *sold buffer.
  474.    do 200 i=1,ll
  475.               snew(i)=max(min(scale * iarf(i), 32767.), -32768.)
  476. 200    continue
  477. #ifdef SUNGRAPH
  478. c
  479. c *create ssubnhp vector for sungraph
  480.    do 203 i=1,ll/2
  481.       ssubnhp(i)=soldnhp(i+ll/2)
  482.       ssubnhp(i+ll/2)=snew(i)
  483. 203    continue
  484. c
  485. c *save input speech in file 'ifile_ofile'
  486.    call save_sg(ifile_vid, ssubnhp, ll, 'save speech_in_vid')
  487. c
  488. c *save snew in soldnhp for sungraph in next frame
  489.    do 207 i=1,ll
  490.       soldnhp(i)=snew(i)
  491. 207    continue
  492. #endif
  493. c
  494. c *high pass filter snew
  495.    call zerofilt(ahpf,2,dhpf1,snew,ll)
  496.    call polefilt(bhpf,2,dhpf2,snew,ll)
  497. c
  498. c
  499. c *make ssub vector from snew and sold
  500.    do 210 i=1,ll/2
  501.       ssub(i)=sold(i+ll/2)
  502.       ssub(i+ll/2)=snew(i)
  503. 210    continue
  504. c
  505. #ifdef SUNGRAPH
  506. c
  507. c *save high-passed future input in file 'ifile_ofile'
  508.    call save_sg(ifile_hp_vid, ssub, ll,'save ifile_hp_vid')
  509. #endif
  510. c
  511. c
  512. c    *** LPC spectral analysis (open loop)
  513. c    NOTE:  Autocorrelation was found superior to covariance analysis!
  514. c
  515.    if (anal .eq. 'autohf') then
  516.       call autohf(snew, hamw, ll, no, lambda, omega, fcn, rcn)
  517.    end if
  518. c
  519. #ifdef SUNGRAPH
  520. c *save rc's in file 'rc'
  521.   do 220 i=1,no
  522.      call save_sg(rc_vid(i), rcn(i), 1, 'save rc_vid')
  523. 220   continue
  524. #endif
  525. c
  526. c *pc -> lsp (new)
  527.    call pctolsp2(fcn, no, newfreq, lspflag)
  528.    if(lspflag) then
  529.       print *,' celp:  Bad "new" lsp at frame: ',frame
  530.       print 1030, 'lsp: ', (newfreq(i), i = 1, no)
  531.       print 1035, 'pc:  ', (fcn(i), i = 1, no+1)
  532.       print 1030, 'rc:  ', (rcn(i), i = 1, no)
  533. 1030       format(1x, a, 10f9.5)
  534. 1035       format(1x, a, 11f9.5)
  535.    end if
  536. c
  537. c *save unquantized lsp
  538.    do 230 i=1,no
  539.       unqfreq(i)=newfreq(i)
  540. 230    continue
  541. cc *quantize lsp's
  542.    if (stype .ne. 'none') then
  543.       if (stype .eq. 'kang') then
  544.  call lsp34(newfreq,no,sbits,findex)
  545.       end if
  546.    else
  547.       print *,'*** No lsp quantization'
  548.    end if
  549. c
  550. #ifdef SUNGRAPH
  551. c *save future lsp variables in file 'lsp1'
  552.    do 233 i=1,no
  553.       call save_sg(lsp_vid(i), unqfreq(i), 1,'save lsp_vid')
  554. 233    continue
  555. c
  556. c *save future qlsp variables in file 'lsp1'
  557.    do 237 i=1,no
  558.       call save_sg(qlsp_vid(i), newfreq(i), 1,'save qlsp_vid')
  559. 237    continue
  560. c
  561. #endif
  562. c *measure spectral distortion
  563. c *UNNECESSARY, used for diagnostics
  564.    call specdist(unqfreq, newfreq, dm2, sumdm2, framedm2)
  565. c
  566. c *pack lsp indices in bit stream array
  567.    do 240 i=1,no
  568.       call pack(findex(i),sbits(i),streambits,stream,pointer)
  569. 240    continue
  570. c
  571. c *linearly interpolate LSPs for each subframe
  572.    call intanaly(newfreq, nn, lsp)
  573. c
  574. c    *** for each subframe, search stochastic & adaptive code books
  575. c
  576.    k = 1
  577.    do 300 i = 1, nn
  578. #ifdef SUNGRAPH
  579. c *save interpolated lsp's in file 'lsp2'
  580.       do 310 j=1,no
  581.          call save_sg(lsp_analy_vid(j), lsp(j,i), 1,'save lsp_analy_vid')
  582. 310       continue
  583. #endif
  584.       call lsptopc(lsp(1,i),fci)
  585.       do 320 j=1,no+1
  586.          fc(j)=fci(j)
  587. 320       continue
  588.               nseg = nseg + 1
  589. c
  590. c       *** code book & pitch searches
  591. c
  592.               call csub(ssub(k),v(k),l,lp)
  593. #ifdef SUNGRAPH
  594. c *save code book index in file 'cbindex'
  595.       call save_sg(cb_index_vid, cbindex, 1,'save cb_index_vid')
  596. c
  597. c *save tau in file 'pitch'
  598.       call save_sg(pitch_tau_vid,bb(1),1,'save pitch_tau_vid')
  599. #endif
  600. c
  601. c *pitch quantization tau
  602. c
  603. c *pack parameter indices in bit stream array
  604.       if (mod(i,2) .ne. 0) then
  605.                  call packtau(tauptr-minptr,pbits(1),streambits,
  606.      &               pdencode,stream,pointer)
  607.       else
  608.                  call pack(tauptr-minptr,pbits(2),streambits,
  609.      &            stream,pointer)
  610.       end if
  611.               call pack(pindex,pbits(3),streambits,stream,pointer)
  612.       cbindex=cbindex-1
  613.       call pack(cbindex,cbbits,streambits,stream,pointer)
  614.       call pack(gindex,cbgbits,streambits,stream,pointer)
  615. c
  616. c *decode parameters for analysis by synthesis
  617.       cbindex=cbindex+1
  618. c
  619. c  *pitch synthesis (UNNECESSARY, used for diagnostics)
  620.       call pitchvq(v(k),l,dpa,idb,bb,'long')
  621. c
  622. c *pitch pre filter (UNNECESSARY, used for diagnostics)
  623.       if (prewt.ne.0.0) call prefilt(v(k),l,dppa)
  624. c
  625. c *lpc synthesis (UNNECESSARY, used for diagnostics)
  626.       call polefilt(fci,no,dsa,v(k),l)
  627. c
  628.               k = k + l
  629. 300    continue
  630. c
  631. c    *** bit error protection
  632. c                       *extract bits to protect from stream array
  633.            if (protect) then
  634.               do 410 i=1,codelength2
  635.                  codeword(i)=stream(bitprotect(i))
  636. 410           continue
  637. c
  638. c                       *Hamming encode
  639.              call encodeham(codelength1,codelength2,hmatrix,
  640.      &                    paritybit,codeword)
  641. c
  642. c *pack future bit
  643.       call pack(0,1,streambits,stream,pointer)
  644. c
  645. c                       *pack parity bits
  646.               do 420 i=1,paritylength
  647.                  call pack(codeword(codelength2+i),1,streambits,
  648.      &                     stream,pointer)
  649. 420           continue
  650. cnotused  call pack(paritybit,1,streambits,stream,pointer)
  651. c
  652. c *toggle and pack sync bit
  653.       sync = sync .xor. 1
  654.       call pack(sync,1,streambits,stream,pointer)
  655.            end if
  656. #ifdef SUNGRAPH
  657. c *save stream array in channel file
  658.    call save_sg(channel_vid, stream, streambits,'save channel_vid')
  659. c
  660. c *save stream array in stream_error file
  661.    call save_sg(stream_vid, stream, streambits,'save stream_vid')
  662. #endif
  663. c
  664. c *save stream
  665.    do 430 i=1,streambits
  666.       savestream(i)=stream(i)
  667. 430    continue
  668. c
  669. c *permute bitstream
  670.    do 440 i=1,streambits
  671.       pstream(i)=stream(bitpermute(i))
  672. 440    continue       
  673. c
  674. c *save stream in Dave's format
  675.    call puthex(streambits,pstream,line)
  676.    write (25,1040) line
  677. 1040    format (a36)
  678. c
  679. c
  680. c *** synthesizer only <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
  681. c
  682. else
  683. c
  684. c    *** CHANNEL ..................................................
  685. c
  686. c     *read in channel file (if synthesis only)
  687.    read (25,1050,end=444) line
  688. 1050    format(a)
  689.    call gethex (streambits,pstream,line)
  690. c
  691. c *** end analyzer/synthesiser only differences >>>>>>>>>>>>>>>>>>>
  692. c
  693. end if
  694. c
  695. c *unpermute bitstream
  696. do 450 i=1,streambits
  697.    stream(bitpermute(i))=pstream(i)
  698. 450 continue
  699. c
  700. c    *corrupt the channel with bit errors 
  701. c
  702. call biterror(ber,mask,frame,stream,streambits,error,total)
  703. #ifdef SUNGRAPH
  704. c *save stream array in stream_error file
  705. if (analy) call save_sg(stream_error_vid, stream, streambits,
  706.      &                       'save stream_error_vid')
  707. #endif
  708. c
  709. c    *** SYNTHESIS ..................................................
  710. c
  711. c                       *unpack parity bits
  712. if (protect) then
  713.    pointer=pointer-paritylength-2
  714.    if (.not. analy) pointer=139
  715.    do 510 i=1,paritylength
  716.       call unpack(stream,1,streambits,codeword(codelength2+i),pointer)
  717. 510        continue
  718. c          call unpack(stream,1,streambits,paritybit,pointer)
  719. c
  720. c *extract code word from stream array
  721.            do 520 i=1,codelength2
  722.               codeword(i)=stream(bitprotect(i))
  723. 520        continue
  724. c
  725. c *repack future bit (remains constant for now)
  726.    codeword(11)=0
  727. c
  728. c                       *Hamming decode
  729.            call decodeham(codelength1,codelength2,hmatrix,
  730.      &        syndrometable,paritybit,codeword,twoerror,syndrome)
  731. c
  732. c *disable parity check (if parity not used)
  733.    twoerror = .false.
  734. c
  735. c *bit error rate estimator (running avg of bad syndromes)
  736.    if (syndrome .ne. 0) syndrome = 1
  737.    syndavg = (1.-(1./syndrun))*syndavg+(1./syndrun)*float(syndrome)
  738. c
  739. c                       *repack protected bits
  740.            do 530 i=1,codelength2
  741.               stream(bitprotect(i))=codeword(i)
  742. 530        continue
  743. #ifdef SUNGRAPH
  744. c *save stream array in stream_error file
  745.    if (analy) call save_sg(stream_error_s_vid, stream, streambits,
  746.      &                         'save stream_error_s_vid')
  747. #endif
  748. c
  749. c *compare saved stream with channel stream
  750.    errorcount=0
  751.    do 540 i=1,streambits
  752.       if (savestream(i) .ne. stream(i)) then
  753.  iint=1
  754.  errorcount=errorcount+1
  755. #ifdef SUNGRAPH
  756.  if (analy) call save_sg(bit_error_vid,iint,1,
  757.      &                  'save bit_error_vid')
  758. #endif
  759.       else
  760.  iint=0
  761. #ifdef SUNGRAPH
  762.     if (analy) call save_sg(bit_error_vid,iint,1,
  763.      &                       'save bit_error_vid')
  764. #endif
  765.       end if
  766. 540    continue
  767.    perrorcount=0
  768.    do 550 i=1,codelength2
  769.       if (savestream(bitprotect(i)) .ne. stream(bitprotect(i)))
  770.      &               perrorcount=perrorcount+1
  771. 550    continue
  772. c
  773. c *frame repeat if two errors detected in code word
  774. copt           if (twoerror) then
  775. copt       print *,' celp:  two errors have occured in frame',frame
  776. copt             do 560 i=1,streambits
  777. copt                stream(i)=oldstream(i)
  778. copt560          continue
  779. copt             twoerror = .false.
  780. copt           end if
  781.            do 570 i=1,streambits
  782.               oldstream(i)=stream(i)
  783. 570        continue
  784. end if
  785. c
  786. pointer=0
  787. c
  788. c *unpack data stream
  789. do 580 i=1,no
  790.    call unpack(stream,sbits(i),streambits,findex(i),pointer)
  791. 580 continue
  792. c *decode lsp's
  793. if (stype .ne. 'none') then
  794.    if (stype .eq. 'kang') then
  795.       call lspdecode34(findex,no,newfreq)
  796.    else
  797.       stop 'Problem with lspdecoding'
  798.    end if
  799. end if
  800. c *interpolate spectrum lsp's for nn subframes
  801. call intsynth(newfreq, nn, lsp, twoerror, syndavg, predgain,
  802.      &    preddiff, predavg, mindiff)
  803. #ifdef SUNGRAPH
  804. c *save spectrum smoothing parameters in file 'rc'
  805. if (analy) then
  806.    call save_sg(predgain_vid, predgain, 1, 'save predgain_vid')
  807.    call save_sg(preddiff_vid, preddiff, 1, 'save preddiff_vid')
  808.    call save_sg(predavg_vid, predavg, 1, 'save predavg_vid')
  809.    call save_sg(mindiff_vid, mindiff, 1, 'save mindiff_vid')
  810. end if
  811. #endif
  812. c
  813. c *decode all code book and pitch parameters
  814. bitpointer=pointer
  815. call dcodtau(pbits(1),pbits(2),bitsum1,bitsum2,bitpointer,nn,
  816.      &    stream,streambits,pddecode,pdtabi,taus)
  817. call dcodpg(pbits(3),ptype,bitsum1,bitsum2,bitpointer,nn,stream,
  818.      &    streambits,pgs)
  819. call dcodcbi(cbbits,bitsum1,bitsum2,bitpointer,nn,stream,
  820.      &    streambits,cbi)
  821. call dcodcbg(cbgbits,cbgtype,bitsum1,bitsum2,bitpointer,nn,stream,
  822.      &    streambits,cbg)
  823. c
  824. c    *** synthesize each subframe
  825. c
  826. if (analy) nseg = nseg - nn
  827. k = 1
  828. do 600 i = 1, nn
  829.    nseg = nseg + 1
  830. c
  831. #ifdef SUNGRAPH
  832. c *save interpolated lsp's in file 'lsp2'
  833.    if (analy) then
  834.    do 610 j=1,no
  835.       call save_sg(lsp_synth_vid(j), lsp(j,i), 1,'save lsp_synth_vid')
  836. 610    continue
  837.    end if
  838. #endif
  839. c
  840. c *decode values for subframe 
  841.    cbindex = cbi(i)
  842.    decodedgain = cbg(i)
  843.    if (protect) call smoothcbgain(decodedgain,twoerror,syndavg,
  844.      & cbg,i)
  845. c
  846. c *code book synthesis
  847.    call vdecode(decodedgain,l,vdecoded(k))
  848. c
  849.            if (protect) call smoothtau(taus(i),twoerror,
  850.      &                                 syndavg,taus(3),i)
  851.    bb(1)=taus(i)
  852.    bb(3)=pgs(i)
  853.    if (protect) call smoothpgain(bb(3),twoerror,syndavg,pgs,i)
  854. c
  855. #ifdef SUNGRAPH
  856. c *save synthesis parameters in sungraph files
  857.    if (analy) call save_sg(cb_index_synth_vid, cbindex, 1,
  858.      &       'save cb_index_synth_vid')
  859.    if (analy) call save_sg(pitch_tau_synth_vid, bb(1), 1,
  860.      &       'save pitch_tau_synth_vid')
  861.    if (analy) call save_sg(cb_qgain_synth_vid, decodedgain, 1,
  862.      &       'save cb_qgain_synth_vid')
  863.    if (analy) call save_sg(pitch_qgain_synth_vid, bb(3), 1, 
  864.      &       'save pitch_qgain_synth_vid')
  865. #endif
  866. c
  867. c *pitch synthesis
  868.    call pitchvq(vdecoded(k),l,dps,idb,bb,'long')
  869. c
  870. c *pitch pre filter (synthesis)
  871.    if (prewt.ne.0.0) call prefilt(vdecoded(k),l,dpps)
  872. c
  873. c *convert lsp's to pc's
  874.    call lsptopc(lsp(1,i),fci)
  875. c
  876. c *lpc synthesis
  877.    call polefilt(fci,no,dss,vdecoded(k),l)
  878. c
  879. c       *** check analysis versus synthesis speech
  880. c
  881.    flag = .false.
  882.    do 620 j = 0, l-1
  883.       if (abs(v(k+j)-vdecoded(k+j)) .gt. 1.e-6) flag=.true.
  884. 620    continue
  885.    if (flag .and. analy) print *,
  886.      &               ' celp:  Speech mismatch at frame',frame
  887. c
  888. c       *** write nonpostfiltered output speech disk files
  889. c
  890.    do 630 j = 0, l-1 
  891.       vdecoded(k+j) = descale * vdecoded(k+j)
  892.       npf(k+j)=nint(max(-32768.,min (32767., vdecoded(k+j))))
  893. canaly       npf(k+j)=nint(max(-32768.,min (32767., v(k+j))))
  894. 630    continue
  895. c *write npf output speech file "ofilenpf"
  896. cnpf    if (iodisk(2,2,ofile(1:oflen)//'npf.spd',nrec2,npf(k),l).ne.l)
  897. cnpf     &          go to 888
  898. #ifdef SUNGRAPH
  899. c *sungraph's npf output speech file 'ifile_ofile'
  900.    if (analy) call save_sg(ofile_npf_vid,npf(k),l,
  901.      & 'save ofile_npf_vid')
  902. #endif
  903. c
  904. c       *** calculate the average segmental SNR
  905. c *UNNECESSARY, used for diagnostics
  906. c
  907.    if (analy) call segsnr(ssub(k),npf(k),l,sumsnr,framesnr,snrflag)
  908. c
  909. c       *** calculate distortions/distances (log spectral error, etc.)
  910. c *UNNECESSARY, used for diagnostics
  911. c
  912.    if (snrflag .and. analy) call distortion(ssub(k),npf(k),hamws,
  913.      &                    l,no,dm,sumdm,framedm)
  914. c
  915. c       *** post filtering
  916. c
  917.   call postfilt(vdecoded(k),l,alpha,beta,ip,op,dp1,dp2,dp3,dp4)
  918. canaly   call postfilt(v(k),l,alpha,beta,ip,op,dp1,dp2,dp3,dp4)
  919. clocomp   call postfilt2(vdecoded(k),l,alpha,beta,ip,op,dp1,dp2,dp3,dp4)
  920. c
  921. c       *** test for output speech clipping
  922. c
  923. 636    if (clip(vdecoded(k), l)) then
  924. c *frame repeat & recall synthesizer?
  925. c *or scale vdecoded?
  926.       print *,' celp:  Clipping detected at frame', frame
  927.       do 635 j = 0, l-1
  928.  vdecoded(k+j) = 0.05*vdecoded(k+j)
  929. 635       continue
  930.       go to 636
  931.    end if
  932. c
  933. c       *** write postfiltered output speech disk files
  934. c
  935.   do 640 j = 0, l-1
  936.       pf(k+j)=nint(max(-32768.,min (32767., vdecoded(k+j))))
  937. canaly       pf(k+j)=nint(max(-32768.,min (32767., v(k+j))))
  938. 640    continue
  939. c
  940. c *write output speech file "ofile"
  941.    if (iodisk(2,1,ofile(1:oflen)//'.spd',nrec1,pf(k),l).ne.l)
  942.      &          go to 888
  943. #ifdef SUNGRAPH
  944. c *sungraph's output speech file 'ifile_ofile'
  945.    if (analy) call save_sg(ofile_pf_vid,pf(k),l,'save ofile_pf_vid')
  946. #endif
  947. c
  948. c       *** high pass filter output speech
  949. c
  950.    call zerofilt(ahpfo,2,dhpf1o,vdecoded(k),l)
  951.    call polefilt(bhpfo,2,dhpf2o,vdecoded(k),l)
  952. c
  953.    do 641 j = 0, l-1
  954.       pf(k+j)=nint(max(-32768.,min (32767., vdecoded(k+j))))
  955. 641    continue
  956. c
  957. c *write output speech file "ofilehpf"
  958.    if (iodisk(2,3,ofile(1:oflen)//'hpf.spd',nrec3,pf(k),l).ne.l)
  959.      &          go to 888
  960. c
  961. #ifdef SUNGRAPH
  962. c *sungraph's output speech file 'ifile_ofile'
  963.    if (analy) call save_sg(ofile_hpf_vid,pf(k),l,'save ofile_hpf_vid')
  964. #endif
  965. c
  966.    k = k + l
  967. 600 continue
  968. c    . . . . . . . . . . . . . . . . . . . . . . .
  969. c
  970. c *** end block
  971. c
  972. frame = frame + 1
  973. c
  974. c *display a propeller (rotating bar) once per frame
  975. call mark(0)
  976. cframe print *,'frame= ',frame
  977. if (.not. analy) go to 69
  978. c
  979. #ifdef SUNGRAPH
  980. include 'sgeblk.com'
  981. convex #include "sgeblk.com"
  982. #endif
  983. c
  984. c    *** shift new speech buffer into old speech buffer
  985. c
  986. c sold    snew
  987. c |-------------------|-------------------| snew
  988. c   |-------------------| 
  989. c    ssub
  990. c
  991. do 730 i = 1, ll
  992.    sold(i) = snew(i)
  993. 730 continue
  994. c
  995. c    *** frame finished, end loop
  996. go to 69
  997. c
  998. c................ e n d  m a i n  l o o p ......(fortran 77 do while)......
  999. c
  1000. c *** WRAP-UP ..................................................
  1001. c
  1002. c
  1003. c *** exit through here if a file write error occurs
  1004. c
  1005. 888 print *,' celp:  Error writing output file'
  1006. c
  1007. c *** finished reading & processing "ifile"
  1008. c
  1009. 999     continue
  1010. c
  1011. c *** closing cue and close files
  1012. c
  1013. do 810 i = 1, streambits
  1014.    stream(i) = 23456
  1015. 810 continue
  1016.         ierr=iodisk(-1,1,ofile(1:oflen)//'.spd',nrec1,pf,l)
  1017. cnpf ierr=iodisk(-1,2,ofile(1:oflen)//'npf.spd',nrec2,npf,l)
  1018. ierr=iodisk(-1,3,ofile(1:oflen)//'hpf.spd',nrec3,pf,l)
  1019. cc close (20)
  1020. cc close (21)
  1021. close (25)
  1022. c
  1023. #ifdef SUNGRAPH
  1024. include 'sgclose.com'
  1025. convex #include "sgclose.com"
  1026. #else
  1027. ierr=iodisk(-1,9,ifile,nrec9,iarf,ll)
  1028. #endif
  1029. if (total .ne. 0) then
  1030.    realerror=100.*(float(error)/float(total))
  1031. else
  1032.    realerror=0.0
  1033. end if
  1034. 444 call cliend(sumsnr,framesnr,realerror,
  1035.      &     sumdm,framedm,sumdm2,framedm2, analy)
  1036. if (.not. analy) print *,'Synthesis run successful'
  1037. stop
  1038. end