tomwalters@0
|
1 /*
|
tomwalters@0
|
2 ftos.c binary float-to-short conversion.
|
tomwalters@0
|
3 --------
|
tomwalters@0
|
4
|
tomwalters@0
|
5 */
|
tomwalters@0
|
6
|
tomwalters@0
|
7 #include <stdio.h>
|
tomwalters@0
|
8 #include <math.h>
|
tomwalters@0
|
9 #include "options.h"
|
tomwalters@0
|
10
|
tomwalters@0
|
11 char applic[] = "float to short data-type conversion." ;
|
tomwalters@0
|
12
|
tomwalters@0
|
13 static char *helpstr, *errstr ;
|
tomwalters@0
|
14
|
tomwalters@0
|
15 static Options option[] = {
|
tomwalters@0
|
16 { "help" , "off" , &helpstr , "help" , DEBUG },
|
tomwalters@0
|
17 { "error" , "off" , &errstr , "print overflow and quantization errors" , VAL },
|
tomwalters@0
|
18 ( char * ) 0 } ;
|
tomwalters@0
|
19
|
tomwalters@0
|
20
|
tomwalters@0
|
21 #define MAX 32767.
|
tomwalters@0
|
22 #define MIN ( -32767. )
|
tomwalters@0
|
23
|
tomwalters@0
|
24 main(argc, argv)
|
tomwalters@0
|
25 int argc ;
|
tomwalters@0
|
26 char *argv[] ;
|
tomwalters@0
|
27 {
|
tomwalters@0
|
28 FILE *fp ;
|
tomwalters@0
|
29 float X ;
|
tomwalters@0
|
30 short Y ;
|
tomwalters@0
|
31 int i ;
|
tomwalters@0
|
32 float min = MAX, fmin ;
|
tomwalters@0
|
33 float max = MIN, fmax ;
|
tomwalters@0
|
34 float quant, maxquant, sumquant=0 ;
|
tomwalters@0
|
35
|
tomwalters@0
|
36 fp = openopts( option,argc,argv ) ;
|
tomwalters@0
|
37 if ( !isoff( helpstr ) )
|
tomwalters@0
|
38 helpopts( helpstr, argv[0], applic, option ) ;
|
tomwalters@0
|
39
|
tomwalters@0
|
40 if ( isoff( errstr ) ) {
|
tomwalters@0
|
41
|
tomwalters@0
|
42 while ( fread( &X, sizeof(float), 1, fp ) ) {
|
tomwalters@0
|
43 Y = (short)X ;
|
tomwalters@0
|
44 fwrite( &Y, sizeof(short), 1, stdout);
|
tomwalters@0
|
45 }
|
tomwalters@0
|
46 }
|
tomwalters@0
|
47
|
tomwalters@0
|
48 else {
|
tomwalters@0
|
49
|
tomwalters@0
|
50 for ( i = 0 ; fread( &X, sizeof(float), 1, fp ) ; i++ ) {
|
tomwalters@0
|
51 if ( X > max ) max = X ;
|
tomwalters@0
|
52 if ( X < min ) min = X ;
|
tomwalters@0
|
53 quant = ( X - (int)X ) / (int)( 1 + X ) ;
|
tomwalters@0
|
54 sumquant += quant ;
|
tomwalters@0
|
55 if ( quant > maxquant ) maxquant = quant ;
|
tomwalters@0
|
56 Y = (short)X ;
|
tomwalters@0
|
57 fwrite( &Y, sizeof(short), 1, stdout);
|
tomwalters@0
|
58 }
|
tomwalters@0
|
59
|
tomwalters@0
|
60 if ( max > MAX || min < MIN ) {
|
tomwalters@0
|
61
|
tomwalters@0
|
62 if ( max > MAX ) fmax = MAX / max ;
|
tomwalters@0
|
63 if ( min < MIN ) fmin = MIN / min ;
|
tomwalters@0
|
64
|
tomwalters@0
|
65 if ( fmax < fmin ) fprintf( stderr, "16-bit overflow (scale down by a factor < %f\n", fmax ) ;
|
tomwalters@0
|
66 else fprintf( stderr, "16-bit underflow (scale down by a factor < %f\n", fmin ) ;
|
tomwalters@0
|
67 }
|
tomwalters@0
|
68 fprintf( stderr, "max quantization error = %f\n", maxquant ) ;
|
tomwalters@0
|
69 fprintf( stderr, "mean quantization error = %f\n", sumquant/i ) ;
|
tomwalters@0
|
70 }
|
tomwalters@0
|
71
|
tomwalters@0
|
72 fclose(fp);
|
tomwalters@0
|
73 exit(0);
|
tomwalters@0
|
74 }
|
tomwalters@0
|
75
|
tomwalters@0
|
76
|