celp.c
上传用户:tsjrly
上传日期:2021-02-19
资源大小:107k
文件大小:31k
源码类别:

语音压缩

开发平台:

C/C++

  1. /**************************************************************************
  2. *                                                                         *
  3. * CELP Voice Coder                                                  *
  4. * Version 3.2c                                                   *
  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.                                     *
  10. *                                                                         *
  11. ***************************************************************************
  12. *
  13. * ROUTINE
  14. * celp (main)
  15. *
  16. * FUNCTION
  17. * Codebook excited linear predictor (main routine)
  18. *
  19. ***************************************************************************
  20. *
  21. * REFERENCES
  22. *
  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. *
  48. ***************************************************************************
  49. *
  50. * 4800 bps CELP Characteristics
  51. *
  52. *                  Spectrum       Pitch            Code Book
  53. *                  -------------  ---------------  -----------------
  54. *       Update     30 ms          30/4 = 7.5 ms    30/4 = 7.5 ms
  55. *                  ll=240         lp=60            l=60
  56. *
  57. *       Order      10             256 (max) x 60   512 (max) x 60
  58. *   1 gain    1 gain
  59. *
  60. *       Analysis   Open loop      Closed loop      Closed loop
  61. *                  Correlation    Modified MSPE    MSPE VQ
  62. *                  30 ms Hamming  VQ, weight=0.8   weight=0.8
  63. *                  no preemphasis range 20 to 147  shift by 2
  64. *                  15 Hz BW exp   (w/ fractions)   77% sparsity
  65. *
  66. *       Bits per   34 indep LSP   index:  8+6+8+6  index:     9*4
  67. *        Frame     [3444433333]   gain(-1,2): 5*4  gain(+/-): 5*4
  68. *
  69. *       Bit Rate   1133.3 bps     1600 bps       1866.67 bps
  70. *
  71. * NOTE:  The remaining 200 bps are used as follows:  1 bit per frame
  72. * for synchronization, 4 bits per frame for forward error correction
  73. * and 1 bit per frame to provide future expansion(s) of the coder.
  74. *
  75. ***************************************************************************
  76. *
  77. * UNPERMUTED BIT ASSIGNMENT
  78. *
  79. * lsp  1 1-3 lsp  6 20-22
  80. * lsp  2 4-7 lsp  7 23-25
  81. * lsp  3 8-11 lsp  8 26-28
  82. * lsp  4 12-15 lsp  9 29-31
  83. * lsp  5 16-19 lsp 10 32-34
  84. *
  85. * Subframe:   1   2   3    4
  86. * ---------- ----- ----- -----  -------
  87. *       pitch delay 35-42 ..... 87-94  .......
  88. *       delta delay ..... 62-67 .......  114-119
  89. *       pitch gain  43-47 68-72 95-99  120-124
  90. *       cbindex 48-56 73-81 100-108  125-133
  91. *       cbgain 57-61 82-86 109-113  134-138
  92. *
  93. *       future bit 139
  94. *       error control 140-143
  95. *       sync 144
  96. *
  97. * FORWARD ERROR CONTROL, HAMMING (15,11):
  98. * bits protected allocation rate parameter
  99. * 0 1 LSP
  100. * 40,41,42,92,93,94 1st-3rd MSBs 2 Pitch delay
  101. * 0 2 Delta pitch delay
  102. * 47,72,99,124     1st MSB 4 Pitch gain
  103. * 0 4 CB index
  104. * 0 4 CB gain
  105. * 139 1 1 Future bit
  106. *
  107. * SYNCHRONIZATION BIT
  108. * The sync bit (144) begins with 0 in the first frame, then alternates 
  109. * between 1 and 0 on successive frames.
  110. *
  111. ***************************************************************************
  112. * INPUT FILES
  113. * ifile.spd  speech
  114. * ifile.chan channel (use for synthesis only)
  115. * codebook.h stochastic code book
  116. * pdelay.h adaptive code book (pitch) delay
  117. * pdencode.h pitch delay bit assignment encoding table
  118. * pddecode.h pitch delay bit assignment decoding table
  119. * submult.h submultiple pitch delay pointer table
  120. * bitprot.h bit protection (specifies FEC bits)
  121. * bitperm.h bit permutation (for burst errors)
  122. *
  123. * OUTPUT FILES
  124. * ofile.spd  speech (without high pass)
  125. * ofilehpf.spd speech (high pass)
  126. * ofilenpf.spd speech (no post filtering)
  127. * ofile.chan bit stream channel file
  128. *
  129. * Sungraph (tm) Files:
  130. * ifile_ofile.sg_data
  131. * channel.sg_data
  132. * stream_error.sg_data
  133. * lsp1.sg_data   see sungraph_open.h
  134. * lsp2.sg_data
  135. * codebook.sg_data
  136. * constrain.sg_data
  137. * pitch.sg_data
  138. * error.sg_data
  139. * rc.sg_data
  140. *
  141. **************************************************************************
  142. *   global
  143. *
  144. *
  145. * SPECTRUM VARIABLES:
  146. * fc float LPC filter/weighting filter coefficients
  147. * fcn float new weighting filter coefficients
  148. * fci float interpolated weighting filter coefficients
  149. * gamma2 float weight factor
  150. * no int filter order  predictor
  151. *
  152. * PITCH VARIABLES:
  153. * bb float pitch predictor coefficients
  154. * idb int dimension of d1a and d1b???
  155. * tauptr  int pitch delay pointer
  156. * minptr int minimum delay pointer
  157. * pbits int pitch gain coding bit allocation
  158. * pindex int pitch gain index bb[2]
  159. * ptype char pitch gain (bb[2]) quantizer type
  160. * prewt   real pitch prefilter weighting (0.0 = off)
  161. * pstype  char    pitch search type (hier, full, or intg)
  162. * pdelay float pitch delay coding table
  163. * plevel1 float number of full search pitch delays
  164. * plevel2 float number of delta search pitch delays
  165. *
  166. * CODE BOOK VARIABLES:
  167. * cbgbits int code book gain bit allocation
  168. * cbgtype char code book gain quantizer type
  169. * mxsw int modified excitation switch on(1) or off(0)
  170. * cbindex int code book index
  171. * e0 float initial error and updated error
  172. * gindex int gain index
  173. * h float impulse response
  174. * ncsize int code book size
  175. * nseg int segment counter
  176. * x float code book
  177. *
  178. *
  179. * MISCELLANEOUS:
  180. * frame int frame counter
  181. *
  182. **************************************************************************/
  183. #ifdef STREAMLINE
  184. #undef SUNGRAPH
  185. #endif
  186. #ifndef ANALY
  187. #undef SUNGRAPH
  188. #endif
  189. #define TRUE 1
  190. #define FALSE 0
  191. #define STREAMBITS 144
  192. #define CODELENGTH1 15
  193. #define CODELENGTH2 11
  194. #define PARITYLENGTH (CODELENGTH1 - CODELENGTH2)
  195. #define SYNDRUN 100
  196. #define OMEGA 0.994127  /* Bandwidth expansion for LPC analysis (15 Hz) */
  197. #define ALPHA 0.8  /* Bandwidth expansion for postfilter */
  198. #define BETA 0.5  /* Bandwidth expansion for postfilter */
  199. #define I2 1  /* symbolic disk_io data type */
  200. #define I4 2  /* symbolic disk_io data type */
  201. #define R4 3  /* symbolic disk_io data type */
  202. #define mmax(A,B)        ((A)>(B)?(A):(B))
  203. #define mmin(A,B)        ((A)<(B)?(A):(B))
  204. #include <stdio.h>
  205. #include <math.h>
  206. #include <strings.h>
  207. /* #include <floatingpoint.h> /* uncomment if you use ieee_handler below */
  208. #include "ccsub.h"
  209. int cbgbits = 5, cbindex = 0, gindex = 0, idb = 0, ncsize = 512, no = 10;
  210. int nseg = 0, pindex = 0, frame = 0, tauptr = 0, minptr = 0, plevel1 = 0;
  211. int plevel2 = 0, pbits[MAXNP + 2] = {8, 6, 5, 0, 0};
  212. int mxsw = 1;
  213. float bb[MAXNP + 1], e0[MAXLP];
  214. float fc[MAXNO + 1], fcn[MAXNO + 1], fci[MAXNO + 1];
  215. float h[MAXLP], gamma2 = 0.8, prewt = 0.0;
  216.   /* *read adaptive code book index (pitch delay) file */
  217. float pdelay[MAXPD] = 
  218. {
  219. #include "pdelay.h"
  220. };
  221.   /* *load stochastic code book vector file */
  222. float x[MAXCODE] = 
  223. {
  224. #include "codebook.h"
  225. };
  226. char ptype[10] = "max2", cbgtype[10] = "log";
  227. char pstype[10] = "hier"; 
  228. #ifdef SUNGRAPH
  229. int ifile_vid, ifile_hp_vid, ofile_npf_vid, ofile_pf_vid, ofile_hpf_vid;
  230. int channel_vid, gain_vid, ccor_vid, dbcon_vid;
  231. int stream_vid, stream_error_vid, stream_error_s_vid, bit_error_vid;
  232. int lsp_vid[MAXNO], qlsp_vid[MAXNO], lsp_analy_vid[MAXNO];
  233. int lsp_synth_vid[MAXNO], cb_gain_vid, cb_qgain_vid, cb_qgain_synth_vid;
  234. int cb_match_vid, cb_index_vid, cb_index_synth_vid, cb_exc_vid;
  235. int cb_ir_vid, pitch_gain_vid, pitch_qgain_vid, pitch_qgain_synth_vid; 
  236. int pitch_match_vid, pitch_tau_vid, pitch_tau_synth_vid, pitch_ir_vid;
  237. int fndex_e0_vid, fndpp_e0_vid, fndpp_v0_vid, rc_vid[MAXNO];
  238. #endif
  239. main(argc, argv)
  240. int argc;
  241. char *argv[];
  242. {
  243.   int cbi[MAXLL / MAXL], framesnr = 0;
  244.   int framedm = 0, framedm2 = 0, i, j, k, l = 60, lun[10];
  245.   int ll = 240, lp = 60, nn, np = 1, nrec1 = 1, nrec2 = 1, nrec3 = 1;
  246.   int findex[MAXNO];
  247.   int error = 0, total = 0, flag, snrflag, lspflag;
  248.   int pdtabi[MAXPD], sync = 1;
  249.   short iarf[MAXLL], npf[MAXLL], pf[MAXLL];
  250.   float cbg[MAXLL / MAXL], pgs[MAXLL / MAXL];
  251.   float sold[MAXLL], snew[MAXLL], ssub[MAXLL], v[MAXLL];
  252.   float vdecoded[MAXLL], rcn[MAXNO], hamw[MAXLL], hamws[MAXL], dpa[MAXPA];
  253.   float dps[MAXPA], newfreq[MAXNO], unqfreq[MAXNO], lsp[MAXLL / MAXL][MAXNO];
  254.   float dppa[MAXPA], dpps[MAXPA]; 
  255.   float scale = 1.0, decodedgain, dm[9], dm2[9], taus[4], descale = 1.0;
  256.   /* *load pitch delay coding tables for bit assignment */
  257.   /* *pdencode.h for encoding, pddecode.h for decoding  */
  258.   static int pdencode[MAXPD] = 
  259.   {
  260. #include "pdencode.h"
  261.   };
  262.   static float pddecode[MAXPD] = 
  263.   {
  264. #include "pddecode.h"
  265.   };
  266.   /* *filter coefficients for 2nd order 100 Hz HPF with 60 Hz notch: */
  267.   /* static float ahpf[3] = {1.0, -1.99778, 1.0};  */
  268.   /* static float bhpf[3] = {1.0, -1.88 0.89};  */
  269.   /* *filter coefficients for 2nd order Butterworth 100 Hz HPF: */
  270.   static float ahpf[3] = {0.946, -1.892, 0.946};
  271.   static float bhpf[3] = {1.0, -1.889033, 0.8948743};
  272.   /* *filter coefficients for 2nd order Butterworth 275 Hz HPF: */
  273.   /* static float ahpfo[3] = {0.858, -1.716, 0.858}; */
  274.   /* static float bhpfo[3] = {1.0, -1.696452, 0.7368054}; */
  275.   static float ahpfo[3] = {0.946, -1.892, 0.946};
  276.   static float bhpfo[3] = {1.0, -1.889033, 0.8948743};
  277. /*
  278. *bit stream 
  279. */
  280.   int cbbits = 9, pointer, bitpointer, bitsum1, bitsum2;
  281.   int mask[STREAMBITS], ssum, pstream[STREAMBITS]; 
  282.   static int sbits[MAXNO] = {3, 4, 4, 4, 4, 3, 3, 3, 3, 3};
  283.   short stream[STREAMBITS], savestream[STREAMBITS];
  284.   char line[38];
  285. /*
  286. *filter memories (should be maxno+1)
  287. */
  288.   static float dhpf1[3], dhpf2[3], dsa[MAXNO+1], dss[MAXNO+1];
  289.   static float dhpf1o[3], dhpf2o[3];
  290.   static float dp1[MAXNO+1], dp2[MAXNO+1], dp3[2];
  291.   static float ip, op, sumsnr, sumdm[10], sumdm2[10];
  292. /*
  293. *error control coding parameters:
  294. */
  295.   float ber = 0.0, realerror, syndavg = 0.0;
  296.   int codeword[CODELENGTH1], hmatrix[CODELENGTH1];
  297.   int syndrometable[CODELENGTH1], paritybit, twoerror, protect;
  298.   int syndrome, eccbits = 5;
  299.   /* *load bit protection vector  */
  300.   static int bitprotect[CODELENGTH2] = 
  301.   {
  302. #include "bitprot.h"
  303.   };
  304.   /* *load bit permutation vector  */
  305.   static int bitpermute[STREAMBITS] = 
  306.   {
  307. #include "bitperm.h"
  308.   };
  309.   char tempstr[82];
  310. #ifdef ANALY
  311.   static char ifile[82] = "dam2.spd";
  312. #else
  313.   static char ifile[82] = "ofile.chan";
  314. #endif
  315.   static char ofile[82] = "ofile";
  316.   static char stype[12] = "kang";
  317.   FILE *fopen(), *fp25;
  318.   
  319. #ifdef SUNGRAPH
  320.   /* ********************** sungraph*******************************/
  321.   
  322.   /* define sungraph files   */
  323.   int input_fid, ifile_ofile_fid, channel_fid, lsp1_fid, lsp2_fid;
  324.   int cb_fid, pitch_fid, error_fid, stream_error_fid, rc_fid;
  325.   int constrain_fid;
  326.   char str[19];
  327.   short s_zero = 0;
  328.   float f_zero = 0.0;
  329.   /*  *nonhigh-passed old input speech for alignment     */
  330.   float ssubnhp[MAXLL], soldnhp[MAXLL];
  331.   /* *sungraph variable id's  */
  332.   int status, num_read;
  333.   
  334.   short iint;
  335.   
  336. #else
  337.   int nrec9 = 1;
  338. #endif
  339.   /* *start CELP   */
  340.   /* *set the IEEE underflow mode just like the FORTRAN  */
  341.   /* *if you uncomment the following, be sure to uncomment */
  342.   /* *the #include <floatingpoint.h> above */
  343.   /* ieee_handler("set","underflow", SIGFPE_DEFAULT); /* */
  344. #ifndef STREAMLINE
  345.   /* *** parse the command line
  346.   
  347.   celp [-i ifile] [-o ofile] [-p pfile] [-q qfile] [-l lfile]
  348.   celp [-c chan]  [-o ofile]
  349.      note:  ncsize, no, and gamma2 are external variables
  350.      note:  The calls to cli & cliend may be commented out and celp will
  351.      operate properly with default values (without bells & whistles)
  352.      ... If synthesizer only, the celp command syntax for synthesis only 
  353.      is:
  354.      celp -c input.chan  -o ofile
  355.      where: input.chan is a ascii hex bit stream channel file
  356.     ofile is a ofile.spd speech file (postfiltered)
  357. *set analysis or synthesis only with the ANALY macro,
  358. *read command line,
  359. *and enable/disable sungraph files
  360.   */
  361.   /* *intialize mask */
  362.   for (i = 0; i < STREAMBITS; i++)
  363.   {
  364.     mask[i] = 0;
  365.   }
  366.   cli(ifile, ofile, &l, &ll, &lp, &np, &scale, &descale, &ber, mask, stype,
  367.       sbits, &eccbits, &ssum, argc, argv);
  368. #endif
  369.   /* ********************* initialize********************  */
  370.   /* *number of codewords/LPC frame  */
  371.   nn = ll / l;
  372.   /* *dimension of d1a and d1b???  */
  373.   idb = MMAX + MAXNP - 1 + l;
  374.   plevel1 = 1 << pbits[0];
  375.   /* *levels of delta tau  */
  376.   plevel2 = 1 << pbits[1];
  377.   /* *number of bits per subframe  */
  378.   bitsum1 = cbbits + cbgbits + pbits[0] + pbits[2];
  379.   bitsum2 = cbbits + cbgbits + pbits[1] + pbits[2];
  380.   /* *enable/disable error control coding  */
  381.   protect = TRUE;
  382.   /* *for double error detecting FEC codes (NOT USED) */
  383.   twoerror = FALSE;
  384.   snrflag = FALSE;
  385.   lspflag = TRUE;
  386.   /* *intialize arrays */
  387.   for (i = 0; i < MAXLP; i++) h[i] = e0[i] = 0.0;
  388.   for (i = 0; i < MAXLL; i++) sold[i] = 0.0;
  389.   for (i = 0; i < STREAMBITS; i++) stream[i] = savestream[i] = 0;
  390.   /* *start nseg at 0 to do pitch on odd segments  */
  391.   /*   (nseg is incremented before csub)  */
  392.   nseg = 0;
  393.   /* *generate matrix for error control coding  */
  394.   matrixgen(CODELENGTH1, CODELENGTH2, hmatrix, syndrometable);
  395.   /* *generate Hamming windows  */
  396.   ham(hamw, ll);
  397.   /*  *UNNECESSARY, used for distortion diagnostics */
  398.   ham(hamws, l);
  399.   /* *** open and define files  */
  400. #ifdef SUNGRAPH
  401.   /* *sungraph (tm) files  */
  402. #include "sungraph_open.h"
  403. #else
  404.   /* *input file  */
  405.   if (iodisk(3, &lun[9], ifile, &nrec9, iarf, ll) != 0)
  406.   {
  407.     fprintf(stderr, "*** Error opening ifile.spdn");
  408.     exit(1);
  409.   }
  410. #endif
  411.   /* *postfiltered & nonpostfiltered output  */
  412.   if (iodisk(4, &lun[1], strcat(strcpy(tempstr, ofile), ".spd"),
  413.      &nrec1, pf, l) != 0)
  414.   {
  415.     fprintf(stderr, "celp: *** Error opening ofile.spdn");
  416.     exit(1);
  417.   }
  418. #ifndef STREAMLINE
  419.   if (iodisk(4, &lun[2], strcat(strcpy(tempstr, ofile), "npf.spd"),
  420.      &nrec2, npf, l) != 0)
  421.   {
  422.     fprintf(stderr, "celp: *** Error opening ofilenpf.spdn");
  423.     exit(1);
  424.   }
  425.   if (iodisk(4, &lun[3], strcat(strcpy(tempstr, ofile), "hpf.spd"),
  426.      &nrec3, pf, l) != 0)
  427.   {
  428.     fprintf(stderr, "celp: *** Error opening ofilehpf.spdn");
  429.     exit(1);
  430.   }
  431.   /* *bit stream channel file */
  432. #ifdef ANALY
  433.   fp25 = fopen(strcat(strcpy(tempstr, ofile), ".chan"), "w");
  434.   if (fp25 == NULL)
  435.   {
  436.     perror("celp: Error opening the channel file");
  437.     exit(0);
  438.   }
  439. #else
  440.   fp25 = fopen(ifile, "r");
  441.   if (fp25 == NULL)
  442.   {
  443.     perror("celp: Error opening the channel file");
  444.     exit(0);
  445.   }
  446. #endif
  447. #endif
  448.   /* *generate pdtabi for delta delay coding */
  449.   for (i = 0; i < MAXPD; i++)
  450.   {
  451.     pdtabi[pdencode[i]] = i;
  452.   }
  453.   /* ......................... m a i n  l o o p ........................ */
  454.   /* *** ANALYSIS ...................................................... */
  455.   /* *if synthesizer only, skip analyzer >>>>>>>>>>>>>>>>>>>  */
  456. #ifdef ANALY
  457.   /* *** LPC spectral analysis (open loop)  */
  458.   /* NOTE: Autocorrelation was found superior to covariance analysis   */
  459.   /* *** read speech segment s of size ll, until end of file  */
  460. #ifdef SUNGRAPH
  461.   while ((status = read_variable(input_fid, iarf, ll, &num_read)) != -5)
  462.   {
  463.     if (status < 0)
  464.       read_error(status, "read_input_fid");
  465. #else
  466.   while (iodisk(1, &lun[9], ifile, &nrec9, iarf, ll) == ll)
  467.   {
  468. #endif
  469.     
  470.     frame++;
  471.     pointer = 0;
  472.     /* *display a propeller (rotating bar) once per frame  */
  473.     mark(0);
  474.     /* fprint(stderr,"frame =  ",frame);  */
  475.     /*        *scale and convert to real speech  */
  476.     /* *The ssub buffer used for subframe CELP analysis is 1/2 a  */
  477.     /* *frame behind the snew buffer and 1/2 a frame ahead of the   */
  478.     /* *sold buffer.  */
  479.     for (i = 0; i < ll; i++)
  480.       snew[i] = mmax(-32768., mmin(scale * iarf[i], 32767.));
  481. #ifdef SUNGRAPH
  482.     /* *create ssubnhp vector for sungraph  */
  483.     for (i = 0; i < ll/2; i++)
  484.     {
  485.       ssubnhp[i] = soldnhp[i + ll/2];
  486.       ssubnhp[i + ll/2] = snew[i];
  487.     }
  488.     /* *save input speech in file 'ifile_ofile'    */
  489.     save_sg(ifile_vid, ssubnhp, ll, "save speech_in_vid");
  490.     /* *save snew in soldnhp for sungraph in next frame  */
  491.     for (i = 0; i < ll; i++)
  492.       soldnhp[i] = snew[i];
  493. #endif
  494.       
  495.     /* *high pass filter snew  */
  496.     zerofilt(ahpf, 2, dhpf1, snew, ll);
  497.     polefilt(bhpf, 2, dhpf2, snew, ll);
  498.     /* *make ssub vector from snew and sold    */
  499.     for (i = 0; i < ll/2; i++)
  500.     {
  501.       ssub[i] = sold[i + ll/2];
  502.       ssub[i + ll/2] = snew[i];
  503.     }
  504. #ifdef SUNGRAPH
  505.     /* *save high-passed future input in file 'ifile_ofile'  */
  506.     save_sg(ifile_hp_vid, ssub, ll, "save ifile_hp_vid");
  507. #endif
  508.     autohf(snew, hamw, ll, no, OMEGA, fcn, rcn);
  509. #ifdef SUNGRAPH
  510.     /* *save rc's in file 'rc'  */
  511.     for (i = 0; i < no; i++)
  512.       save_sg(rc_vid[i], &rcn[i], 1, "save rc_vid");
  513. #endif
  514.     /* *pc -> lsp (new)  */
  515.     pctolsp2(fcn, no, newfreq, &lspflag);
  516.     if (lspflag)
  517.     {
  518.       printf("celp: Bad "new" lsp at frame: %dn", frame);
  519.       printf("lsp: ");
  520.       for (i = 0; i < no; i++)
  521. printf("%9.5f", newfreq[i]);
  522.       printf("npc: ");
  523.       for (i = 0; i < no + 1; i++)
  524. printf("%9.5f", fcn[i]);
  525.       printf("nrc: ");
  526.       for (i = 0; i < no; i++)
  527. printf("%9.5f", rcn[i]);
  528.       printf("n");
  529.     }
  530.     /* *save unquantized lsp  */
  531.     for (i = 0; i < no; i++)
  532.       unqfreq[i] = newfreq[i];
  533.     /* *quantize lsp's    */
  534.     lsp34(newfreq, no, sbits, findex);
  535. #ifdef SUNGRAPH
  536.     /* *save future lsp variables in file 'lsp1'  */
  537.     for (i = 0; i < no; i++)
  538.     {
  539.       save_sg(lsp_vid[i], &unqfreq[i], 1, "save lsp_vid");
  540.     }
  541.     /* *save future qlsp variables in file 'lsp1'  */
  542.     for (i = 0; i < no; i++)
  543.     {
  544.       save_sg(qlsp_vid[i], &newfreq[i], 1, "save qlsp_vid");
  545.     }
  546. #endif
  547. #ifndef STREAMLINE
  548.     /* *measure spectral distortion  */
  549.     /* UNNECESSARY, used for diagnostices  */
  550.     specdist(unqfreq, newfreq, dm2, sumdm2, &framedm2);
  551. #endif
  552.     /* *pack lsp indices in bit stream array  */
  553.     for (i = 0; i < no; i++)
  554.       pack(findex[i], sbits[i], stream, &pointer);
  555.     /* *linearly interpolate LSP's for each subframe  */
  556.     intanaly(newfreq, nn, lsp);
  557.     /* *** for each subframe, search stochastic & adaptive code books    */
  558.     k = 0;
  559.     for (i = 0; i < nn; i++)
  560.     {
  561. #ifdef SUNGRAPH
  562.       /* *save interpolated lsp's in file 'lsp2'  */
  563.       for (j = 0; j < no; j++)
  564. save_sg(lsp_analy_vid[j], &lsp[i][j], 1, "save lsp_analy_vid");
  565. #endif
  566.       lsptopc(&lsp[i][0], fci);
  567.       for (j = 0; j < no + 1; j++)
  568. fc[j] = fci[j];
  569.       nseg++;
  570.       /* *** code book & pitch searches  */
  571.       csub(&ssub[k], &v[k], l, lp);
  572. #ifdef SUNGRAPH
  573.       /* *save code book index in file 'cbindex' */
  574.       save_sg(cb_index_vid, &cbindex, 1, "save cb_index_vid");
  575.       /* *save tau in file 'pitch'  */
  576.       save_sg(pitch_tau_vid, &bb[0], 1, "save pitch_tau_vid");
  577. #endif
  578.       /* *pitch quantization tau  */
  579.       /* *pack parameter indices in bit stream array  */
  580.       if (((i+1) % 2) != 0)
  581. packtau(tauptr-minptr, pbits[0], pdencode, stream, &pointer);
  582.       else
  583. pack(tauptr-minptr, pbits[1], stream, &pointer);
  584.       pack(pindex, pbits[2], stream, &pointer);
  585.       cbindex--;
  586.       pack(cbindex, cbbits, stream, &pointer);
  587.       pack(gindex, cbgbits, stream, &pointer);
  588.       /* *decode parameters for analysis by synthesis  */
  589.       cbindex++;
  590.       /* *pitch synthesis (UNNECESSARY, used for diagnostics) */
  591.       pitchvq(&v[k], l, dpa, idb, bb, "long");
  592.       /* *pitch pre filter (UNNECESSARY, used for diagnostics)  */
  593.       if (prewt != 0.0) 
  594.         prefilt(&v[k], l, dppa);
  595.       /* *lpc synthesis (UNNECESSARY, used for diagnostics)  */
  596.       polefilt(fci, no, dsa, &v[k], l);
  597.       k += l;
  598.     }
  599.     /* *** bit error protection  */
  600.     /* *extract bits to protect from stream array    */
  601.     if (protect)
  602.     {
  603.       for (i = 0; i < CODELENGTH2; i++)
  604. codeword[i] = stream[bitprotect[i] - 1];
  605.       /* *hamming encode  */
  606.       encodeham(CODELENGTH1, CODELENGTH2, hmatrix, &paritybit, codeword);
  607.       /* *pack future bit  */
  608.       pack(0, 1, stream, &pointer);
  609.       /* *pack parity bits  */
  610.       for (i = 0; i < PARITYLENGTH; i++)
  611. pack(codeword[CODELENGTH2 + i], 1, stream, &pointer);
  612.       /* *toggle and pack the sync bit */
  613.       sync = sync ^ 1;
  614.       pack(sync, 1, stream, &pointer);
  615.     }
  616. #ifdef SUNGRAPH
  617.     /* *save stream array in channel file  */
  618.     save_sg(channel_vid, stream, STREAMBITS, "save channel_vid");
  619.     /* *save stream array in stream_error file  */
  620.     save_sg(stream_vid, stream, STREAMBITS, "save stream_vid");
  621. #endif
  622. #ifndef STREAMLINE
  623.     /* *save stream  */
  624.     for (i = 0; i < STREAMBITS; i++)
  625.       savestream[i] = stream[i];
  626.     /* *permute bitstream     */
  627.     for (i = 0; i < STREAMBITS; i++)
  628.       pstream[i] = stream[bitpermute[i] - 1];
  629.     /* *save stream in Dave's format  */
  630.     puthex(STREAMBITS, pstream, line);
  631.     fprintf(fp25, "%sn", line);
  632. #endif
  633.     /* *synthesizer only <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<  */
  634. #else
  635.   /* *** CHANNEL ..................................................  */
  636.   /* *read in channel file (if synthesis only)  */
  637.   while (fscanf(fp25, "%s", line) != EOF)
  638.   {
  639.     pointer = -1; 
  640.     gethex(STREAMBITS, pstream, line);
  641.     frame++;
  642.     /* *display a propeller (rotating bar) once per frame  */
  643.     mark(0);
  644. #endif
  645. #ifndef STREAMLINE
  646.     /* *unpermute bitstream   */
  647.     for (i = 0; i < STREAMBITS; i++)
  648.       stream[bitpermute[i] - 1] = pstream[i];
  649.     /* *** corrupt the channel with bit errors   */
  650.     biterror(ber, mask, stream, STREAMBITS, &error, &total);
  651. #endif
  652. #ifdef SUNGRAPH
  653.     /* *save stream array in stream_error file  */
  654.     save_sg(stream_error_vid, stream, STREAMBITS, "save stream_error_vid");
  655. #endif
  656.     /* *** SYNTHESIS ..........................................  */
  657.     /* *unpack parity bits  */
  658.     if (protect)
  659.     {
  660.       pointer = pointer - PARITYLENGTH - 2;
  661. #ifndef ANALY
  662.       pointer = 138;
  663. #endif
  664.       for (i = 0; i < PARITYLENGTH; i++)
  665. unpack(stream, 1, &codeword[CODELENGTH2 + i], &pointer);
  666.       /* *extract code word from stream array  */
  667.       for (i = 0; i < CODELENGTH2; i++)
  668. codeword[i] = stream[bitprotect[i] - 1];
  669.       /* repack Bisnu bit (remains constant for now)  */
  670.       codeword[10] = 0;
  671.       /* *Hamming decode  */
  672.       decodeham(CODELENGTH1, hmatrix, syndrometable, paritybit, codeword,
  673.  &twoerror, &syndrome);
  674.       /* *disable parity check (if parity not used)  */
  675.       twoerror = FALSE;
  676.       /* *bit error rate estimator (running avg of bad syndromes)  */
  677.       if (syndrome != 0)
  678.         syndrome = 1;
  679.       syndavg = (1.0 - (1.0 / SYNDRUN)) * syndavg + (1.0 / SYNDRUN) * (float) syndrome;
  680.       /* *repack protected bits  */
  681.       for (i = 0; i < CODELENGTH2; i++)
  682. stream[bitprotect[i] - 1] = codeword[i];
  683. #ifdef SUNGRAPH
  684.       /* *save stream array in stream_error file  */
  685.       save_sg(stream_error_s_vid, stream, STREAMBITS, "save stream_error_s_vid");
  686.       /* *compare saved stream with channel stream  */
  687.       for (i = 0; i < STREAMBITS; i++)
  688.       {
  689. if (savestream[i] != stream[i])
  690. {
  691.   iint = 1;
  692.   save_sg(bit_error_vid, &iint, 1, "save bit_error_vid");
  693. }
  694. else
  695. {
  696.   iint = 0;
  697.   save_sg(bit_error_vid, &iint, 1, "save bit_error_vid");
  698. }
  699.       }
  700. #endif
  701.       /* *frame repeat if two errors detected in code word  */
  702.       if (twoerror)
  703. printf("celp: two errors have occured in frame %dn", frame);
  704.     }
  705.     pointer = -1;
  706.     /* *unpack data stream  */
  707.     for (i = 0; i < no; i++)
  708.       unpack(stream, sbits[i], &findex[i], &pointer);
  709.     /* *decode lsp's  */
  710.     lspdecode34(findex, no, newfreq);
  711.     /* *interpolate spectrum lsp's for nn subframes  */
  712.     intsynth(newfreq, nn, lsp, twoerror, syndavg);
  713.     /* *decode all code book and pitch parameters  */
  714.     bitpointer = pointer;
  715.     dcodtau(pbits[0], pbits[1], bitsum1, bitsum2, &bitpointer, nn, stream, pddecode, pdtabi, taus);
  716.     dcodpg(pbits[2], bitsum1, bitsum2, &bitpointer, nn, stream, pgs);
  717.     dcodcbi(cbbits, bitsum1, bitsum2, &bitpointer, nn, stream, cbi);
  718.     dcodcbg(cbgbits, bitsum1, bitsum2, &bitpointer, nn, stream, cbg);
  719.     /* *** synthesize each subframe  */
  720. #ifdef ANALY
  721.     nseg -= nn;
  722. #endif
  723.     k = 0;
  724.     for (i = 0; i < nn; i++)
  725.     {
  726.       nseg++;
  727. #ifdef SUNGRAPH
  728.       /* *save interpolated lsp's in file 'lsp2'  */
  729. for (j = 0; j < no; j++)
  730.   save_sg(lsp_synth_vid[j], &lsp[i][j], 1, "save lsp_synth_vid");
  731. #endif
  732.       /* *decode values for subframe  */
  733.       cbindex = cbi[i];
  734.       decodedgain = cbg[i];
  735.       if (protect)
  736. smoothcbgain(&decodedgain, twoerror, syndavg, cbg, i + 1);
  737.       /* *code book synthesis  */
  738.       vdecode(decodedgain, l, &vdecoded[k]);
  739.       if (protect)
  740. smoothtau(&taus[i], twoerror, syndavg, taus[2], i + 1);
  741.       bb[0] = taus[i];
  742.       bb[2] = pgs[i];
  743.       if (protect)
  744. smoothpgain(&bb[2], twoerror, syndavg, pgs, i + 1);
  745. #ifdef SUNGRAPH
  746.       /* *save synthesis parameters in sungraph files  */
  747.       save_sg(cb_index_synth_vid, &cbindex, 1, "save cb_index_synth_vid");
  748.       save_sg(pitch_tau_synth_vid, &bb[0], 1, "save pitch_tau_synth_vid");
  749.       save_sg(cb_qgain_synth_vid, &decodedgain, 1, "save cb_qgain_synth_vid");
  750.       save_sg(pitch_qgain_synth_vid, &bb[2], 1, "save pitch_qgain_synth_vid");
  751. #endif
  752.       /* *pitch synthesis  */
  753.       pitchvq(&vdecoded[k], l, dps, idb, bb, "long");
  754.       /* *pitch pre filter (synthesis)  */
  755.       if (prewt != 0.0) 
  756.         prefilt(&vdecoded[k], l, dpps);
  757.       /* convert lsp's to pc's   */
  758.       lsptopc(&lsp[i][0], fci);
  759.       /* lpc synthesis    */ 
  760.       polefilt(fci, no, dss, &vdecoded[k], l);
  761. #ifndef STREAMLINE
  762.       /* *** check analysis versus synthesis speech  */
  763. #ifdef ANALY
  764.       flag = FALSE;
  765.       for (j = 0; j < l; j++)
  766.       {
  767. if (fabs(v[k + j] - vdecoded[k + j]) > 1.e-6)
  768.   flag = TRUE;
  769.       }
  770.       if (flag)
  771. printf("celp: Speech mismatch at frame %dn", frame);
  772. #endif
  773.       /* *** write nonpostfiltered output speech disk files  */
  774.       for (j = 0; j < l; j++)
  775.       {
  776.         vdecoded[k + j] = descale * vdecoded[k + j];
  777. npf[k + j] = nint(mmax(-32768., mmin(32767., vdecoded[k + j])));
  778.       }
  779.       /* *write npf output speech file "ofilenpf"  */
  780.       if (iodisk(2, &lun[2], strcat(strcpy(tempstr, ofile), "npf.spd"),
  781.  &nrec2, &npf[k], l) != l)
  782.       {
  783.         fprintf(stderr, "celp: *** Error writing ofilenpf.spdn");
  784.         exit(1);
  785.       }
  786. #ifdef SUNGRAPH
  787.       /* *sungraph's npf output speech file 'ifile_ofile'  */
  788.       save_sg(ofile_npf_vid, &npf[k], l, "save ofile_npf_vid");
  789. #endif
  790.       /* *** calculate the average segmental SNR  */
  791.       /* *UNNECESSARY, used for diagnostics  */
  792. #ifdef ANALY
  793.       segsnr(&ssub[k], &npf[k], l, &sumsnr, &framesnr, &snrflag);
  794.       /* *** calculate distortions/distances (log spectral error, etc.)  */
  795.       /* *UNNECESSARY, used for diagnostics  */
  796.       if (snrflag)
  797. distortion(&ssub[k], &npf[k], hamws, l, no, dm, sumdm, &framedm);
  798. #endif
  799. #endif
  800.       /* *** post filtering  */
  801.       postfilt(&vdecoded[k], l, ALPHA, BETA, &ip, &op, dp1, dp2, dp3);
  802.       /* *** test for output speech clipping  */
  803.       while (clip(&vdecoded[k], l))
  804.       {
  805.       /* frame repeat & recall synthesizer?   */
  806.       /* or scale vdecoded?  */
  807. printf("celp: Clipping detected at frame %dn", frame);
  808.         for (j = 0; j < l; j++)
  809.           vdecoded[k + j] = 0.05 * vdecoded[k + j]; 
  810.       }
  811.       /* *** write postfiltered output speech disk files  */
  812.       for (j = 0; j < l; j++)
  813. pf[k + j] = nint(mmax(-32768., mmin(32767., vdecoded[k + j])));
  814.       /* *write output speech file "ofile"  */
  815.       if (iodisk(2, &lun[1], strcat(strcpy(tempstr, ofile), ".spd")
  816.  ,&nrec1, &pf[k], l) != l)
  817.       {
  818.         fprintf(stderr, "celp: *** Error writing ofile.spdn");
  819.         exit(1);
  820.       }
  821. #ifdef SUNGRAPH
  822.       /* *sungraph's output speech file 'ifile_ofile'  */
  823.       save_sg(ofile_pf_vid, &pf[k], l, "save ofile_pf_vid");
  824. #endif
  825. #ifndef STREAMLINE
  826.       /* *high pass filter output speech  */
  827.       zerofilt(ahpfo, 2, dhpf1o, &vdecoded[k], l);
  828.       polefilt(bhpfo, 2, dhpf2o, &vdecoded[k], l);
  829.       for (j = 0; j < l; j++)
  830. pf[k + j] = nint(mmax(-32768., mmin(32767., vdecoded[k + j])));
  831.       /* *write output speech file "ofilehpf"  */
  832.       if (iodisk(2, &lun[3], strcat(strcpy(tempstr, ofile), "hpf.spd")
  833.  ,&nrec3, &pf[k], l) != l)
  834.       {
  835.         fprintf(stderr, "celp: *** Error writing ofilehpf.spdn");
  836.         exit(1);
  837.       }
  838. #ifdef SUNGRAPH
  839.       /* *sungraph's output speech file 'ifile_ofile'  */
  840.       save_sg(ofile_hpf_vid, &pf[k], l, "save ofile_hpf_vid");
  841. #endif
  842. #endif
  843.       k += l;
  844.     }
  845.     /* .......................end block................................. */
  846. #ifdef SUNGRAPH
  847. #include "sungraph_endblock.h"
  848. #endif
  849.     /* *** shift new speech buffer into old speech buffer    */
  850.     /*           sold    snew  */
  851.     /*         |-------------------|-------------------| snew  */
  852.     /*           |-------------------|  */
  853.     /*    ssub  */
  854.     for (i = 0; i < ll; i++)
  855.       sold[i] = snew[i];
  856.     /* *** frame finished, end loop  */
  857.   } /* end main while loop; either the analyzer loop, analyzer and       */
  858.     /* sungraph loop or the synthesizer only loop    */
  859.   /* ...........e n d  m a i n  l o o p ...............................  */
  860.   /* *** WRAP-UP ......................................................  */
  861.   /* *** finished reading & processing "ifile"  */
  862.   /* *** closing cue and close files  */
  863.   for (i = 0; i < STREAMBITS; i++)
  864.     stream[i] = 23456;
  865.   iodisk(-1, &lun[1], strcat(strcpy(tempstr, ofile), ".spd"),
  866. &nrec1, pf, l);
  867. #ifndef STREAMLINE
  868.   iodisk(-1, &lun[2], strcat(strcpy(tempstr, ofile), "npf.spd"),
  869. &nrec2, npf, l);
  870.   iodisk(-1, &lun[3], strcat(strcpy(tempstr, ofile), "hpf.spd"),
  871. &nrec3, pf, l);
  872.   fclose(fp25);
  873. #endif
  874. #ifdef SUNGRAPH
  875. #include "sungraph_close.h"
  876. #else
  877.   iodisk(-1, &lun[9], ifile, &nrec9, iarf, ll);
  878. #endif
  879. #ifndef STREAMLINE
  880. #ifdef ANALY
  881.   if (total != 0)
  882.     realerror = 100. * ((float) error / (float) total);
  883.   else
  884.     realerror = 0.0;
  885.   cliend(sumsnr, framesnr, realerror, sumdm, framedm, sumdm2, framedm2);
  886. #endif
  887. #endif
  888.   exit(0);
  889. }