Mercurial > hg > libxtract
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 } |