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

语音压缩

开发平台:

Unix_Linux

  1. #define ALEN 32
  2. #define SHORT 2
  3. #define mmin(A,B)      ((A)<(B)?(A):(B))
  4. #define mmax(A,B)      ((A)>(B)?(A):(B))
  5. #include <stdio.h>
  6. #include <math.h>
  7. #include <sys/file.h>
  8. main(argc, argv)
  9. int argc;
  10. char *argv[];
  11.   int i, j, maxd, ns;
  12.   int read_file1, read_file2, write_file3;
  13.   int n_read1, n_read2, n_write3;
  14.   short ia[ALEN], ib[ALEN];
  15.   float rms;
  16.   char input_file1[100], input_file2[100], output_file[100];
  17.   if (argc < 3 || argc > 4)
  18.   {
  19.     printf("Usage error: sub infile1 infile2 [outfile]n                 (outfile = infile1 - infile2)n");
  20.   exit(0);
  21.   }
  22.   strcpy(input_file1, argv[1]);
  23.   strcpy(input_file2, argv[2]);
  24.   read_file1 = open(input_file1, O_RDONLY, 0);
  25.   if (read_file1 < 0)
  26.   {
  27.     perror("ERROR opening the first input file for reading");
  28.     exit(0);
  29.   }
  30.   read_file2 = open(input_file2, O_RDONLY, 0);
  31.   if (read_file2 < 0)
  32.   {
  33.     perror("ERROR opening the second input file for reading");
  34.     exit(0);
  35.   }
  36.   if (argc == 4)
  37.   {
  38.     strcpy(output_file, argv[3]);
  39.     write_file3 = open(output_file, O_WRONLY|O_CREAT, 0644);
  40.     if (write_file3 < 0)
  41.     {
  42.       perror("ERROR opening the output file for writing");
  43.       exit(0);
  44.     }
  45.   }
  46.   maxd = 0;
  47.   rms = 0.0;
  48.   n_read1 = read(read_file1, ia, ALEN*SHORT);
  49.   n_read2 = read(read_file2, ib, ALEN*SHORT);
  50.   while (n_read1 != 0 && n_read2 != 0)
  51.   {
  52.     for (i = 0; i < ALEN; i++)
  53.     {
  54.       j = ia[i] - ib[i];
  55.       maxd = mmax(maxd, abs(j));
  56.       rms = rms + j * j;
  57.       ia[i] = mmax(mmin(j, 32767), -32768);
  58.     }
  59.     if (argc == 4)
  60.     {
  61.       n_write3 = write(write_file3, ia, ALEN*SHORT);
  62.       if(n_write3 < 0)
  63.       {
  64.         perror("ERROR writing the output file");
  65.         exit(0);
  66.       }
  67.     }
  68.     ns = ns + ALEN;
  69.     n_read1 = read(read_file1, ia, ALEN*SHORT);
  70.     if(n_read1 < 0)
  71.     {
  72.        perror("ERROR reading the first input file");
  73.        exit(0);
  74.     }
  75.     n_read2 = read(read_file2, ib, ALEN*SHORT);
  76.     if(n_read2 < 0)
  77.     {
  78.       perror("ERROR reading the second input file");
  79.       exit(0);
  80.     }
  81.   }
  82.   if (ns < 0)
  83.   {
  84.     printf("No Samplesn");
  85.     exit(0);
  86.   }
  87.   if (maxd <= 0)
  88.   {
  89.     printf("No Differencesn");
  90.     exit(0);
  91.   }
  92.   printf("    %d samples, RMS dif = %6.2f, Max diff = %dn", ns, sqrt(rms/ns), maxd);
  93. }