comparison src/descriptors.c @ 104:a32738e9d955

- Fixes to descriptors.c where no break statement was given for certain cases is switch conditionals - Added LPC and LPCC extraction functions. LPC implements Durbin method as described in Rabiner and Juang and implemented in Dr. Dobbs 1994 edition by Jutta Degener
author Jamie Bullock <jamie@postlude.co.uk>
date Mon, 24 Dec 2007 13:21:13 +0000
parents 192097e366d1
children f2af1c75e3ed
comparison
equal deleted inserted replaced
103:1cbbe5b5e461 104:a32738e9d955
135 case XTRACT_SPECTRAL_STANDARD_DEVIATION: 135 case XTRACT_SPECTRAL_STANDARD_DEVIATION:
136 case XTRACT_SPECTRAL_AVERAGE_DEVIATION: 136 case XTRACT_SPECTRAL_AVERAGE_DEVIATION:
137 case XTRACT_LOWEST_VALUE: 137 case XTRACT_LOWEST_VALUE:
138 case XTRACT_TONALITY: 138 case XTRACT_TONALITY:
139 case XTRACT_MFCC: 139 case XTRACT_MFCC:
140 case XTRACT_LPC:
141 case XTRACT_LPCC:
140 *argv_min = XTRACT_ANY; 142 *argv_min = XTRACT_ANY;
141 *argv_max = XTRACT_ANY; 143 *argv_max = XTRACT_ANY;
142 *argv_def = XTRACT_ANY; 144 *argv_def = XTRACT_ANY;
143 *argv_unit = XTRACT_ANY; 145 *argv_unit = XTRACT_ANY;
146 break;
144 case XTRACT_SPECTRAL_INHARMONICITY: 147 case XTRACT_SPECTRAL_INHARMONICITY:
145 *argv_min = 0.f; 148 *argv_min = 0.f;
146 *argv_max = XTRACT_SR_UPPER_LIMIT / 2; 149 *argv_max = XTRACT_SR_UPPER_LIMIT / 2;
147 *argv_def = XTRACT_FUNDAMENTAL_DEFAULT; 150 *argv_def = XTRACT_FUNDAMENTAL_DEFAULT;
148 *argv_unit = XTRACT_HERTZ; 151 *argv_unit = XTRACT_HERTZ;
152 break;
149 case XTRACT_F0: 153 case XTRACT_F0:
150 case XTRACT_FAILSAFE_F0: 154 case XTRACT_FAILSAFE_F0:
151 *argv_min = XTRACT_SR_LOWER_LIMIT; 155 *argv_min = XTRACT_SR_LOWER_LIMIT;
152 *argv_max = XTRACT_SR_UPPER_LIMIT; 156 *argv_max = XTRACT_SR_UPPER_LIMIT;
153 *argv_def = XTRACT_SR_DEFAULT; 157 *argv_def = XTRACT_SR_DEFAULT;
154 *argv_unit = XTRACT_HERTZ; 158 *argv_unit = XTRACT_HERTZ;
159 break;
155 /* argc = 2 */; 160 /* argc = 2 */;
156 case XTRACT_ROLLOFF: 161 case XTRACT_ROLLOFF:
157 *argv_min = XTRACT_FFT_BANDS_MIN; 162 *argv_min = XTRACT_FFT_BANDS_MIN;
158 *argv_max = XTRACT_FFT_BANDS_MAX; 163 *argv_max = XTRACT_FFT_BANDS_MAX;
159 *argv_def = XTRACT_SPEC_BW_DEF ; 164 *argv_def = XTRACT_SPEC_BW_DEF ;
160 *argv_unit = XTRACT_HERTZ; 165 *argv_unit = XTRACT_HERTZ;
161 *(argv_min + 1) = 0.f; 166 *(argv_min + 1) = 0.f;
162 *(argv_max + 1) = 100.f; 167 *(argv_max + 1) = 100.f;
163 *(argv_def + 1) = 95.f; 168 *(argv_def + 1) = 95.f;
164 *(argv_unit + 1) = XTRACT_PERCENT; 169 *(argv_unit + 1) = XTRACT_PERCENT;
170 break;
165 case XTRACT_SPECTRUM: 171 case XTRACT_SPECTRUM:
166 *argv_min = XTRACT_SR_LOWER_LIMIT / 2; 172 *argv_min = XTRACT_SR_LOWER_LIMIT / 2;
167 *argv_max = XTRACT_SR_UPPER_LIMIT / 2; 173 *argv_max = XTRACT_SR_UPPER_LIMIT / 2;
168 *argv_def = XTRACT_SR_DEFAULT / 2; 174 *argv_def = XTRACT_SR_DEFAULT / 2;
169 *argv_unit = XTRACT_HERTZ; 175 *argv_unit = XTRACT_HERTZ;
170 *(argv_min + 1) = 0; 176 *(argv_min + 1) = 0;
171 *(argv_max + 1) = 3 ; 177 *(argv_max + 1) = 3 ;
172 *(argv_def + 1) = 0; 178 *(argv_def + 1) = 0;
173 *(argv_unit + 1) = XTRACT_NONE; 179 *(argv_unit + 1) = XTRACT_NONE;
180 break;
174 case XTRACT_PEAK_SPECTRUM: 181 case XTRACT_PEAK_SPECTRUM:
175 *argv_min = XTRACT_SR_LOWER_LIMIT / 2; 182 *argv_min = XTRACT_SR_LOWER_LIMIT / 2;
176 *argv_max = XTRACT_SR_UPPER_LIMIT / 2; 183 *argv_max = XTRACT_SR_UPPER_LIMIT / 2;
177 *argv_def = XTRACT_SR_DEFAULT / 2; 184 *argv_def = XTRACT_SR_DEFAULT / 2;
178 *argv_unit = XTRACT_HERTZ; 185 *argv_unit = XTRACT_HERTZ;
179 *(argv_min + 1) = 0.f; 186 *(argv_min + 1) = 0.f;
180 *(argv_max + 1) = 100.f ; 187 *(argv_max + 1) = 100.f ;
181 *(argv_def + 1) = 10.f ; 188 *(argv_def + 1) = 10.f ;
182 *(argv_unit + 1) = XTRACT_PERCENT; 189 *(argv_unit + 1) = XTRACT_PERCENT;
190 break;
183 case XTRACT_HARMONIC_SPECTRUM: 191 case XTRACT_HARMONIC_SPECTRUM:
184 *argv_min = 0.f; 192 *argv_min = 0.f;
185 *argv_max = XTRACT_SR_UPPER_LIMIT / 2; 193 *argv_max = XTRACT_SR_UPPER_LIMIT / 2;
186 *argv_def = XTRACT_FUNDAMENTAL_DEFAULT; 194 *argv_def = XTRACT_FUNDAMENTAL_DEFAULT;
187 *argv_unit = XTRACT_HERTZ; 195 *argv_unit = XTRACT_HERTZ;
188 *(argv_min + 1) = 0.f; 196 *(argv_min + 1) = 0.f;
189 *(argv_max + 1) = 1.f ; 197 *(argv_max + 1) = 1.f ;
190 *(argv_def + 1) = .1f ; 198 *(argv_def + 1) = .1f ;
191 *(argv_unit + 1) = XTRACT_NONE; 199 *(argv_unit + 1) = XTRACT_NONE;
200 break;
192 case XTRACT_NOISINESS: 201 case XTRACT_NOISINESS:
193 case XTRACT_SKEWNESS: 202 case XTRACT_SKEWNESS:
194 case XTRACT_KURTOSIS: 203 case XTRACT_KURTOSIS:
195 case XTRACT_SPECTRAL_SKEWNESS: 204 case XTRACT_SPECTRAL_SKEWNESS:
196 case XTRACT_SPECTRAL_KURTOSIS: 205 case XTRACT_SPECTRAL_KURTOSIS:
201 *argv_unit = XTRACT_NONE; 210 *argv_unit = XTRACT_NONE;
202 *(argv_min + 1) = XTRACT_NONE; 211 *(argv_min + 1) = XTRACT_NONE;
203 *(argv_max + 1) = XTRACT_NONE; 212 *(argv_max + 1) = XTRACT_NONE;
204 *(argv_def + 1) = XTRACT_NONE; 213 *(argv_def + 1) = XTRACT_NONE;
205 *(argv_unit + 1) = XTRACT_NONE; 214 *(argv_unit + 1) = XTRACT_NONE;
215 break;
206 case XTRACT_BARK_COEFFICIENTS: 216 case XTRACT_BARK_COEFFICIENTS:
207 /* BARK_COEFFICIENTS is special because argc = BARK_BANDS */ 217 /* BARK_COEFFICIENTS is special because argc = BARK_BANDS */
208 default: 218 default:
209 *argv_min = XTRACT_NONE; 219 *argv_min = XTRACT_NONE;
210 *argv_max = XTRACT_NONE; 220 *argv_max = XTRACT_NONE;
211 *argv_def = XTRACT_NONE; 221 *argv_def = XTRACT_NONE;
212 *argv_unit = XTRACT_NONE; 222 *argv_unit = XTRACT_NONE;
223 break;
213 } 224 }
214 225
215 argv_donor = &d->argv.donor[0]; 226 argv_donor = &d->argv.donor[0];
216 227
217 switch (f) { 228 switch (f) {
324 case XTRACT_HPS: 335 case XTRACT_HPS:
325 case XTRACT_PEAK_SPECTRUM: 336 case XTRACT_PEAK_SPECTRUM:
326 case XTRACT_MFCC: 337 case XTRACT_MFCC:
327 *data_format = XTRACT_SPECTRAL_MAGNITUDES; 338 *data_format = XTRACT_SPECTRAL_MAGNITUDES;
328 break; 339 break;
340 case XTRACT_LPC:
341 *data_format = XTRACT_AUTOCORRELATION_COEFFS;
342 break;
343 case XTRACT_LPCC:
344 *data_format = XTRACT_LPC_COEFFS;
345 break;
329 case XTRACT_SPECTRAL_INHARMONICITY: 346 case XTRACT_SPECTRAL_INHARMONICITY:
330 case XTRACT_HARMONIC_SPECTRUM: 347 case XTRACT_HARMONIC_SPECTRUM:
331 *data_format = XTRACT_SPECTRAL_PEAKS; 348 *data_format = XTRACT_SPECTRAL_PEAKS;
332 break; 349 break;
333 case XTRACT_NONZERO_COUNT: 350 case XTRACT_NONZERO_COUNT:
412 case XTRACT_HPS: 429 case XTRACT_HPS:
413 case XTRACT_SPECTRUM: 430 case XTRACT_SPECTRUM:
414 case XTRACT_TONALITY: 431 case XTRACT_TONALITY:
415 case XTRACT_LOUDNESS: 432 case XTRACT_LOUDNESS:
416 case XTRACT_NONZERO_COUNT: 433 case XTRACT_NONZERO_COUNT:
434 case XTRACT_LPC:
435 case XTRACT_LPCC:
417 *data_unit = XTRACT_ANY; 436 *data_unit = XTRACT_ANY;
418 break; 437 break;
419 case XTRACT_SPECTRAL_MEAN: 438 case XTRACT_SPECTRAL_MEAN:
420 case XTRACT_SPECTRAL_VARIANCE: 439 case XTRACT_SPECTRAL_VARIANCE:
421 case XTRACT_SPECTRAL_STANDARD_DEVIATION: 440 case XTRACT_SPECTRAL_STANDARD_DEVIATION:
644 strcpy(name, "mfcc"); 663 strcpy(name, "mfcc");
645 strcpy(p_name, "Mel-Frequency Cepstral Coefficients"); 664 strcpy(p_name, "Mel-Frequency Cepstral Coefficients");
646 strcpy(desc, "Extract MFCC from a spectrum"); 665 strcpy(desc, "Extract MFCC from a spectrum");
647 strcpy(p_desc, "Extract MFCC from an audio spectrum"); 666 strcpy(p_desc, "Extract MFCC from an audio spectrum");
648 strcpy(author, "Rabiner"); 667 strcpy(author, "Rabiner");
668 break;
669 case XTRACT_LPC:
670 strcpy(name, "lpc");
671 strcpy(p_name, "Linear predictive coding coefficients");
672 strcpy(desc, "Extract LPC from autocorrelation coefficients");
673 strcpy(p_desc,
674 "Extract LPC from autocorrelation coefficients");
675 strcpy(author,
676 "Rabiner and Juang as implemented by Jutta Degener");
677 *year = 1994;
678 break;
679 case XTRACT_LPCC:
680 strcpy(name, "lpcc");
681 strcpy(p_name, "Linear predictive coding cepstral coefficients");
682 strcpy(desc, "Extract LPC cepstrum from LPC coefficients");
683 strcpy(p_desc,
684 "Extract LPC cepstrum from LPC coefficients");
685 strcpy(author, "Rabiner and Juang");
686 *year = 1993;
649 break; 687 break;
650 case XTRACT_BARK_COEFFICIENTS: 688 case XTRACT_BARK_COEFFICIENTS:
651 strcpy(name, "bark_coefficients"); 689 strcpy(name, "bark_coefficients");
652 strcpy(p_name, "Bark Coefficients"); 690 strcpy(p_name, "Bark Coefficients");
653 strcpy(desc, "Extract bark coefficients from a spectrum"); 691 strcpy(desc, "Extract bark coefficients from a spectrum");
924 break; 962 break;
925 case XTRACT_MFCC: 963 case XTRACT_MFCC:
926 *argc = 1; 964 *argc = 1;
927 *argv_type = XTRACT_MEL_FILTER; 965 *argv_type = XTRACT_MEL_FILTER;
928 break; 966 break;
967 case XTRACT_LPCC:
968 *argc = 1;
969 *argv_type = XTRACT_INT;
970 break;
929 case XTRACT_BARK_COEFFICIENTS: 971 case XTRACT_BARK_COEFFICIENTS:
930 *argc = XTRACT_BARK_BANDS; 972 *argc = XTRACT_BARK_BANDS;
931 *argv_type = XTRACT_INT; 973 *argv_type = XTRACT_INT;
932 break; 974 break;
933 case XTRACT_MEAN: 975 case XTRACT_MEAN:
959 case XTRACT_AUTOCORRELATION: 1001 case XTRACT_AUTOCORRELATION:
960 case XTRACT_AMDF: 1002 case XTRACT_AMDF:
961 case XTRACT_ASDF: 1003 case XTRACT_ASDF:
962 case XTRACT_NONZERO_COUNT: 1004 case XTRACT_NONZERO_COUNT:
963 case XTRACT_ODD_EVEN_RATIO: 1005 case XTRACT_ODD_EVEN_RATIO:
1006 case XTRACT_LPC:
964 default: 1007 default:
965 *argc = 0; 1008 *argc = 0;
966 break; 1009 break;
967 } 1010 }
968 1011
1017 case XTRACT_BARK_COEFFICIENTS: 1060 case XTRACT_BARK_COEFFICIENTS:
1018 case XTRACT_PEAK_SPECTRUM: 1061 case XTRACT_PEAK_SPECTRUM:
1019 case XTRACT_SPECTRUM: 1062 case XTRACT_SPECTRUM:
1020 case XTRACT_AUTOCORRELATION_FFT: 1063 case XTRACT_AUTOCORRELATION_FFT:
1021 case XTRACT_MFCC: 1064 case XTRACT_MFCC:
1065 case XTRACT_LPC:
1066 case XTRACT_LPCC:
1022 case XTRACT_DCT: 1067 case XTRACT_DCT:
1023 case XTRACT_HARMONIC_SPECTRUM: 1068 case XTRACT_HARMONIC_SPECTRUM:
1024 *is_scalar = XTRACT_FALSE; 1069 *is_scalar = XTRACT_FALSE;
1025 break; 1070 break;
1026 default: 1071 default:
1075 case XTRACT_HPS: 1120 case XTRACT_HPS:
1076 case XTRACT_ROLLOFF: 1121 case XTRACT_ROLLOFF:
1077 *result_unit = XTRACT_HERTZ; 1122 *result_unit = XTRACT_HERTZ;
1078 *result_min = 0.f; 1123 *result_min = 0.f;
1079 *result_max = XTRACT_SR_UPPER_LIMIT / 2; 1124 *result_max = XTRACT_SR_UPPER_LIMIT / 2;
1125 break;
1080 case XTRACT_ZCR: 1126 case XTRACT_ZCR:
1081 *result_unit = XTRACT_HERTZ; 1127 *result_unit = XTRACT_HERTZ;
1082 *result_min = 0.f; 1128 *result_min = 0.f;
1083 *result_max = XTRACT_ANY; 1129 *result_max = XTRACT_ANY;
1130 break;
1084 case XTRACT_ODD_EVEN_RATIO: 1131 case XTRACT_ODD_EVEN_RATIO:
1085 *result_unit = XTRACT_NONE; 1132 *result_unit = XTRACT_NONE;
1086 *result_min = 0.f; 1133 *result_min = 0.f;
1087 *result_max = 1.f; 1134 *result_max = 1.f;
1135 break;
1088 case XTRACT_LOUDNESS: 1136 case XTRACT_LOUDNESS:
1089 case XTRACT_FLATNESS: 1137 case XTRACT_FLATNESS:
1090 case XTRACT_TONALITY: 1138 case XTRACT_TONALITY:
1091 case XTRACT_CREST: 1139 case XTRACT_CREST:
1092 case XTRACT_SPECTRAL_INHARMONICITY: 1140 case XTRACT_SPECTRAL_INHARMONICITY:
1093 case XTRACT_POWER: 1141 case XTRACT_POWER:
1094 case XTRACT_SHARPNESS: 1142 case XTRACT_SHARPNESS:
1095 case XTRACT_SPECTRAL_SLOPE: 1143 case XTRACT_SPECTRAL_SLOPE:
1144 case XTRACT_LPC:
1145 case XTRACT_LPCC:
1096 default: 1146 default:
1097 *result_unit = XTRACT_UNKNOWN; 1147 *result_unit = XTRACT_UNKNOWN;
1098 *result_min = XTRACT_UNKNOWN; 1148 *result_min = XTRACT_UNKNOWN;
1099 *result_max = XTRACT_UNKNOWN; 1149 *result_max = XTRACT_UNKNOWN;
1150 break;
1100 } 1151 }
1101 } 1152 }
1102 else { 1153 else {
1103 1154
1104 result_min = NULL; 1155 result_min = NULL;
1111 case XTRACT_AMDF: 1162 case XTRACT_AMDF:
1112 case XTRACT_ASDF: 1163 case XTRACT_ASDF:
1113 case XTRACT_DCT: 1164 case XTRACT_DCT:
1114 *result_format = XTRACT_ARBITRARY_SERIES; 1165 *result_format = XTRACT_ARBITRARY_SERIES;
1115 *result_unit = XTRACT_ANY; 1166 *result_unit = XTRACT_ANY;
1167 break;
1116 case XTRACT_BARK_COEFFICIENTS: 1168 case XTRACT_BARK_COEFFICIENTS:
1117 *result_format = XTRACT_BARK_COEFFS; 1169 *result_format = XTRACT_BARK_COEFFS;
1118 *result_unit = XTRACT_UNKNOWN; /* FIX: check */ 1170 *result_unit = XTRACT_UNKNOWN; /* FIX: check */
1171 break;
1119 case XTRACT_PEAK_SPECTRUM: 1172 case XTRACT_PEAK_SPECTRUM:
1120 case XTRACT_SPECTRUM: 1173 case XTRACT_SPECTRUM:
1121 case XTRACT_HARMONIC_SPECTRUM: 1174 case XTRACT_HARMONIC_SPECTRUM:
1122 *result_format = XTRACT_SPECTRAL; 1175 *result_format = XTRACT_SPECTRAL;
1123 *result_unit = XTRACT_ANY_AMPLITUDE_HERTZ; 1176 *result_unit = XTRACT_ANY_AMPLITUDE_HERTZ;
1177 break;
1124 case XTRACT_AUTOCORRELATION_FFT: 1178 case XTRACT_AUTOCORRELATION_FFT:
1179 break;
1125 case XTRACT_MFCC: 1180 case XTRACT_MFCC:
1126 *result_format = XTRACT_MEL_COEFFS; 1181 *result_format = XTRACT_MEL_COEFFS;
1127 *result_unit = XTRACT_UNKNOWN; /* FIX: check */ 1182 *result_unit = XTRACT_UNKNOWN; /* FIX: check */
1183 break;
1184 case XTRACT_LPC:
1185 *result_format = XTRACT_LPC_COEFFS;
1186 *result_unit = XTRACT_UNKNOWN;
1187 break;
1188 case XTRACT_LPCC:
1189 *result_format = XTRACT_LPCC_COEFFS;
1190 *result_unit = XTRACT_UNKNOWN;
1191 break;
1128 default: 1192 default:
1129 break; 1193 break;
1130 } 1194 }
1131 } 1195 }
1132 } 1196 }