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

语音压缩

开发平台:

C/C++

  1. /**************************************************************************
  2. *
  3. * ROUTINE
  4. *               cli
  5. *
  6. * FUNCTION
  7. *               UNIX Command line interface.
  8. * Read and check the UNIX command line.
  9. * Report and log job characteristics and performance.
  10. * SYNOPSIS
  11. * subroutine cli (ifile, ofile, l, ll, lp, np, scale, descale, ber, 
  12. *    +                  mask, stype, eccbits, sbits)
  13. *
  14. *   formal 
  15. *
  16. * data I/O
  17. * name type type function
  18. *       -------------------------------------------------------------------
  19. * ifile char i/o input file name
  20. * ofile char i/o output file name
  21. * l int i/o Code word length
  22. * ll int i/o LPC analysis frame size
  23. * lp int i/o Pitch analysis frame size
  24. * np int i/o Pitch order
  25. * scale float i/o Input speech scaling factor
  26. * descale i i/o Output speech scaling factor
  27. * ber float i/o % bit error rate
  28. * mask int o Error mask
  29. * stype char i/o Spectrum quantizer type
  30. * sbits int i/o Spectrum bit allocation
  31. * eccbits int i/o Error control bits/frame
  32. * ssum int i/o Sum of spectrum bit allocation
  33. *
  34. *   global common 
  35. *                       data    I/O
  36. *       name            type    type    function
  37. *       -------------------------------------------------------------------
  38. * cbgbits int i/o
  39. * frame int i
  40. * ncsize int i/o
  41. * no int i/o
  42. * pbits[] int i/o
  43. * gamma2 float i/o
  44. * ptype[] int i/o
  45. * cbgtype[] int i/o
  46. *
  47. ***************************************************************************
  48. * CELP COMMAND 
  49. *NAME:
  50. *     celp - execute the CELP coder
  51. *
  52. *     The celp command generates a codebook-excited-linear-prediction
  53. *     processed output file from an input file.
  54. *
  55. *SYNOPSIS:
  56. *     celp [-i ifile] [-o ofile] [-p pfile] [-q qfile] [-m mfile] [-l lfile]
  57. *     celp [-c chan]  [-o ofile]
  58. *
  59. *ARGUMENTS:
  60. *     -i      Input file i*2 direct access format (unformatted, consecutive
  61. *             16-bit signed samples).
  62. *             For defaults, see celp.c declaration statements.
  63. *     -o      Speech output file (.spd) i*2 direct access format 
  64. *       (unformatted, consecutive 16-bit signed samples) and
  65. *       bit stream channel file (.chan) hexadecimal format.
  66. *             For defaults, see celp.c declaration statements.
  67. *
  68. *     -p      Parameter file specifying celp characteristics.
  69. *             For defaults, see celp.c declaration statements.
  70. *             Parameters are stored in a ascii text file in the order below
  71. *             with one number per line:
  72. *
  73. *             512 [ncsize = Code book size]
  74. *             60 [l      = Code word length]
  75. *             240 [ll     = LPC analysis frame size]
  76. *             10 [no     = LPC filter order]
  77. *             60 [lp     = Pitch analysis frame size]
  78. *             1         [np     = Pitch order]
  79. *             0.8 [gamma  = Noise weighting factor]
  80. *             1.0 [scale  = Input speech scaling factor]
  81. *       1.0       [descale = Output speech scaling factor]
  82. *       0.0 [ber = % bit error rate]
  83. *       1 [mxsw    = modified excitation logical switch]
  84. *       0.0       [prewt   = prefilter logical switch]
  85. *       hier      [pstype  = type of fractional pitch search]
  86. *
  87. *     -q      Quantization characteristics file.
  88. *             For defaults, see celp.c declaration statements.
  89. *             The file has 3 sections: cbgain, pitch, and spectrum.
  90. *             Each section type is followed by a quantization type,
  91. *             which can be one of the following:  "max", "uniform", "vq",
  92. *             "log", "opt", or "none".  If the quantization type is not 
  93. *       "none",  { the next line is the bit allocation; i.e.:
  94. *
  95. *             cbgain
  96. *             none [unquantized cbgain]
  97. *             pitch
  98. *             max [Max quantization]
  99. *             8 6 5 [8 bit delay, 6 bit delta delay, 5 bit gain]
  100. *             spectrum
  101. *             kang [Kang's quantization]
  102. *             3 4 4 4 4 3 3 3 3 3  [lsp1=3,...,lsp10=3]
  103. *
  104. *     -m      Mask file specifying protected and unprotectected bits
  105. *       in the bit stream when introducing bit errors to the 
  106. *       unpermuted bit stream.  (Note, this protection is separate
  107. *       from the Hamming FEC).  Each line of the mfile corresponds
  108. *       to a bit where each line is a 1 (protected) or 0 (not
  109. *       protected).
  110. *
  111. *     -l      Log file output containing run time information.
  112. *             Defaults to appending to a file called "celp.log".
  113. *             If the file name "none" is specified, no log file
  114. *             is generated.
  115. *
  116. *
  117. *     -c      Input channel file (.chan) hexadecimal format.  Channel
  118. *       files generated from previous analysis runs are used as
  119. *       imputs to a "synthesis only" run.  During this mode, the
  120. *       -i switch is invalid.
  121. *EXAMPLES:
  122. *
  123. *     celp
  124. *             This causes celp to process ifile.spd into ofile.spd (and a
  125. *       nonpostfiltered output in ofilenpf.spd) using the
  126. *             defaults specified by the C declaration statements in
  127. *             celp.c, writes the bit stream file ofile.chan and generates 
  128. *       a log appended to the file "celp.log".  (If SUNGRAPH is 
  129. *       enabled, a set of files, with .sg_data extension, as defined
  130. *       in sungraph_open.com is generated.)
  131. *
  132. *     celp -i speech/dam27 -o dam27.48 -p celp48.p -q celp48.q -l log
  133. *
  134. *             celp processes speech/dam27.spd into the normal, highpassed
  135. *       and nonpostfiltered output, dam27.48.spd, dam27_48hpf.spd
  136. *       and dam27_48npf.spd, respectively, writes the bit stream
  137. *       file dam27_48.chan and appends log information to a file
  138. *       called log.  The celp parameters specified by celp48.p and  
  139. *       quantization characteristics of celp48.q are used.  (If  
  140. *       SUNGRAPH is enabled, a set of files, with .sg_data extension, 
  141. *             as defined in sungraph_open.com is generated.)
  142. *       
  143. *
  144. *     celp -c speech/512_dam27.chan -o 512_dam27b
  145. *
  146. *       celp synthesizes speech/512_dam27.chan channel file into 
  147. *       the normal, highpassed and nonpostfiltered output, 
  148. *       512_dam27b.spd, 512_dam27bhpf.spd and 512_dam27bnpf.spd,
  149. *       respectively.
  150. *
  151. ***************************************************************************
  152. *
  153. * CALLED BY
  154. *
  155. *       celp
  156. *
  157. * CALLS
  158. *
  159. *       
  160. *
  161. **************************************************************************/
  162. #define TRUE            1
  163. #define FALSE           0
  164. #define MAXARG 14
  165. #define MAXTYPE 3
  166. #define MAXQTYPE 5
  167. #include <stdio.h>
  168. #include <sys/time.h>
  169. #include <sys/types.h>
  170. #include <sys/stat.h>
  171. #include <math.h>
  172. #include "ccsub.h"
  173. extern int cbgbits, frame, ncsize, no, pbits[], mxsw;
  174. extern float gamma2, prewt;
  175. extern char ptype[], cbgtype[], pstype[];
  176. static char lfile[82] = "celp.log";
  177. FILE *fp;
  178. cli (ifile,ofile,l,ll,lp,np,scale,descale,ber,mask,stype,sbits,eccbits,ssum,argc,argv)
  179. int *l, *ll, *lp, *np, mask[], sbits[], *eccbits, *ssum, argc;
  180. float *scale, *ber, *descale;
  181. char ifile[], ofile[], stype[], *argv[];
  182. {
  183. /*note:  ncsize, no, and gamma are external variables */
  184.   int psum, rate, bits, rate2, i, j, flag, qflag, iflag, cflag;
  185.   long tim;
  186.   char prog[82], dir[82], host[20], temp[12];
  187.   static char qtype[][10] = {"kang", "log", "max2", "arcsin", "none"},
  188.               pfile[82] = "", qfile[82] = "", mfile[82] = "";
  189.   struct stat statbuf;
  190.   /* *** parse the command line:
  191. celp [-i ifile] [-c chan] [-o ofile] [-p pfile] 
  192.      [-q qfile] [-m mfile] [-l lfile]  */
  193.   if (argc > MAXARG + 1)
  194.   {
  195.     fprintf(stderr,"cli: Too many arguments %dn",argc);
  196.     fprintf(stderr,"%s%sn","celp [-i ifile] [-o ofile] [-p pfile] ",
  197.                             "[-q qfile] [-m mfile] [-l lfile]");
  198.     fprintf(stderr,"%sn","celp [-c chan] [-o ofile]");
  199.   }
  200.     
  201.   if ((argc%2) == 0)
  202.   {
  203.     fprintf(stderr,"cli: Odd number of arguments %dn",argc);
  204.     fprintf(stderr,"%s%sn","celp [-i ifile] [-o ofile] [-p pfile] ",
  205.                             "[-q qfile] [-m mfile] [-l lfile]");
  206.     fprintf(stderr,"%sn","celp [-c chan] [-o ofile]");
  207.     exit(1);
  208.   }
  209.   strcpy(prog, *argv);
  210.   flag = iflag = cflag = FALSE;
  211.   while (--argc > 0)
  212.   {
  213.     if (strncmp("-",*++argv,1) == 0)
  214.     {
  215.       switch (argv[0][1])
  216.       {
  217.         case 'i':
  218.         case 'I':
  219.           if (strncmp("-",*++argv,1) == 0)
  220.           {
  221.             fprintf(stderr,"cli: Missing input filen");
  222.             flag = TRUE;
  223.             --argv;
  224.           }
  225.           else
  226.           {
  227.             strcpy(ifile,*argv);
  228.             --argc;
  229.     iflag = TRUE;
  230.           }
  231.           break;
  232.         case 'o':
  233.         case 'O':
  234.           if (strncmp("-",*++argv,1) == 0)
  235.           {
  236.             fprintf(stderr,"cli: Missing output filen");
  237.             flag = TRUE;
  238.             --argv;
  239.           }
  240.           else
  241.           {
  242.             strcpy(ofile,*argv);
  243.             --argc;
  244.           }
  245.           break;
  246.         case 'p':
  247.         case 'P':
  248.           if (strncmp("-",*++argv,1) == 0)
  249.           {
  250.             fprintf(stderr,"cli: Missing parameter filen");
  251.             flag = TRUE;
  252.             --argv;
  253.           }
  254.           else
  255.           {
  256.             strcpy(pfile,*argv);
  257.             --argc;
  258.           }
  259.           break;
  260.         case 'q':
  261.         case 'Q':
  262.           if (strncmp("-",*++argv,1) == 0)
  263.           {
  264.             fprintf(stderr,"cli: Missing quantization filen");
  265.             flag = TRUE;
  266.             --argv;
  267.           }
  268.           else
  269.           {
  270.             strcpy(qfile,*argv);
  271.             --argc;
  272.           }
  273.           break;
  274.         case 'm':
  275.         case 'M':
  276.           if (strncmp("-",*++argv,1) == 0)
  277.           {
  278.             fprintf(stderr,"cli: Missing mask filen");
  279.             flag = TRUE;
  280.             --argv;
  281.           }
  282.           else
  283.           {
  284.             strcpy(mfile,*argv);
  285.             --argc;
  286.           }
  287.           break;
  288.         case 'l':
  289.         case 'L':
  290.           if (strncmp("-",*++argv,1) == 0)
  291.           {
  292.             fprintf(stderr,"cli: Missing log filen");
  293.             flag = TRUE;
  294.             --argv;
  295.           }
  296.           else
  297.           {
  298.             strcpy(lfile,*argv);
  299.             --argc;
  300.           }
  301.           break;
  302. case 'c':
  303.         case 'C':
  304.           if (strncmp("-",*++argv,1) == 0)
  305.           {
  306.             fprintf(stderr,"cli: Missing channel filen");
  307.             flag = TRUE;
  308.             --argv;
  309.           }
  310.           else
  311.           {
  312.             strcpy(ifile,*argv);
  313.             --argc;
  314.     cflag = TRUE;
  315.           }
  316.           break;
  317.         default:
  318.           printf("cli: Bad switch %sn",*argv);
  319.           flag = TRUE;
  320.       }
  321.     }
  322.     else
  323.     {
  324.       printf("cli: Bad switch %sn",*argv);
  325.       flag = TRUE;
  326.     }
  327.   }
  328.   if (iflag && cflag)
  329.   {
  330.     fprintf(stderr, "%sn", "cli: the -i switch is invalid with the -c switch");
  331.     flag = TRUE;
  332.   }
  333.   if (flag)
  334.   {
  335.     fprintf(stderr,"%s%sn","celp [-i ifile] [-o ofile] [-p pfile] ",
  336.                             "[-q qfile] [-m mfile] [-l lfile]");
  337.     fprintf(stderr,"%sn","celp [-c chan] [-o ofile]");
  338.     exit(1);
  339.   }
  340.   /* *** read input parameter file if requested
  341. (all parameters are required) */
  342.   if (*pfile)
  343.   {
  344.     fp = fopen(pfile,"r");
  345.     if (fp == NULL)
  346.     {
  347.       perror("cli: Error opening the parameter file");
  348.       exit(0);
  349.     }
  350.     fscanf(fp,"%d %d %d %d %d %d %f %f %f %f %d %f %s", &ncsize, l, ll, &no,
  351.            lp, np, &gamma2, scale, descale, ber, &mxsw, &prewt, pstype);
  352.     fclose(fp);
  353.   }
  354.   /* *** read quantization characteristics file if requested
  355. (not all parameters are required) */
  356.   if (*qfile)
  357.   {
  358.     fp = fopen(qfile,"r");
  359.     if (fp == NULL)
  360.     {
  361.       perror("cli: Error opening the quantization characteristics file");
  362.       exit(0);
  363.     }
  364.     while (fscanf(fp,"%s",temp) != EOF)
  365.     {
  366.       if (strcmp(temp,"cbgain") == 0)
  367.       {
  368.         fscanf(fp, "%s", cbgtype);
  369.         if (strcmp(cbgtype, "none"))
  370.           fscanf(fp, "%d", &cbgbits);
  371.       }
  372.       else if (strcmp(temp,"pitch") == 0)
  373.       {
  374.         fscanf(fp, "%s", ptype);
  375.         if (strcmp(ptype, "none"))
  376.           for (i = 0; i < *np + 2; i++)
  377.             fscanf(fp, "%d", &pbits[i]);
  378.       }
  379.       else if (strcmp(temp,"spectrum") == 0)
  380.       {
  381.         fscanf(fp, "%s", stype);
  382.         if (strcmp(ptype, "none") && strcmp(ptype, "opt"))
  383.           for (i = 0; i < no; i++)
  384.             fscanf(fp, "%d", &sbits[i]);
  385.       }
  386.     }
  387.     fclose(fp);
  388.   }
  389.   /* *** calculate data rate if fully quantized */
  390.   /*     (assuming spectrum update rate (ll) = spectrum analysis rate)
  391.     (assuming pitch update rate (lp) = pitch analysis rate)
  392.     (assuming 8khz sampling rate) */
  393.   qflag = FALSE;
  394.   if (strcmp(cbgtype, "none") && strcmp(ptype, "none") &&
  395.       strcmp(stype, "none"))
  396.   {
  397.     qflag = TRUE;
  398.     psum = 2*(pbits[0]+pbits[1]) + 4*(pbits[2]);
  399.     for (*ssum = 0, i = 0; i < no; i++)
  400.       *ssum += sbits[i];
  401.     bits = nint(*ll / (*l) * log10((float)ncsize) / log10(2.) +
  402.            *ll / (*l) * cbgbits + psum + *ssum + *eccbits);
  403.     rate = nint(bits * 8000.0 / (*ll));
  404.     /*    1 bit for sync: */
  405.     rate2 = rate + nint(1.0 * 8000.0 / (*ll));
  406.   }
  407.   /* *** read bit error characteristics file if requested */
  408.   if (*mfile)
  409.   {
  410.     fp = fopen(mfile, "r");
  411.     if (fp == NULL)
  412.     {
  413.       perror("cli: Error opening the bit error characteristics file");
  414.       exit(0);
  415.     }
  416.     for (i = 0; i < bits; i++)
  417.       fscanf(fp, "%1d", mask[i]);
  418.     fclose(fp);
  419.   }    
  420.   /* *** echo out parameters */
  421.   gethostname(host,20);
  422.   stat(prog, &statbuf); 
  423.   getwd(dir);
  424.   time(&tim);
  425.   printf("             User: %s@%sn", getlogin(), host);
  426.   printf("             Time: %s", ctime(&tim));
  427.   printf("          Program: %sn", prog);
  428.   printf("         Modified: %s", ctime(&statbuf.st_mtime));
  429.   printf("        Directory: %sn", dir);
  430.   if (cflag)
  431.   {
  432.     printf("     Channel file: %sn", ifile);
  433.     printf("      Output file: %sn", ofile);
  434.   }
  435.   else
  436.   {
  437.     printf("       Input file: %sn", ifile);
  438.     printf("      Output file: %sn", ofile);
  439.     printf("   Parameter file: %sn", pfile);
  440.     printf("Quantization file: %sn", qfile);
  441.     printf("BER and mask file: %sn", mfile);
  442.     printf("         Log file: %sn", lfile);
  443.     printf("           Code book size (ncsize)=%12dn",ncsize);
  444.     printf("              Code word length (l)=%12dn",*l);
  445.     printf("      LPC analysis frame size (ll)=%12dn",*ll);
  446.     printf("             LPC filter order (no)=%12dn",no);
  447.     printf("    Pitch analysis frame size (lp)=%12dn",*lp);
  448.     printf("         Pitch analysis order (np)=%12dn",*np);
  449.     printf(" Modified Excitation switch (mxsw)=%12dn",mxsw);
  450.     printf("Fractional pitch analysis (pstype)=%12sn",pstype);
  451.     printf("Prefilter weighting factor (prewt)=%12fn",prewt);
  452.     printf("    Noise weighting factor (gamma)=%12fn",gamma2);
  453.     printf("      Input scaling factor (scale)=%12fn",*scale);
  454.     printf("   Output scaling factor (descale)=%12fn",*descale);
  455.     printf("            %% bit error rate (BER)=%12fn",*ber);
  456.     if (strcmp(cbgtype, "none")) 
  457.       printf(" CB Gain: %8s quantizer, bit allocation: %2dn", cbgtype, cbgbits);
  458.     if (strcmp(ptype, "none")) 
  459.     {
  460.       printf("   Pitch: %8s quantizer, bit allocation: ", ptype);
  461.       for (i = 0; i < *np+2; i++)
  462.         printf("%2d",pbits[i]);
  463.       printf("n");
  464.     }
  465.     if (strcmp(stype, "none")) 
  466.     {
  467.       printf("Spectrum: %8s quantizer, bit allocation: ", stype);
  468.       for (i = 0; i < no; i++)
  469.         printf("%2d",sbits[i]);
  470.       printf("n");
  471.     }
  472.     if (qflag) printf("Data rate = %4d bps %3d bpf (%4d bps with 1 bit sync)n",
  473.                     rate, bits, rate2);
  474.     /* *** verify parameters */
  475.     if (ncsize > MAXNCSIZE) 
  476.     {
  477.       fprintf(stderr, "cli:  Error - ncsize too bign");
  478.       exit(1);
  479.     }
  480.     if (*l > MAXL)           
  481.     {
  482.       fprintf(stderr, "cli:  Error - l too bign");
  483.       exit(1);
  484.     }
  485.     if (*ll > MAXLL)         
  486.     {
  487.       fprintf(stderr, "cli:  Error - ll too bign");
  488.       exit(1);
  489.     }
  490.     if (no > MAXNO)         
  491.     {
  492.       fprintf(stderr, "cli:  Error - no too bign");
  493.       exit(1);
  494.     }
  495.     if (*lp > MAXLP)         
  496.     {
  497.       fprintf(stderr, "cli:  Error - lp too bign");
  498.       exit(1);
  499.     }
  500.     if (*np > MAXNP)         
  501.     {
  502.       fprintf(stderr, "cli:  Error - np too bign");
  503.       exit(1);
  504.     }
  505.     if (gamma2 > 1.0)        
  506.     {
  507.       fprintf(stderr, "cli:  Error - gamma > 1n");
  508.       exit(1);
  509.     }
  510.     if (*scale < 0.0)        
  511.     {
  512.       fprintf(stderr, "cli:  Error - scale < 0n");
  513.       exit(1);
  514.     }
  515.     if (*ber < 0.0)     
  516.     {
  517.       fprintf(stderr, "cli:  Error - ber < 0n");
  518.       exit(1);
  519.     }
  520.     if (*ll%*l) 
  521.     {
  522.       fprintf(stderr, "cli:  *** Error - ll & l are inconsistentn");
  523.       exit(1);
  524.     }
  525.     if (*ll%*lp) 
  526.     {
  527.       fprintf(stderr, "cli:  *** Error - ll & lp are inconsistentn");
  528.       exit(1);
  529.     }
  530.     if (cbgbits < 5 || cbgbits > 7) 
  531.     {
  532.       fprintf(stderr, "cli:  Error - bad cbgbits (not implemented)n");
  533.       exit(1);
  534.     }
  535.     if (pbits[0] > 8) 
  536.     {
  537.       fprintf(stderr, "cli:  *** Error - bad pbits[0] (not implemented)n");
  538.       exit(1);
  539.     }
  540.     if (pbits[1] > 7 || pbits[1] < 3) 
  541.     {
  542.       fprintf(stderr, "cli:  *** Error - bad pbits[1] (not implemented)n");
  543.       exit(1);
  544.     }
  545.     for (i = 2; i < *np+2; i++)
  546.     {
  547.       if (pbits[i]  <  3 || pbits[i] > 5)    
  548.       {
  549.         fprintf(stderr, "cli:  *** Error - bad pbits (not implemented)n");
  550.         exit(1);
  551.       }
  552.     }
  553.     flag = TRUE;
  554.     for (j = 0; j < MAXQTYPE; j++)
  555.     {
  556.       if (strcmp(cbgtype, qtype[j]) == 0) flag = FALSE;
  557.     }
  558.     if (flag) 
  559.     {
  560.       fprintf(stderr, "cli:  *** Error - bad cbgain quantizer typen");
  561.       exit(1);
  562.     }
  563.     flag = TRUE;
  564.     for (j = 0; j < MAXQTYPE; j++)
  565.     {
  566.       if (strcmp(ptype, qtype[j]) == 0) flag = FALSE;
  567.     }
  568.     if (flag) 
  569.     {
  570.       fprintf(stderr, "cli:  *** Error - bad pitch quantizer typen");
  571.       exit(1);
  572.     }
  573.     flag = TRUE;
  574.     for (j = 0; j < MAXQTYPE; j++)
  575.     {
  576.       if (strcmp(stype, qtype[j]) == 0) flag = FALSE;
  577.     }
  578.     if (flag) 
  579.     {
  580.       fprintf(stderr, "cli:  *** Error - bad spectrum quantizer typen");
  581.       exit(1);
  582.     }
  583.     /* *** generate log file if requested */
  584.     if (strcmp(lfile, "none"))
  585.     {  
  586.       if (strcmp(lfile, "celp.log") == 0)
  587.       {
  588.         fp = fopen(lfile, "a");
  589.         if (fp == NULL)
  590.         {
  591.           perror("cli: Error opening the log file");
  592.           exit(0);
  593.         }
  594.       }
  595.       else
  596.       {
  597.         fp = fopen(lfile, "w");
  598.         if (fp == NULL)
  599.         {
  600.           perror("cli: Error opening the log file");
  601.           exit(0);
  602.         }
  603.       }
  604.       fprintf(fp, "             User: %s@%sn", getlogin(), host);
  605.       fprintf(fp, "             Time: %s", ctime(&tim));
  606.       fprintf(fp, "          Program: %sn", prog);
  607.       fprintf(fp, "         Modified: %s", ctime(&statbuf.st_mtime));
  608.       fprintf(fp, "        Directory: %sn", dir);
  609.       fprintf(fp, "       Input file: %sn", ifile);
  610.       fprintf(fp, "      Output file: %sn", ofile);
  611.       fprintf(fp, "   Parameter file: %sn", pfile);
  612.       fprintf(fp, "Quantization file: %sn", qfile);
  613.       fprintf(fp, "BER and mask file: %sn", mfile);
  614.       fprintf(fp, "         Log file: %sn", lfile);
  615.       fprintf(fp, "           Code book size (ncsize)=%12dn",ncsize);
  616.       fprintf(fp, "              Code word length (l)=%12dn",*l);
  617.       fprintf(fp, "      LPC analysis frame size (ll)=%12dn",*ll);
  618.       fprintf(fp, "             LPC filter order (no)=%12dn",no);
  619.       fprintf(fp, "    Pitch analysis frame size (lp)=%12dn",*lp);
  620.       fprintf(fp, "         Pitch analysis order (np)=%12dn",*np);
  621.       fprintf(fp, " Modified Excitation switch (mxsw)=%12dn",mxsw);
  622.       fprintf(fp, "Fractional pitch analysis (pstype)=%12sn",pstype);
  623.       fprintf(fp, "Prefilter weighting factor (prewt)=%12fn",prewt);      
  624.       fprintf(fp, "    Noise weighting factor (gamma)=%12fn",gamma2);
  625.       fprintf(fp, "      Input scaling factor (scale)=%12fn",*scale);
  626.       fprintf(fp, "   Output scaling factor (descale)=%12fn",*descale);
  627.       fprintf(fp, "            %% bit error rate (BER)=%12fn",*ber);
  628.       if (strcmp(cbgtype, "none")) 
  629.         fprintf(fp, " CB Gain: %8s quantizer, bit allocation: %2dn",
  630.                    cbgtype, cbgbits);
  631.       if (strcmp(ptype, "none")) 
  632.       {
  633.         fprintf(fp, "   Pitch: %8s quantizer, bit allocation: ", ptype);
  634.         for (i = 0; i < *np+2; i++)
  635.           fprintf(fp, "%2d",pbits[i]);
  636.         fprintf(fp, "n");
  637.       }
  638.       if (strcmp(stype, "none")) 
  639.       {
  640.         fprintf(fp, "Spectrum: %8s quantizer, bit allocation: ", stype);
  641.         for (i = 0; i < no; i++)
  642.           fprintf(fp, "%2d",sbits[i]);
  643.         fprintf(fp, "n");
  644.       }
  645.       if (qflag)
  646.         fprintf(fp, "Data rate = %4d bps %3d bpf (%4d bps with 1 bit sync)n",
  647.                   rate, bits, rate2);
  648.     }
  649.   }
  650. }
  651. /**************************************************************************
  652. *
  653. * ROUTINE
  654. *               cliend
  655. *
  656. * FUNCTION
  657. *               End of command line interface entry.
  658. * Report and log job characteristics and performance.
  659. * SYNOPSIS
  660. *
  661. * entry cliend(sumsnr, framesnr, realerror,
  662. *     &             sumdm, framedm, sumdm2, framedm2)
  663. *
  664. *   formal 
  665. *
  666. * data I/O
  667. * name type type function
  668. *       ------------------------------------------------------------------
  669. * sumsnr float i sum of segmental signal-to-noise
  670. * framesnr int i count of frames used for snr sum
  671. * realerror float i bit error rate
  672. * sumdm float i sum of speech distortion measures
  673. * (see dist.c)
  674. * framedm int i count of frames used for sumdm
  675. * sumdm2 float i sum of spectral distortion measures
  676. * (see dist.c)
  677. * framedm2 int i count of frames used for sumdm2
  678. *
  679. **************************************************************************/
  680. #include <sys/times.h>
  681. cliend(sumsnr, framesnr, realerror, sumdm, framedm, sumdm2, framedm2)
  682. int framesnr, framedm, framedm2;
  683. float sumsnr, realerror, sumdm[], sumdm2[];
  684. {
  685.   long tim;
  686.   struct tms buffer;
  687.   /* *calculate run time, print time & date */
  688.   
  689.   time(&tim);
  690.   times(&buffer);
  691.   printf("Finished processing %d frames of data on %s", frame, ctime(&tim));
  692.   /* *actual bit error rate */
  693.   
  694.   printf("Overall bit error rate = %8.4f%%n", realerror);
  695.   /* *average segmental signal-to-noise */
  696.   
  697.   if (framesnr <= 0) framesnr = 1;
  698.   if (sumsnr / framesnr > 0.0)
  699.     printf("Segmental SNR = %8.4f dB (%d subframes averaged for SNR)n",
  700.            10 * log10(sumsnr/framesnr),framesnr);
  701.   else 
  702.     printf("Segmental SNR = %8.4f    (%d subframes averaged for SNR)n",
  703.            sumsnr/framesnr,framesnr);
  704.   /* *speech distortion */
  705.   
  706.   if (framedm != 0.0)
  707.   {
  708.     printf("Speech distortion:n");
  709.     printf("likelihood measures   %7.4f     %7.4fn",
  710.            sumdm[0]/framedm,sumdm[1]/framedm);
  711.     printf("cosh measures         %7.4f dB, %7.4f dB, %7.4f dB, %7.4f dBn",
  712.            sumdm[2]/framedm, sumdm[3]/framedm,
  713.            sumdm[4]/framedm, sumdm[5]/framedm);
  714.     printf("cepstral distance     %7.4f dB, %7.4f dB, %7.4f dBn",
  715.            sumdm[6]/framedm,sumdm[7]/framedm,sumdm[8]/framedm);
  716.     printf("average distance      %7.4f dBn", sumdm[9]/framedm);
  717.   }
  718.   printf("%d subframes averaged for distance measuresn", framedm);
  719.   /* *spectral distortion */
  720.   
  721.   if (framedm2 != 0.0)
  722.   {
  723.     printf("Spectral distortion:n");
  724.     printf("likelihood measures   %7.4f     %7.4fn",
  725.            sumdm2[0]/framedm2,sumdm2[1]/framedm2);
  726.     printf("cosh measures         %7.4f dB, %7.4f dB, %7.4f dB, %7.4f dBn",
  727.            sumdm2[2]/framedm2, sumdm2[3]/framedm2,
  728.            sumdm2[4]/framedm2, sumdm2[5]/framedm2);
  729.     printf("cepstral distance     %7.4f dB, %7.4f dB, %7.4f dBn",
  730.            sumdm2[6]/framedm2,sumdm2[7]/framedm2,sumdm2[8]/framedm2);
  731.     printf("average distance      %7.4f dBn", sumdm2[9]/framedm2);
  732.   }
  733.   printf("%d subframes averaged for distance measuresn", framedm2);
  734.   
  735.   /* *print runtime, etc. (& ring bell) */
  736.   
  737.   printf("Elapsed times (s):  %.1f user, %.1f system, %.1f total7n",
  738.           buffer.tms_utime/60., buffer.tms_stime/60.,
  739.           (buffer.tms_utime + buffer.tms_stime)/60.);
  740.   /* *write above to log file */
  741.   
  742.   if (strcmp(lfile, "none"))
  743.   {
  744.     fprintf(fp, "Finished processing %d frames of data on %s",
  745.                  frame, ctime(&tim));
  746.     fprintf(fp, "Overall bit error rate = %8.4f%%n", realerror);
  747.     if (sumsnr/framesnr > 0.0)
  748.       fprintf(fp, "Segmental SNR = %8.4f dB (%d subframes averaged for SNR)n",
  749.                    10 * log10(sumsnr/framesnr), framesnr);
  750.     else 
  751.       fprintf(fp, "Segmental SNR = %8.4f    (%d subframes averaged for SNR)n",
  752.                    sumsnr/framesnr, framesnr);
  753.     if (framedm != 0.0)
  754.     {
  755.       fprintf(fp, "Speech distortion:n");
  756.       fprintf(fp, "likelihood measures %7.4f     %7.4fn",
  757.                  sumdm[0]/framedm,sumdm[1]/framedm);
  758.       fprintf(fp, "cosh measures       %7.4f dB, %7.4f dB, %7.4f dB, %7.4f dBn",
  759.                  sumdm[2]/framedm, sumdm[3]/framedm,
  760.                  sumdm[4]/framedm, sumdm[5]/framedm);
  761.       fprintf(fp, "cepstral distance   %7.4f dB, %7.4f dB, %7.4f dBn",
  762.                  sumdm[6]/framedm,sumdm[7]/framedm,sumdm[8]/framedm);
  763.       fprintf(fp, "average distance    %7.4f dBn", sumdm[9]/framedm);
  764.     }
  765.     fprintf(fp, "%d subframes averaged for distance measuresn", framedm);
  766.     if (framedm2 != 0.0)
  767.     {
  768.       fprintf(fp, "Spectral distortion:n");
  769.       fprintf(fp, "likelihood measures   %7.4f     %7.4fn",
  770.                  sumdm2[0]/framedm2,sumdm2[1]/framedm2);
  771.       fprintf(fp, "cosh measures       %7.4f dB, %7.4f dB, %7.4f dB, %7.4f dBn",
  772.                  sumdm2[2]/framedm2, sumdm2[3]/framedm2,
  773.                  sumdm2[4]/framedm2, sumdm2[5]/framedm2);
  774.       fprintf(fp, "cepstral distance   %7.4f dB, %7.4f dB, %7.4f dBn",
  775.                  sumdm2[6]/framedm2,sumdm2[7]/framedm2,sumdm2[8]/framedm2);
  776.       fprintf(fp, "average distance    %7.4f dBn", sumdm2[9]/framedm2);
  777.     }
  778.     fprintf(fp, "%d subframes averaged for distance measuresn", framedm2);
  779.     fprintf(fp, "Elapsed times (s):  %f user, %f system, %f total6n",
  780.                  buffer.tms_utime/60., buffer.tms_stime/60.,
  781.                  (buffer.tms_utime + buffer.tms_stime)/60.);
  782.     fprintf(fp, "%s%sn","...................................",
  783.                          "...................................");
  784.     fclose(fp);
  785.   }
  786. }