Mercurial > hg > aim92
diff tools/ftos.c @ 0:5242703e91d3 tip
Initial checkin for AIM92 aimR8.2 (last updated May 1997).
author | tomwalters |
---|---|
date | Fri, 20 May 2011 15:19:45 +0100 |
parents | |
children |
line wrap: on
line diff
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/tools/ftos.c Fri May 20 15:19:45 2011 +0100 @@ -0,0 +1,76 @@ +/* + ftos.c binary float-to-short conversion. + -------- + +*/ + +#include <stdio.h> +#include <math.h> +#include "options.h" + +char applic[] = "float to short data-type conversion." ; + +static char *helpstr, *errstr ; + +static Options option[] = { + { "help" , "off" , &helpstr , "help" , DEBUG }, + { "error" , "off" , &errstr , "print overflow and quantization errors" , VAL }, + ( char * ) 0 } ; + + +#define MAX 32767. +#define MIN ( -32767. ) + +main(argc, argv) +int argc ; +char *argv[] ; +{ + FILE *fp ; + float X ; + short Y ; + int i ; + float min = MAX, fmin ; + float max = MIN, fmax ; + float quant, maxquant, sumquant=0 ; + + fp = openopts( option,argc,argv ) ; + if ( !isoff( helpstr ) ) + helpopts( helpstr, argv[0], applic, option ) ; + + if ( isoff( errstr ) ) { + + while ( fread( &X, sizeof(float), 1, fp ) ) { + Y = (short)X ; + fwrite( &Y, sizeof(short), 1, stdout); + } + } + + else { + + for ( i = 0 ; fread( &X, sizeof(float), 1, fp ) ; i++ ) { + if ( X > max ) max = X ; + if ( X < min ) min = X ; + quant = ( X - (int)X ) / (int)( 1 + X ) ; + sumquant += quant ; + if ( quant > maxquant ) maxquant = quant ; + Y = (short)X ; + fwrite( &Y, sizeof(short), 1, stdout); + } + + if ( max > MAX || min < MIN ) { + + if ( max > MAX ) fmax = MAX / max ; + if ( min < MIN ) fmin = MIN / min ; + + if ( fmax < fmin ) fprintf( stderr, "16-bit overflow (scale down by a factor < %f\n", fmax ) ; + else fprintf( stderr, "16-bit underflow (scale down by a factor < %f\n", fmin ) ; + } + fprintf( stderr, "max quantization error = %f\n", maxquant ) ; + fprintf( stderr, "mean quantization error = %f\n", sumquant/i ) ; + } + + fclose(fp); + exit(0); +} + +