annotate tools/units.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 units.c
tomwalters@0 3 ---------
tomwalters@0 4 Return binary doubles for given string values, according to units.
tomwalters@0 5 Units are specified by the final char:
tomwalters@0 6 p sample points.
tomwalters@0 7 s seconds.
tomwalters@0 8 ms milliseconds
tomwalters@0 9 Hz Hertz.
tomwalters@0 10 kHz KiloHertz
tomwalters@0 11 erb equivalent rectangular bandwidth [Hz]
tomwalters@0 12
tomwalters@0 13 ***************************************************************************/
tomwalters@0 14
tomwalters@0 15 #include <stdio.h>
tomwalters@0 16 #include <math.h>
tomwalters@0 17 #include <ctype.h>
tomwalters@0 18 #include "units.h"
tomwalters@0 19 #include "strmatch.h"
tomwalters@0 20
tomwalters@0 21
tomwalters@0 22 /*
tomwalters@0 23 Return the units index number of the best matching units at the tail of
tomwalters@0 24 string `s'. Return -1 if no units are found.
tomwalters@0 25 */
tomwalters@0 26
tomwalters@0 27 int unitindex( s )
tomwalters@0 28 char *s ;
tomwalters@0 29 {
tomwalters@0 30 int i ;
tomwalters@0 31
tomwalters@0 32 if ( ( i = strnumspn( s ) ) == 0 ) { /* case of no digits found */
tomwalters@0 33 fprintf( stderr, "bad value [%s]\n", s ) ;
tomwalters@0 34 exit( 1 ) ;
tomwalters@0 35 }
tomwalters@0 36 if ( i == strlen( s ) )
tomwalters@0 37 return (-1) ; /* case of no units found */
tomwalters@0 38
tomwalters@0 39 switch ( i = listindex( units, s+i ) ) {
tomwalters@0 40 case (-1) : fprintf(stderr,"unknown units [%s]\n", s ) ;
tomwalters@0 41 exit( 1 ) ;
tomwalters@0 42 case (-2) : fprintf(stderr,"ambiguous units [%s]\n", s ) ;
tomwalters@0 43 exit( 1 ) ;
tomwalters@0 44 }
tomwalters@0 45 return i ; /* index of units */
tomwalters@0 46 }
tomwalters@0 47
tomwalters@0 48
tomwalters@0 49
tomwalters@0 50 /*
tomwalters@0 51 Return a ptr to the units string at the tail of string `s'.
tomwalters@0 52 Otherwise return a ptr to the null terminator of `s' if no units are found.
tomwalters@0 53 */
tomwalters@0 54
tomwalters@0 55 char *unitstr( s )
tomwalters@0 56 char *s ;
tomwalters@0 57 {
tomwalters@0 58 unitindex( s ) ; /* check for valid (or no) units */
tomwalters@0 59 return ( strnumptr( s ) ) ;
tomwalters@0 60 }
tomwalters@0 61
tomwalters@0 62
tomwalters@0 63 /*
tomwalters@0 64 Search the end of the given string for units (such as ms, kHz, etc).
tomwalters@0 65 Delete any units found by overwriting the start of the units string with '\0'.
tomwalters@0 66 */
tomwalters@0 67
tomwalters@0 68 stripunits( s )
tomwalters@0 69 char *s ;
tomwalters@0 70 {
tomwalters@0 71 *( unitstr( s ) ) = '\0' ;
tomwalters@0 72 }
tomwalters@0 73
tomwalters@0 74
tomwalters@0 75 /*
tomwalters@0 76 Return an allocated string to the square root of the given value with original
tomwalters@0 77 units appended.
tomwalters@0 78 */
tomwalters@0 79
tomwalters@0 80 char *sqrt_units( s )
tomwalters@0 81 char *s ;
tomwalters@0 82 {
tomwalters@0 83 char s1[64] ;
tomwalters@0 84
tomwalters@0 85 sprintf( s1, "%.2f%s", sqrt( (double)atof( s ) ), unitstr( s ) ) ;
tomwalters@0 86 return ( strcpy( (char *)malloc( strlen( s1 ) + 1 ), s1 ) ) ;
tomwalters@0 87 }
tomwalters@0 88
tomwalters@0 89
tomwalters@0 90 /*
tomwalters@0 91 Return the type of a <number>: INT, FLOAT, or 0 (if not a number).
tomwalters@0 92 <number> = [-]<digits>[.]<digits>
tomwalters@0 93 where either, but not both, of the digit strings may be empty.
tomwalters@0 94 */
tomwalters@0 95
tomwalters@0 96 int numbertype( str )
tomwalters@0 97 char *str ;
tomwalters@0 98 {
tomwalters@0 99 if ( strnumspn( str ) == 0 ) return 0 ;
tomwalters@0 100 if ( strchr( str, '.' ) == (char *)0 ) return INT ;
tomwalters@0 101 else return FLOAT ;
tomwalters@0 102 }
tomwalters@0 103
tomwalters@0 104
tomwalters@0 105 /*
tomwalters@0 106 Return 1 if str is an int, otherwise return 0.
tomwalters@0 107 */
tomwalters@0 108
tomwalters@0 109 int isint( str )
tomwalters@0 110 char *str ;
tomwalters@0 111 {
tomwalters@0 112 if ( numbertype( str ) == INT ) return 1 ;
tomwalters@0 113 return 0 ;
tomwalters@0 114 }
tomwalters@0 115
tomwalters@0 116 /*
tomwalters@0 117 Return 1 if str is a float, otherwise return 0.
tomwalters@0 118 */
tomwalters@0 119
tomwalters@0 120 int isfloat( str )
tomwalters@0 121 char *str ;
tomwalters@0 122 {
tomwalters@0 123 if ( numbertype( str ) == FLOAT ) return 1 ;
tomwalters@0 124 return 0 ;
tomwalters@0 125 }
tomwalters@0 126
tomwalters@0 127
tomwalters@0 128 /*
tomwalters@0 129 Units converters.
tomwalters@0 130 Generally called: to_<unit> where <unit> is the output units.
tomwalters@0 131 Input strings without units have `default' units.
tomwalters@0 132 */
tomwalters@0 133
tomwalters@0 134 double to_Hz( str, samplerate ) /* default units Hz */
tomwalters@0 135 char *str ;
tomwalters@0 136 int samplerate ;
tomwalters@0 137 {
tomwalters@0 138 switch ( unitindex( str ) ) {
tomwalters@0 139 case (-1) : return atof( str ) ;
tomwalters@0 140 case 0 : return ( (double)samplerate / atof( str ) ) ;
tomwalters@0 141 case 1 : return ( 1. / atof( str ) ) ;
tomwalters@0 142 case 2 : return ( 1000. / atof( str ) ) ;
tomwalters@0 143 case 3 : return atof( str ) ;
tomwalters@0 144 case 4 : return ( atof( str ) * 1000 ) ;
tomwalters@0 145 case 5 : return ( ( exp( (double)(atof( str ) / 9.265 )) - 1 ) * 9.265 * 24.7 ) ;
tomwalters@0 146 default : fprintf(stderr, "can't convert [%s] to Hz\n", str ) ;
tomwalters@0 147 exit( 1 ) ;
tomwalters@0 148 }
tomwalters@0 149 }
tomwalters@0 150
tomwalters@0 151 double to_kHz( str, samplerate ) /* default units Hz */
tomwalters@0 152 char *str ;
tomwalters@0 153 int samplerate ;
tomwalters@0 154 {
tomwalters@0 155 switch ( unitindex( str ) ) {
tomwalters@0 156 case (-1) : return ( atof( str ) * .001 ) ;
tomwalters@0 157 case 0 : return ( ( (double)samplerate / atof( str ) ) * 0.001 ) ;
tomwalters@0 158 case 1 : return ( ( 1. / atof( str ) ) * 0.001 ) ;
tomwalters@0 159 case 2 : return ( 1. / atof( str ) ) ;
tomwalters@0 160 case 3 : return ( atof( str ) * .001 ) ;
tomwalters@0 161 case 4 : return atof( str ) ;
tomwalters@0 162 case 5 : return ( ( exp( (double)(atof( str ) / 9.265 )) - 1 ) * 9.265 * 24.7 * .001 ) ;
tomwalters@0 163 default : fprintf(stderr, "can't convert [%s] to kHz\n", str ) ;
tomwalters@0 164 exit( 1 ) ;
tomwalters@0 165 }
tomwalters@0 166 }
tomwalters@0 167
tomwalters@0 168 double to_erb( str ) /* default units erb */
tomwalters@0 169 char *str ;
tomwalters@0 170 {
tomwalters@0 171 switch ( unitindex( str ) ) {
tomwalters@0 172 case (-1) : return atof( str ) ;
tomwalters@0 173 case 3 : return ( 9.265 * log( (double)(1 + atof( str )/(9.265*24.7)) ) ) ;
tomwalters@0 174 case 4 : return ( 9.265 * log( (double)(1 + (1000*atof( str ))/(9.265*24.7)) ) ) ;
tomwalters@0 175 case 5 : return atof( str ) ;
tomwalters@0 176 default : fprintf(stderr, "can't convert [%s] to erb\n", str ) ;
tomwalters@0 177 exit( 1 ) ;
tomwalters@0 178 }
tomwalters@0 179 }
tomwalters@0 180
tomwalters@0 181 double to_p( str, samplerate ) /* default units p */
tomwalters@0 182 char *str ;
tomwalters@0 183 int samplerate ;
tomwalters@0 184 {
tomwalters@0 185 switch ( unitindex( str ) ) {
tomwalters@0 186 case (-1) : return atof( str ) ;
tomwalters@0 187 case 0 : return atof( str ) ;
tomwalters@0 188 case 1 : return ( atof( str ) * samplerate ) ;
tomwalters@0 189 case 2 : return ( atof( str ) * samplerate * .001 ) ;
tomwalters@0 190 case 3 : return ( samplerate / atof( str ) ) ;
tomwalters@0 191 case 4 : return ( samplerate / ( 1000 * atof( str ) ) ) ;
tomwalters@0 192 default : fprintf(stderr, "can't convert [%s] to samples\n", str ) ;
tomwalters@0 193 exit( 1 ) ;
tomwalters@0 194 }
tomwalters@0 195 }
tomwalters@0 196
tomwalters@0 197
tomwalters@0 198
tomwalters@0 199 double to_s( str, samplerate ) /* default units p (sample points) */
tomwalters@0 200 char *str ;
tomwalters@0 201 int samplerate ;
tomwalters@0 202 {
tomwalters@0 203 switch ( unitindex( str ) ) {
tomwalters@0 204 case (-1) : return ( atof( str ) / samplerate ) ;
tomwalters@0 205 case 0 : return ( atof( str ) / samplerate ) ;
tomwalters@0 206 case 1 : return atof( str ) ;
tomwalters@0 207 case 2 : return ( atof( str ) * .001 ) ;
tomwalters@0 208 case 3 : return ( 1. / atof( str ) ) ;
tomwalters@0 209 case 4 : return ( 1. / ( 1000 * atof( str ) ) ) ;
tomwalters@0 210 default : fprintf(stderr, "can't convert [%s] to secs\n", str ) ;
tomwalters@0 211 exit( 1 ) ;
tomwalters@0 212 }
tomwalters@0 213 }
tomwalters@0 214
tomwalters@0 215
tomwalters@0 216 double to_ms( str, samplerate ) /* default units p */
tomwalters@0 217 char *str ;
tomwalters@0 218 int samplerate ;
tomwalters@0 219 {
tomwalters@0 220 switch ( unitindex( str ) ) {
tomwalters@0 221 case (-1) : return ( atof( str ) * 1000 / samplerate ) ;
tomwalters@0 222 case 0 : return ( atof( str ) * 1000 / samplerate ) ;
tomwalters@0 223 case 1 : return ( atof( str ) * 1000 ) ;
tomwalters@0 224 case 2 : return atof( str ) ;
tomwalters@0 225 case 3 : return ( 1000. / atof( str ) ) ;
tomwalters@0 226 case 4 : return ( 1. / atof( str ) ) ;
tomwalters@0 227 default : fprintf(stderr, "can't convert [%s] to ms\n", str ) ;
tomwalters@0 228 exit( 1 ) ;
tomwalters@0 229 }
tomwalters@0 230 }