jamie@50
|
1 /* libxtract feature extraction library
|
jamie@50
|
2 *
|
jamie@50
|
3 * Copyright (C) 2006 Jamie Bullock
|
jamie@50
|
4 *
|
jamie@50
|
5 * This program is free software; you can redistribute it and/or modify
|
jamie@50
|
6 * it under the terms of the GNU General Public License as published by
|
jamie@50
|
7 * the Free Software Foundation; either version 2 of the License, or
|
jamie@50
|
8 * (at your option) any later version.
|
jamie@50
|
9 *
|
jamie@50
|
10 * This program is distributed in the hope that it will be useful,
|
jamie@50
|
11 * but WITHOUT ANY WARRANTY; without even the implied warranty of
|
jamie@50
|
12 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
jamie@50
|
13 * GNU General Public License for more details.
|
jamie@50
|
14 *
|
jamie@50
|
15 * You should have received a copy of the GNU General Public License
|
jamie@50
|
16 * along with this program; if not, write to the Free Software
|
jamie@50
|
17 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301,
|
jamie@50
|
18 * USA.
|
jamie@50
|
19 */
|
jamie@50
|
20
|
jamie@50
|
21 #include "xtract/libxtract.h"
|
jamie@50
|
22 #include <stdlib.h>
|
jamie@50
|
23 #include <string.h>
|
jamie@50
|
24 #define XTRACT
|
jamie@50
|
25
|
jamie@50
|
26 void *xtract_make_descriptors(){
|
jamie@50
|
27
|
jamie@50
|
28 t_function_descriptor *fd, *d;
|
jamie@50
|
29 int f , F;
|
jamie@50
|
30 char *name, *pretty_name;
|
jamie@50
|
31 int *n_args;
|
jamie@50
|
32
|
jamie@50
|
33 f = F = XTRACT_FEATURES;
|
jamie@50
|
34
|
jamie@50
|
35 fd = malloc(XTRACT_FEATURES * sizeof(t_function_descriptor));
|
jamie@50
|
36
|
jamie@50
|
37 while(f--){
|
jamie@50
|
38 d = &fd[f];
|
jamie@50
|
39 switch(f){
|
jamie@50
|
40 case MEAN:
|
jamie@50
|
41 case VARIANCE:
|
jamie@50
|
42 case STANDARD_DEVIATION:
|
jamie@50
|
43 case AVERAGE_DEVIATION:
|
jamie@50
|
44 case ROLLOFF:
|
jamie@50
|
45 case INHARMONICITY:
|
jamie@50
|
46 case MAGNITUDE_SPECTRUM:
|
jamie@50
|
47 case ODD_EVEN_RATIO:
|
jamie@50
|
48 case LOWEST_VALUE:
|
jamie@50
|
49 case F0:
|
jamie@50
|
50 case FAILSAFE_F0:
|
jamie@50
|
51 case TONALITY:
|
jamie@50
|
52 d->n_args = 1;
|
jamie@50
|
53 d->argv.type = FLOAT;
|
jamie@50
|
54 break;
|
jamie@50
|
55 case SKEWNESS:
|
jamie@50
|
56 case KURTOSIS:
|
jamie@50
|
57 case PEAKS:
|
jamie@50
|
58 case HARMONICS:
|
jamie@50
|
59 case NOISINESS:
|
jamie@50
|
60 case CREST:
|
jamie@50
|
61 d->n_args = 2;
|
jamie@50
|
62 d->argv.type = FLOAT;
|
jamie@50
|
63 break;
|
jamie@50
|
64 case MFCC:
|
jamie@50
|
65 d->n_args = 1;
|
jamie@50
|
66 d->argv.type = MEL_FILTER;
|
jamie@50
|
67 break;
|
jamie@50
|
68 case BARK_COEFFICIENTS:
|
jamie@50
|
69 d->n_args = BARK_BANDS;
|
jamie@50
|
70 d->argv.type = INT;
|
jamie@50
|
71 break;
|
jamie@50
|
72 case CENTROID:
|
jamie@50
|
73 case IRREGULARITY_K:
|
jamie@50
|
74 case IRREGULARITY_J:
|
jamie@50
|
75 case TRISTIMULUS_1:
|
jamie@50
|
76 case TRISTIMULUS_2:
|
jamie@50
|
77 case TRISTIMULUS_3:
|
jamie@50
|
78 case SMOOTHNESS:
|
jamie@50
|
79 case FLATNESS:
|
jamie@50
|
80 case SPREAD:
|
jamie@50
|
81 case ZCR:
|
jamie@50
|
82 case LOUDNESS:
|
jamie@50
|
83 case HIGHEST_VALUE:
|
jamie@50
|
84 case SUM:
|
jamie@50
|
85 case RMS_AMPLITUDE:
|
jamie@50
|
86 case POWER:
|
jamie@50
|
87 case SHARPNESS:
|
jamie@50
|
88 case SLOPE:
|
jamie@50
|
89 case HPS:
|
jamie@50
|
90 case FLUX:
|
jamie@50
|
91 case ATTACK_TIME:
|
jamie@50
|
92 case DECAY_TIME:
|
jamie@50
|
93 case DELTA_FEATURE:
|
jamie@50
|
94 case AUTOCORRELATION_FFT:
|
jamie@50
|
95 case DCT:
|
jamie@50
|
96 case AUTOCORRELATION:
|
jamie@50
|
97 case AMDF:
|
jamie@50
|
98 case ASDF:
|
jamie@50
|
99 d->n_args = 0;
|
jamie@50
|
100 break;
|
jamie@50
|
101 default:
|
jamie@50
|
102 d->n_args = 0;
|
jamie@50
|
103 break;
|
jamie@50
|
104 }
|
jamie@50
|
105 name = d->algo.name;
|
jamie@50
|
106 pretty_name = d->algo.pretty_name;
|
jamie@50
|
107 n_args = d->n_args;
|
jamie@50
|
108 switch(f){
|
jamie@50
|
109 case MEAN:
|
jamie@50
|
110 strcpy(name, "mean");
|
jamie@50
|
111 strcpy(pretty_name, "Mean");
|
jamie@50
|
112 break;
|
jamie@50
|
113 case VARIANCE:
|
jamie@50
|
114 strcpy(name, "variance");
|
jamie@50
|
115 strcpy(pretty_name, "Variance");
|
jamie@50
|
116 break;
|
jamie@50
|
117 case STANDARD_DEVIATION:
|
jamie@50
|
118 strcpy(name, "standard_deviation");
|
jamie@50
|
119 strcpy(pretty_name, "Standard Deviation");
|
jamie@50
|
120 break;
|
jamie@50
|
121 case AVERAGE_DEVIATION:
|
jamie@50
|
122 strcpy(name, "average_deviation");
|
jamie@50
|
123 strcpy(pretty_name, "Average Deviation");
|
jamie@50
|
124 break;
|
jamie@50
|
125 case ROLLOFF:
|
jamie@50
|
126 strcpy(name, "rolloff");
|
jamie@50
|
127 strcpy(pretty_name, "Spectral Rolloff");
|
jamie@50
|
128 break;
|
jamie@50
|
129 case INHARMONICITY:
|
jamie@50
|
130 strcpy(name, "inharmonicity");
|
jamie@50
|
131 strcpy(pretty_name, "Inharmonicity");
|
jamie@50
|
132 break;
|
jamie@50
|
133 case MAGNITUDE_SPECTRUM:
|
jamie@50
|
134 strcpy(name, "magnitude_spectrum");
|
jamie@50
|
135 strcpy(pretty_name, "Magnitude Spectrum");
|
jamie@50
|
136 break;
|
jamie@50
|
137 case ODD_EVEN_RATIO:
|
jamie@50
|
138 strcpy(name, "odd_even_ratio");
|
jamie@50
|
139 strcpy(pretty_name, "Odd/Even Harmonic Ratio");
|
jamie@50
|
140 break;
|
jamie@50
|
141 case LOWEST_VALUE:
|
jamie@50
|
142 strcpy(name, "lowest_value");
|
jamie@50
|
143 strcpy(pretty_name, "Lowest Value");
|
jamie@50
|
144 break;
|
jamie@50
|
145 case F0:
|
jamie@50
|
146 strcpy(name, "f0");
|
jamie@50
|
147 strcpy(pretty_name, "Fundamental Frequency");
|
jamie@50
|
148 break;
|
jamie@50
|
149 case FAILSAFE_F0:
|
jamie@50
|
150 strcpy(name, "failsafe_f0");
|
jamie@50
|
151 strcpy(pretty_name, "Fundamental Frequency (failsafe)");
|
jamie@50
|
152 break;
|
jamie@50
|
153 case TONALITY:
|
jamie@50
|
154 strcpy(name, "tonality");
|
jamie@50
|
155 strcpy(pretty_name, "Tonality");
|
jamie@50
|
156 break;
|
jamie@50
|
157 case SKEWNESS:
|
jamie@50
|
158 strcpy(name, "skewness");
|
jamie@50
|
159 strcpy(pretty_name, "Spectral Skewness");
|
jamie@50
|
160 break;
|
jamie@50
|
161 case KURTOSIS:
|
jamie@50
|
162 strcpy(name, "kurtosis");
|
jamie@50
|
163 strcpy(pretty_name, "Spectral Kurtosis");
|
jamie@50
|
164 break;
|
jamie@50
|
165 case PEAKS:
|
jamie@50
|
166 strcpy(name, "peaks");
|
jamie@50
|
167 strcpy(pretty_name, "Spectral Peaks");
|
jamie@50
|
168 break;
|
jamie@50
|
169 case HARMONICS:
|
jamie@50
|
170 strcpy(name, "harmonics");
|
jamie@50
|
171 strcpy(pretty_name, "Spectral Harmonics");
|
jamie@50
|
172 break;
|
jamie@50
|
173 case NOISINESS:
|
jamie@50
|
174 strcpy(name, "noisiness");
|
jamie@50
|
175 strcpy(pretty_name, "Noisiness");
|
jamie@50
|
176 break;
|
jamie@50
|
177 case CREST:
|
jamie@50
|
178 strcpy(name, "crest");
|
jamie@50
|
179 strcpy(pretty_name, "Spectral Crest Measure");
|
jamie@50
|
180 break;
|
jamie@50
|
181 case MFCC:
|
jamie@50
|
182 strcpy(name, "mfcc");
|
jamie@50
|
183 strcpy(pretty_name, "Mel Frequency Cepstral Coefficients");
|
jamie@50
|
184 break;
|
jamie@50
|
185 case BARK_COEFFICIENTS:
|
jamie@50
|
186 strcpy(name, "bark_coefficients");
|
jamie@50
|
187 strcpy(pretty_name, "Bark Coefficients");
|
jamie@50
|
188 break;
|
jamie@50
|
189 case CENTROID:
|
jamie@50
|
190 strcpy(name, "centroid");
|
jamie@50
|
191 strcpy(pretty_name, "Spectral Centroid");
|
jamie@50
|
192 break;
|
jamie@50
|
193 case IRREGULARITY_K:
|
jamie@50
|
194 strcpy(name, "irregularity_k");
|
jamie@50
|
195 strcpy(pretty_name, "Irregularity I");
|
jamie@50
|
196 break;
|
jamie@50
|
197 case IRREGULARITY_J:
|
jamie@50
|
198 strcpy(name, "irregularity_j");
|
jamie@50
|
199 strcpy(pretty_name, "Irregularity II");
|
jamie@50
|
200 break;
|
jamie@50
|
201 case TRISTIMULUS_1:
|
jamie@50
|
202 strcpy(name, "tristimulus_1");
|
jamie@50
|
203 strcpy(pretty_name, "Tristimulus I");
|
jamie@50
|
204 break;
|
jamie@50
|
205 case TRISTIMULUS_2:
|
jamie@50
|
206 strcpy(name, "tristimulus_2");
|
jamie@50
|
207 strcpy(pretty_name, "Tristimulus II");
|
jamie@50
|
208 break;
|
jamie@50
|
209 case TRISTIMULUS_3:
|
jamie@50
|
210 strcpy(name, "tristimulus_3");
|
jamie@50
|
211 strcpy(pretty_name, "Tristimulus III");
|
jamie@50
|
212 break;
|
jamie@50
|
213 case SMOOTHNESS:
|
jamie@50
|
214 strcpy(name, "smoothness");
|
jamie@50
|
215 strcpy(pretty_name, "Spectral Smoothness");
|
jamie@50
|
216 break;
|
jamie@50
|
217 case FLATNESS:
|
jamie@50
|
218 strcpy(name, "flatness");
|
jamie@50
|
219 strcpy(pretty_name, "Spectral Flatness");
|
jamie@50
|
220 break;
|
jamie@50
|
221 case SPREAD:
|
jamie@50
|
222 strcpy(name, "spread");
|
jamie@50
|
223 strcpy(pretty_name, "Spectral Spread");
|
jamie@50
|
224 break;
|
jamie@50
|
225 case ZCR:
|
jamie@50
|
226 strcpy(name, "zcr");
|
jamie@50
|
227 strcpy(pretty_name, "Zero Crossing Rate");
|
jamie@50
|
228 break;
|
jamie@50
|
229 case LOUDNESS:
|
jamie@50
|
230 strcpy(name, "loudness");
|
jamie@50
|
231 strcpy(pretty_name, "Loudness");
|
jamie@50
|
232 break;
|
jamie@50
|
233 case HIGHEST_VALUE:
|
jamie@50
|
234 strcpy(name, "highest_value");
|
jamie@50
|
235 strcpy(pretty_name, "Highest Value");
|
jamie@50
|
236 break;
|
jamie@50
|
237 case SUM:
|
jamie@50
|
238 strcpy(name, "sum");
|
jamie@50
|
239 strcpy(pretty_name, "Sum of Values");
|
jamie@50
|
240 break;
|
jamie@50
|
241 case RMS_AMPLITUDE:
|
jamie@50
|
242 strcpy(name, "rms_amplitude");
|
jamie@50
|
243 strcpy(pretty_name, "RMS Amplitude");
|
jamie@50
|
244 break;
|
jamie@50
|
245 case POWER:
|
jamie@50
|
246 strcpy(name, "power");
|
jamie@50
|
247 strcpy(pretty_name, "Spectral Power");
|
jamie@50
|
248 break;
|
jamie@50
|
249 case SHARPNESS:
|
jamie@50
|
250 strcpy(name, "sharpness");
|
jamie@50
|
251 strcpy(pretty_name, "Spectral Sharpness");
|
jamie@50
|
252 break;
|
jamie@50
|
253 case SLOPE:
|
jamie@50
|
254 strcpy(name, "slope");
|
jamie@50
|
255 strcpy(pretty_name, "Spectral Slope");
|
jamie@50
|
256 break;
|
jamie@50
|
257 case HPS:
|
jamie@50
|
258 strcpy(name, "hps");
|
jamie@50
|
259 strcpy(pretty_name, "Harmonic Product Spectrum");
|
jamie@50
|
260 break;
|
jamie@50
|
261 case FLUX:
|
jamie@50
|
262 strcpy(name, "flux");
|
jamie@50
|
263 strcpy(pretty_name, "Spectral Flux");
|
jamie@50
|
264 break;
|
jamie@50
|
265 case ATTACK_TIME:
|
jamie@50
|
266 strcpy(name, "attack_time");
|
jamie@50
|
267 strcpy(pretty_name, "Attack Time");
|
jamie@50
|
268 break;
|
jamie@50
|
269 case DECAY_TIME:
|
jamie@50
|
270 strcpy(name, "decay_time");
|
jamie@50
|
271 strcpy(pretty_name, "Decay Time");
|
jamie@50
|
272 break;
|
jamie@50
|
273 case DELTA_FEATURE:
|
jamie@50
|
274 strcpy(name, "delta_feature");
|
jamie@50
|
275 strcpy(pretty_name, "Delta Feature");
|
jamie@50
|
276 break;
|
jamie@50
|
277 case AUTOCORRELATION_FFT:
|
jamie@50
|
278 strcpy(name, "autocorrelation_fft");
|
jamie@50
|
279 strcpy(pretty_name, "Autocorrelation (FFT method)");
|
jamie@50
|
280 break;
|
jamie@50
|
281 case DCT:
|
jamie@50
|
282 strcpy(name, "dct");
|
jamie@50
|
283 strcpy(pretty_name, "Discrete Cosine Transform");
|
jamie@50
|
284 break;
|
jamie@50
|
285 case AUTOCORRELATION:
|
jamie@50
|
286 strcpy(name, "autocorrelation");
|
jamie@50
|
287 strcpy(pretty_name, "Autocorrelation");
|
jamie@50
|
288 break;
|
jamie@50
|
289 case AMDF:
|
jamie@50
|
290 strcpy(name, "amdf");
|
jamie@50
|
291 strcpy(pretty_name, "Average Magnitude Difference Function");
|
jamie@50
|
292 break;
|
jamie@50
|
293 case ASDF:
|
jamie@50
|
294 strcpy(name, "asdf");
|
jamie@50
|
295 strcpy(pretty_name, "Average Squared Difference Function");
|
jamie@50
|
296 break;
|
jamie@50
|
297 default:
|
jamie@50
|
298 break;
|
jamie@50
|
299 }
|
jamie@50
|
300 }
|
jamie@50
|
301
|
jamie@50
|
302 return fd;
|
jamie@50
|
303 }
|
jamie@50
|
304
|
jamie@50
|
305 int xtract_free_descriptors(void *fd){
|
jamie@50
|
306
|
jamie@50
|
307 if (fd != NULL) {
|
jamie@50
|
308 free(fd);
|
jamie@50
|
309 }
|
jamie@50
|
310
|
jamie@50
|
311 return SUCCESS;
|
jamie@50
|
312 }
|
jamie@50
|
313
|
jamie@50
|
314
|
jamie@50
|
315
|
jamie@50
|
316
|
jamie@50
|
317
|