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 }
|