annotate 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
rev   line source
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