tomwalters@0: /* tomwalters@0: ftos.c binary float-to-short conversion. tomwalters@0: -------- tomwalters@0: tomwalters@0: */ tomwalters@0: tomwalters@0: #include tomwalters@0: #include tomwalters@0: #include "options.h" tomwalters@0: tomwalters@0: char applic[] = "float to short data-type conversion." ; tomwalters@0: tomwalters@0: static char *helpstr, *errstr ; tomwalters@0: tomwalters@0: static Options option[] = { tomwalters@0: { "help" , "off" , &helpstr , "help" , DEBUG }, tomwalters@0: { "error" , "off" , &errstr , "print overflow and quantization errors" , VAL }, tomwalters@0: ( char * ) 0 } ; tomwalters@0: tomwalters@0: tomwalters@0: #define MAX 32767. tomwalters@0: #define MIN ( -32767. ) tomwalters@0: tomwalters@0: main(argc, argv) tomwalters@0: int argc ; tomwalters@0: char *argv[] ; tomwalters@0: { tomwalters@0: FILE *fp ; tomwalters@0: float X ; tomwalters@0: short Y ; tomwalters@0: int i ; tomwalters@0: float min = MAX, fmin ; tomwalters@0: float max = MIN, fmax ; tomwalters@0: float quant, maxquant, sumquant=0 ; tomwalters@0: tomwalters@0: fp = openopts( option,argc,argv ) ; tomwalters@0: if ( !isoff( helpstr ) ) tomwalters@0: helpopts( helpstr, argv[0], applic, option ) ; tomwalters@0: tomwalters@0: if ( isoff( errstr ) ) { tomwalters@0: tomwalters@0: while ( fread( &X, sizeof(float), 1, fp ) ) { tomwalters@0: Y = (short)X ; tomwalters@0: fwrite( &Y, sizeof(short), 1, stdout); tomwalters@0: } tomwalters@0: } tomwalters@0: tomwalters@0: else { tomwalters@0: tomwalters@0: for ( i = 0 ; fread( &X, sizeof(float), 1, fp ) ; i++ ) { tomwalters@0: if ( X > max ) max = X ; tomwalters@0: if ( X < min ) min = X ; tomwalters@0: quant = ( X - (int)X ) / (int)( 1 + X ) ; tomwalters@0: sumquant += quant ; tomwalters@0: if ( quant > maxquant ) maxquant = quant ; tomwalters@0: Y = (short)X ; tomwalters@0: fwrite( &Y, sizeof(short), 1, stdout); tomwalters@0: } tomwalters@0: tomwalters@0: if ( max > MAX || min < MIN ) { tomwalters@0: tomwalters@0: if ( max > MAX ) fmax = MAX / max ; tomwalters@0: if ( min < MIN ) fmin = MIN / min ; tomwalters@0: tomwalters@0: if ( fmax < fmin ) fprintf( stderr, "16-bit overflow (scale down by a factor < %f\n", fmax ) ; tomwalters@0: else fprintf( stderr, "16-bit underflow (scale down by a factor < %f\n", fmin ) ; tomwalters@0: } tomwalters@0: fprintf( stderr, "max quantization error = %f\n", maxquant ) ; tomwalters@0: fprintf( stderr, "mean quantization error = %f\n", sumquant/i ) ; tomwalters@0: } tomwalters@0: tomwalters@0: fclose(fp); tomwalters@0: exit(0); tomwalters@0: } tomwalters@0: tomwalters@0: