jamie@50: /* libxtract feature extraction library jamie@50: * jamie@50: * Copyright (C) 2006 Jamie Bullock jamie@50: * jamie@50: * This program is free software; you can redistribute it and/or modify jamie@50: * it under the terms of the GNU General Public License as published by jamie@50: * the Free Software Foundation; either version 2 of the License, or jamie@50: * (at your option) any later version. jamie@50: * jamie@50: * This program is distributed in the hope that it will be useful, jamie@50: * but WITHOUT ANY WARRANTY; without even the implied warranty of jamie@50: * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the jamie@50: * GNU General Public License for more details. jamie@50: * jamie@50: * You should have received a copy of the GNU General Public License jamie@50: * along with this program; if not, write to the Free Software jamie@50: * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, jamie@50: * USA. jamie@50: */ jamie@50: jamie@50: #include "xtract/libxtract.h" jamie@56: #include "xtract_macros_private.h" jamie@50: #include jamie@50: #include jamie@50: #define XTRACT jamie@50: jamie@110: xtract_function_descriptor_t *xtract_make_descriptors(void){ jamie@52: jamie@50: int f , F; jamie@56: char *name, *p_name, *desc, *p_desc, *author; jamie@55: float *argv_min, *argv_max, *argv_def, *result_min, *result_max; jamie@56: int *argc, *year, *argv_donor; jamie@56: xtract_vector_t *data_format, *result_format; jamie@56: xtract_unit_t *data_unit, *argv_unit, *result_unit; jamie@108: xtract_bool_t *is_scalar, *is_delta; jamie@56: xtract_function_descriptor_t *fd, *d; jamie@56: xtract_type_t *argv_type; jamie@52: jamie@50: f = F = XTRACT_FEATURES; jamie@50: jamie@56: fd = malloc(XTRACT_FEATURES * sizeof(xtract_function_descriptor_t)); jamie@50: jamie@55: /* FIX - this file probably needs a rewrite for readability */ jamie@51: jamie@50: while(f--){ jamie@51: jamie@108: d = &fd[f]; jamie@110: d->id = f; jamie@108: argc = &d->argc; jamie@108: argv_type = &d->argv.type; jamie@51: jamie@108: argv_min = &d->argv.min[0]; jamie@108: argv_max = &d->argv.max[0]; jamie@108: argv_def = &d->argv.def[0]; jamie@108: argv_unit = &d->argv.unit[0]; jamie@55: jamie@108: switch (f) { jamie@108: /* argc = 1 */ jamie@108: case XTRACT_VARIANCE: jamie@108: case XTRACT_SPECTRAL_VARIANCE: jamie@108: case XTRACT_STANDARD_DEVIATION: jamie@108: case XTRACT_DIFFERENCE_VECTOR: jamie@108: case XTRACT_AVERAGE_DEVIATION: jamie@108: case XTRACT_SPECTRAL_STANDARD_DEVIATION: jamie@108: case XTRACT_SPECTRAL_AVERAGE_DEVIATION: jamie@108: case XTRACT_LOWEST_VALUE: jamie@108: case XTRACT_TONALITY: jamie@108: case XTRACT_MFCC: jamie@108: case XTRACT_LPC: jamie@108: case XTRACT_LPCC: jamie@108: *argv_min = XTRACT_ANY; jamie@108: *argv_max = XTRACT_ANY; jamie@108: *argv_def = XTRACT_ANY; jamie@108: *argv_unit = XTRACT_ANY; jamie@104: break; jamie@108: case XTRACT_SPECTRAL_INHARMONICITY: jamie@108: *argv_min = 0.f; jamie@108: *argv_max = XTRACT_SR_UPPER_LIMIT / 2; jamie@108: *argv_def = XTRACT_FUNDAMENTAL_DEFAULT; jamie@108: *argv_unit = XTRACT_HERTZ; jamie@104: break; jamie@108: case XTRACT_F0: jamie@108: case XTRACT_FAILSAFE_F0: jamie@108: *argv_min = XTRACT_SR_LOWER_LIMIT; jamie@108: *argv_max = XTRACT_SR_UPPER_LIMIT; jamie@108: *argv_def = XTRACT_SR_DEFAULT; jamie@108: *argv_unit = XTRACT_HERTZ; jamie@104: break; jamie@108: /* argc = 2 */; jamie@108: case XTRACT_ROLLOFF: jamie@108: *argv_min = XTRACT_FFT_BANDS_MIN; jamie@108: *argv_max = XTRACT_FFT_BANDS_MAX; jamie@108: *argv_def = XTRACT_SPEC_BW_DEF ; jamie@108: *argv_unit = XTRACT_HERTZ; jamie@108: *(argv_min + 1) = 0.f; jamie@108: *(argv_max + 1) = 100.f; jamie@108: *(argv_def + 1) = 95.f; jamie@108: *(argv_unit + 1) = XTRACT_PERCENT; jamie@104: break; jamie@108: case XTRACT_SPECTRUM: jamie@108: *argv_min = XTRACT_SR_LOWER_LIMIT / XTRACT_FFT_BANDS_MIN; jamie@108: *argv_max = XTRACT_SR_UPPER_LIMIT / XTRACT_FFT_BANDS_MAX; jamie@108: *argv_def = XTRACT_SR_DEFAULT / XTRACT_FFT_BANDS_DEF; jamie@108: *argv_unit = XTRACT_HERTZ; jamie@108: *(argv_min + 1) = 0; jamie@108: *(argv_max + 1) = 3 ; jamie@108: *(argv_def + 1) = 0; jamie@108: *(argv_unit + 1) = XTRACT_NONE; jamie@105: *(argv_min + 2) = 0; jamie@105: *(argv_max + 2) = 1; jamie@105: *(argv_def + 2) = 0; jamie@108: *(argv_unit + 2) = XTRACT_NONE; jamie@105: *(argv_min + 3) = 0; jamie@105: *(argv_max + 3) = 1; jamie@105: *(argv_def + 3) = 0; jamie@108: *(argv_unit + 3) = XTRACT_NONE; jamie@104: break; jamie@108: case XTRACT_PEAK_SPECTRUM: jamie@108: *argv_min = XTRACT_SR_LOWER_LIMIT / 2; jamie@108: *argv_max = XTRACT_SR_UPPER_LIMIT / 2; jamie@108: *argv_def = XTRACT_SR_DEFAULT / 2; jamie@108: *argv_unit = XTRACT_HERTZ; jamie@108: *(argv_min + 1) = 0.f; jamie@108: *(argv_max + 1) = 100.f ; jamie@108: *(argv_def + 1) = 10.f ; jamie@108: *(argv_unit + 1) = XTRACT_PERCENT; jamie@104: break; jamie@108: case XTRACT_HARMONIC_SPECTRUM: jamie@108: *argv_min = 0.f; jamie@108: *argv_max = XTRACT_SR_UPPER_LIMIT / 2; jamie@108: *argv_def = XTRACT_FUNDAMENTAL_DEFAULT; jamie@108: *argv_unit = XTRACT_HERTZ; jamie@108: *(argv_min + 1) = 0.f; jamie@108: *(argv_max + 1) = 1.f ; jamie@108: *(argv_def + 1) = .1f ; jamie@108: *(argv_unit + 1) = XTRACT_NONE; jamie@104: break; jamie@108: case XTRACT_NOISINESS: jamie@108: case XTRACT_SKEWNESS: jamie@108: case XTRACT_KURTOSIS: jamie@108: case XTRACT_SPECTRAL_SKEWNESS: jamie@108: case XTRACT_SPECTRAL_KURTOSIS: jamie@108: case XTRACT_CREST: jamie@108: *argv_min = XTRACT_NONE; jamie@108: *argv_max = XTRACT_NONE; jamie@108: *argv_def = XTRACT_NONE; jamie@108: *argv_unit = XTRACT_NONE; jamie@108: *(argv_min + 1) = XTRACT_NONE; jamie@108: *(argv_max + 1) = XTRACT_NONE; jamie@108: *(argv_def + 1) = XTRACT_NONE; jamie@108: *(argv_unit + 1) = XTRACT_NONE; jamie@104: break; jamie@108: case XTRACT_BARK_COEFFICIENTS: jamie@108: /* BARK_COEFFICIENTS is special because argc = BARK_BANDS */ jamie@108: case XTRACT_WINDOWED: jamie@108: /* WINDOWED is special because argc = window size = N */ jamie@108: default: jamie@108: *argv_min = XTRACT_NONE; jamie@108: *argv_max = XTRACT_NONE; jamie@108: *argv_def = XTRACT_NONE; jamie@108: *argv_unit = XTRACT_NONE; jamie@104: break; jamie@108: } jamie@55: jamie@108: argv_donor = &d->argv.donor[0]; jamie@55: jamie@108: switch (f) { jamie@108: /* argc = 1 */ jamie@108: case XTRACT_VARIANCE: jamie@108: *argv_donor = XTRACT_MEAN; jamie@108: break; jamie@108: case XTRACT_SPECTRAL_VARIANCE: jamie@108: *argv_donor = XTRACT_SPECTRAL_MEAN; jamie@108: break; jamie@108: case XTRACT_STANDARD_DEVIATION: jamie@108: *argv_donor = XTRACT_VARIANCE; jamie@108: break; jamie@108: case XTRACT_AVERAGE_DEVIATION: jamie@108: *argv_donor = XTRACT_MEAN; jamie@108: break; jamie@108: case XTRACT_SPECTRAL_STANDARD_DEVIATION: jamie@108: *argv_donor = XTRACT_SPECTRAL_VARIANCE; jamie@108: break; jamie@108: case XTRACT_SPECTRAL_AVERAGE_DEVIATION: jamie@108: *argv_donor = XTRACT_SPECTRAL_MEAN; jamie@108: break; jamie@108: case XTRACT_SPECTRAL_INHARMONICITY: jamie@108: *argv_donor = XTRACT_FAILSAFE_F0; jamie@108: break; jamie@108: case XTRACT_TONALITY: jamie@108: *argv_donor = XTRACT_FLATNESS; jamie@108: break; jamie@108: case XTRACT_LOWEST_VALUE: jamie@108: case XTRACT_F0: jamie@108: case XTRACT_FAILSAFE_F0: jamie@108: *argv_donor = XTRACT_ANY; jamie@108: break; jamie@108: case XTRACT_MFCC: jamie@108: *argv_donor = XTRACT_INIT_MFCC; jamie@108: break; jamie@108: /* argc = 2 */; jamie@108: case XTRACT_ROLLOFF: jamie@108: case XTRACT_PEAK_SPECTRUM: jamie@106: case XTRACT_FLUX: jamie@106: case XTRACT_LNORM: jamie@108: *argv_donor = XTRACT_ANY; jamie@108: *(argv_donor + 1) = XTRACT_ANY; jamie@108: break; jamie@108: case XTRACT_SKEWNESS: jamie@108: case XTRACT_KURTOSIS: jamie@108: *argv_donor = XTRACT_MEAN; jamie@108: *(argv_donor + 1) = XTRACT_STANDARD_DEVIATION; jamie@108: break; jamie@108: case XTRACT_SPECTRAL_SKEWNESS: jamie@108: case XTRACT_SPECTRAL_KURTOSIS: jamie@108: *argv_donor = XTRACT_SPECTRAL_MEAN; jamie@108: *(argv_donor + 1) = XTRACT_SPECTRAL_STANDARD_DEVIATION; jamie@108: break; jamie@108: case XTRACT_HARMONIC_SPECTRUM: jamie@108: *argv_donor = XTRACT_FAILSAFE_F0; jamie@108: *(argv_donor + 1) = XTRACT_ANY; jamie@108: break; jamie@108: case XTRACT_NOISINESS: jamie@108: *argv_donor = XTRACT_SUM; jamie@108: *(argv_donor + 1) = XTRACT_SUM; jamie@108: break; jamie@108: case XTRACT_CREST: jamie@108: *argv_donor = XTRACT_HIGHEST_VALUE; jamie@108: *(argv_donor + 1) = XTRACT_MEAN; jamie@108: break; jamie@108: /* argc = 4 */ jamie@108: case XTRACT_SPECTRUM: jamie@108: *argv_donor = XTRACT_ANY; jamie@108: *(argv_donor + 1) = XTRACT_ANY; jamie@108: *(argv_donor + 2) = XTRACT_ANY; jamie@108: *(argv_donor + 3) = XTRACT_ANY; jamie@108: break; jamie@108: /* BARK_BANDS */ jamie@108: case XTRACT_BARK_COEFFICIENTS: jamie@108: *argv_donor = XTRACT_INIT_BARK; jamie@108: break; jamie@108: case XTRACT_WINDOWED: jamie@108: *argv_donor = XTRACT_INIT_WINDOWED; jamie@108: break; jamie@108: default: jamie@108: *argv_donor = XTRACT_ANY; jamie@108: break; jamie@108: } jamie@51: jamie@54: data_format = &d->data.format; jamie@54: jamie@108: switch(f){ jamie@54: jamie@108: case XTRACT_MEAN: jamie@108: case XTRACT_VARIANCE: jamie@108: case XTRACT_STANDARD_DEVIATION: jamie@108: case XTRACT_AVERAGE_DEVIATION: jamie@108: case XTRACT_SKEWNESS: jamie@108: case XTRACT_KURTOSIS: jamie@108: case XTRACT_LOWEST_VALUE: jamie@108: case XTRACT_HIGHEST_VALUE: jamie@108: case XTRACT_SUM: jamie@108: case XTRACT_WINDOWED: jamie@108: *data_format = XTRACT_ARBITRARY_SERIES; jamie@108: break; jamie@108: case XTRACT_SPECTRAL_MEAN: jamie@108: case XTRACT_SPECTRAL_VARIANCE: jamie@108: case XTRACT_SPECTRAL_STANDARD_DEVIATION: jamie@108: case XTRACT_SPECTRAL_AVERAGE_DEVIATION: jamie@108: case XTRACT_SPECTRAL_SKEWNESS: jamie@108: case XTRACT_SPECTRAL_KURTOSIS: jamie@108: case XTRACT_SPECTRAL_CENTROID: jamie@108: case XTRACT_SPECTRAL_SLOPE: jamie@108: *data_format = XTRACT_SPECTRAL; jamie@108: break; jamie@108: case XTRACT_ROLLOFF: jamie@108: case XTRACT_NOISINESS: jamie@108: case XTRACT_BARK_COEFFICIENTS: jamie@108: case XTRACT_CREST: jamie@108: case XTRACT_IRREGULARITY_K: jamie@108: case XTRACT_IRREGULARITY_J: jamie@108: case XTRACT_SMOOTHNESS: jamie@108: case XTRACT_FLATNESS: jamie@108: case XTRACT_SPREAD: jamie@108: case XTRACT_POWER: jamie@108: case XTRACT_HPS: jamie@108: case XTRACT_PEAK_SPECTRUM: jamie@108: case XTRACT_MFCC: jamie@108: *data_format = XTRACT_SPECTRAL_MAGNITUDES; jamie@108: break; jamie@104: case XTRACT_LPC: jamie@104: *data_format = XTRACT_AUTOCORRELATION_COEFFS; jamie@104: break; jamie@104: case XTRACT_LPCC: jamie@104: *data_format = XTRACT_LPC_COEFFS; jamie@104: break; jamie@108: case XTRACT_SPECTRAL_INHARMONICITY: jamie@108: case XTRACT_HARMONIC_SPECTRUM: jamie@108: *data_format = XTRACT_SPECTRAL_PEAKS; jamie@108: break; jamie@108: case XTRACT_NONZERO_COUNT: jamie@108: *data_format = XTRACT_SPECTRAL_PEAKS_MAGNITUDES; jamie@108: break; jamie@108: case XTRACT_F0: jamie@108: case XTRACT_FAILSAFE_F0: jamie@108: case XTRACT_SPECTRUM: jamie@108: case XTRACT_AUTOCORRELATION: jamie@108: case XTRACT_AUTOCORRELATION_FFT: jamie@108: case XTRACT_DCT: jamie@108: case XTRACT_AMDF: jamie@108: case XTRACT_ASDF: jamie@108: case XTRACT_ZCR: jamie@108: case XTRACT_RMS_AMPLITUDE: jamie@108: case XTRACT_FLUX: jamie@108: case XTRACT_LNORM: jamie@108: *data_format = XTRACT_AUDIO_SAMPLES; jamie@108: break; jamie@108: case XTRACT_TONALITY: jamie@108: *data_format = XTRACT_NO_DATA; jamie@108: break; jamie@108: case XTRACT_TRISTIMULUS_1: jamie@108: case XTRACT_TRISTIMULUS_2: jamie@108: case XTRACT_TRISTIMULUS_3: jamie@108: case XTRACT_ODD_EVEN_RATIO: jamie@108: *data_format = XTRACT_SPECTRAL_HARMONICS_MAGNITUDES; jamie@108: break; jamie@108: case XTRACT_LOUDNESS: jamie@108: case XTRACT_SHARPNESS: jamie@108: *data_format = XTRACT_BARK_COEFFS; jamie@108: break; jamie@108: case XTRACT_DIFFERENCE_VECTOR: jamie@108: *data_format = XTRACT_SUBFRAMES; jamie@108: break; jamie@108: case XTRACT_ATTACK_TIME: jamie@108: case XTRACT_DECAY_TIME: jamie@108: default: jamie@108: *data_format = XTRACT_NO_DATA; jamie@108: break; jamie@108: } jamie@54: jamie@55: data_unit = &d->data.unit; jamie@55: jamie@108: switch(f){ jamie@55: jamie@108: case XTRACT_MEAN: jamie@108: case XTRACT_VARIANCE: jamie@108: case XTRACT_STANDARD_DEVIATION: jamie@108: case XTRACT_AVERAGE_DEVIATION: jamie@108: case XTRACT_SKEWNESS: jamie@108: case XTRACT_KURTOSIS: jamie@108: case XTRACT_LOWEST_VALUE: jamie@108: case XTRACT_HIGHEST_VALUE: jamie@108: case XTRACT_SUM: jamie@108: case XTRACT_ZCR: jamie@108: case XTRACT_PEAK_SPECTRUM: jamie@108: case XTRACT_TRISTIMULUS_1: jamie@108: case XTRACT_TRISTIMULUS_2: jamie@108: case XTRACT_TRISTIMULUS_3: jamie@108: case XTRACT_DCT: jamie@108: case XTRACT_AMDF: jamie@108: case XTRACT_ASDF: jamie@108: case XTRACT_IRREGULARITY_K: jamie@108: case XTRACT_IRREGULARITY_J: jamie@108: case XTRACT_ATTACK_TIME: jamie@108: case XTRACT_DECAY_TIME: jamie@108: case XTRACT_DIFFERENCE_VECTOR: jamie@108: case XTRACT_FLUX: jamie@108: case XTRACT_LNORM: jamie@108: case XTRACT_F0: jamie@108: case XTRACT_FAILSAFE_F0: jamie@108: case XTRACT_MFCC: jamie@108: case XTRACT_AUTOCORRELATION: jamie@108: case XTRACT_AUTOCORRELATION_FFT: jamie@108: case XTRACT_ROLLOFF: jamie@108: case XTRACT_NOISINESS: jamie@108: case XTRACT_CREST: jamie@108: case XTRACT_FLATNESS: jamie@108: case XTRACT_POWER: jamie@108: case XTRACT_BARK_COEFFICIENTS: jamie@108: case XTRACT_RMS_AMPLITUDE: jamie@108: case XTRACT_SMOOTHNESS: jamie@108: case XTRACT_SPREAD: jamie@108: case XTRACT_SHARPNESS: jamie@108: case XTRACT_HPS: jamie@108: case XTRACT_SPECTRUM: jamie@108: case XTRACT_TONALITY: jamie@108: case XTRACT_LOUDNESS: jamie@108: case XTRACT_NONZERO_COUNT: jamie@104: case XTRACT_LPC: jamie@104: case XTRACT_LPCC: jamie@108: case XTRACT_WINDOWED: jamie@108: *data_unit = XTRACT_ANY; jamie@108: break; jamie@108: case XTRACT_SPECTRAL_MEAN: jamie@108: case XTRACT_SPECTRAL_VARIANCE: jamie@108: case XTRACT_SPECTRAL_STANDARD_DEVIATION: jamie@108: case XTRACT_SPECTRAL_AVERAGE_DEVIATION: jamie@108: case XTRACT_SPECTRAL_SKEWNESS: jamie@108: case XTRACT_SPECTRAL_KURTOSIS: jamie@108: case XTRACT_SPECTRAL_CENTROID: jamie@108: case XTRACT_SPECTRAL_SLOPE: jamie@108: case XTRACT_HARMONIC_SPECTRUM: jamie@108: case XTRACT_SPECTRAL_INHARMONICITY: jamie@108: *data_unit = XTRACT_ANY_AMPLITUDE_HERTZ; jamie@108: break; jamie@108: case XTRACT_ODD_EVEN_RATIO: jamie@108: *data_unit = XTRACT_HERTZ; jamie@108: break; jamie@108: } jamie@55: jamie@108: name = d->algo.name; jamie@108: p_name = d->algo.p_name; jamie@108: desc = d->algo.desc; jamie@108: p_desc = d->algo.p_desc; jamie@108: author = d->algo.author; jamie@108: year = &d->algo.year; jamie@51: jamie@108: strcpy(author, ""); jamie@108: *year = 0; jamie@51: jamie@108: switch(f){ jamie@108: case XTRACT_MEAN: jamie@108: strcpy(name, "mean"); jamie@108: strcpy(p_name, "Mean"); jamie@108: strcpy(desc, "Extract the mean of an input vector"); jamie@108: strcpy(p_desc, "Extract the mean of a range of values"); jamie@108: strcpy(author, ""); jamie@108: d->argv.type = XTRACT_NONE; jamie@108: break; jamie@108: case XTRACT_VARIANCE: jamie@108: strcpy(name, "variance"); jamie@108: strcpy(p_name, "Variance"); jamie@108: strcpy(desc, "Extract the variance of an input vector"); jamie@108: strcpy(p_desc, "Extract the variance of a range of values"); jamie@108: strcpy(author, ""); jamie@108: break; jamie@108: case XTRACT_STANDARD_DEVIATION: jamie@108: strcpy(name, "standard_deviation"); jamie@108: strcpy(p_name, "Standard Deviation"); jamie@108: strcpy(desc, jamie@108: "Extract the standard deviation of an input vector"); jamie@108: strcpy(p_desc, jamie@108: "Extract the standard deviation of a range of values"); jamie@108: strcpy(author, ""); jamie@108: break; jamie@108: case XTRACT_AVERAGE_DEVIATION: jamie@108: strcpy(name, "average_deviation"); jamie@108: strcpy(p_name, "Average Deviation"); jamie@108: strcpy(desc, jamie@108: "Extract the average deviation of an input vector"); jamie@108: strcpy(p_desc, jamie@108: "Extract the average deviation of a range of values"); jamie@108: strcpy(author, ""); jamie@108: break; jamie@108: case XTRACT_SKEWNESS: jamie@108: strcpy(name, "skewness"); jamie@108: strcpy(p_name, "Skewness"); jamie@108: strcpy(desc, jamie@108: "Extract the skewness of an input vector"); jamie@108: strcpy(p_desc, jamie@108: "Extract the skewness of a range of values"); jamie@108: strcpy(author, ""); jamie@108: break; jamie@108: case XTRACT_KURTOSIS: jamie@108: strcpy(name, "kurtosis"); jamie@108: strcpy(p_name, "Kurtosis"); jamie@108: strcpy(desc, jamie@108: "Extract the kurtosis of an input vector"); jamie@108: strcpy(p_desc, jamie@108: "Extract the kurtosis of a range of values"); jamie@108: strcpy(author, ""); jamie@108: break; jamie@108: case XTRACT_SPECTRAL_MEAN: jamie@108: strcpy(name, "spectral_mean"); jamie@108: strcpy(p_name, "Spectral Mean"); jamie@108: strcpy(desc, "Extract the mean of an input spectrum"); jamie@108: strcpy(p_desc, "Extract the mean of an audio spectrum"); jamie@108: strcpy(author, ""); jamie@108: break; jamie@108: case XTRACT_SPECTRAL_VARIANCE: jamie@108: strcpy(name, "spectral_variance"); jamie@108: strcpy(p_name, "Spectral Variance"); jamie@108: strcpy(desc, "Extract the variance of an input spectrum"); jamie@108: strcpy(p_desc, "Extract the variance of an audio spectrum"); jamie@108: strcpy(author, ""); jamie@108: break; jamie@108: case XTRACT_SPECTRAL_STANDARD_DEVIATION: jamie@108: strcpy(name, "spectral_standard_deviation"); jamie@108: strcpy(p_name, "Spectral Standard Deviation"); jamie@108: strcpy(desc, jamie@108: "Extract the standard deviation of an input spectrum"); jamie@108: strcpy(p_desc, jamie@108: "Extract the standard deviation of an audio spectrum"); jamie@108: strcpy(author, ""); jamie@108: break; jamie@108: case XTRACT_SPECTRAL_AVERAGE_DEVIATION: jamie@108: strcpy(name, "spectral_average_deviation"); jamie@108: strcpy(p_name, "Spectral Average Deviation"); jamie@108: strcpy(desc, jamie@108: "Extract the average deviation of an input spectrum"); jamie@108: strcpy(p_desc, jamie@108: "Extract the average deviation of an audio spectrum"); jamie@108: strcpy(author, ""); jamie@108: break; jamie@108: case XTRACT_ROLLOFF: jamie@110: strcpy(name, "rolloff"); jamie@108: strcpy(p_name, "Spectral Rolloff"); jamie@108: strcpy(desc, jamie@108: "Extract the rolloff point of a spectrum"); jamie@108: strcpy(p_desc, jamie@108: "Extract the rolloff point of an audio spectrum"); jamie@108: strcpy(author, "Bee Suan Ong"); jamie@108: *year = 2005; jamie@108: break; jamie@108: case XTRACT_SPECTRAL_INHARMONICITY: jamie@108: strcpy(name, "spectral_inharmonicity"); jamie@108: strcpy(p_name, "Inharmonicity"); jamie@108: strcpy(desc, "Extract the inharmonicity of a spectrum"); jamie@108: strcpy(p_desc, jamie@108: "Extract the inharmonicity of an audio spectrum"); jamie@108: break; jamie@108: case XTRACT_SPECTRUM: jamie@108: strcpy(name, "spectrum"); jamie@108: strcpy(p_name, "Spectrum"); jamie@108: strcpy(desc, jamie@108: "Extract the spectrum of an input vector"); jamie@108: strcpy(p_desc, jamie@108: "Extract the spectrum of an audio signal"); jamie@108: strcpy(author, ""); jamie@108: break; jamie@108: case XTRACT_ODD_EVEN_RATIO: jamie@108: strcpy(name, "odd_even_ratio"); jamie@113: strcpy(p_name, "Odd/even Harmonic Ratio"); jamie@108: strcpy(desc, jamie@108: "Extract the odd-to-even harmonic ratio of a spectrum"); jamie@108: strcpy(p_desc, jamie@108: "Extract the odd-to-even harmonic ratio of an audio spectrum"); jamie@108: strcpy(author, ""); jamie@108: break; jamie@108: case XTRACT_LOWEST_VALUE: jamie@108: strcpy(name, "lowest_value"); jamie@108: strcpy(p_name, "Lowest Value"); jamie@108: strcpy(desc, "Extract the lowest value from an input vector"); jamie@108: strcpy(p_desc, "Extract the lowest value from a given range"); jamie@108: strcpy(author, ""); jamie@108: break; jamie@108: case XTRACT_F0: jamie@108: strcpy(name, "f0"); jamie@108: strcpy(p_name, "Fundamental Frequency"); jamie@108: strcpy(desc, "Extract the fundamental frequency of a signal"); jamie@108: strcpy(p_desc, jamie@108: "Extract the fundamental frequency of an audio signal"); jamie@108: strcpy(author, "Jamie Bullock"); jamie@108: break; jamie@108: case XTRACT_FAILSAFE_F0: jamie@108: strcpy(name, "failsafe_f0"); jamie@108: strcpy(p_name, "Fundamental Frequency (failsafe)"); jamie@108: strcpy(desc, "Extract the fundamental frequency of a signal (failsafe)"); jamie@108: strcpy(p_desc, jamie@108: "Extract the fundamental frequency of an audio signal (failsafe)"); jamie@108: strcpy(author, "Jamie Bullock"); jamie@108: break; jamie@108: case XTRACT_TONALITY: jamie@108: strcpy(name, "tonality"); jamie@108: strcpy(p_name, "Tonality"); jamie@108: strcpy(desc, "Extract the tonality of a spectrum"); jamie@108: strcpy(p_desc, "Extract the tonality an audio spectrum"); jamie@108: strcpy(author, "J. D. Johnston"); jamie@108: *year = 1988; jamie@108: break; jamie@108: case XTRACT_SPECTRAL_SKEWNESS: jamie@108: strcpy(name, "spectral_skewness"); jamie@108: strcpy(p_name, "Spectral Skewness"); jamie@108: strcpy(desc, "Extract the skewness of an input spectrum"); jamie@108: strcpy(p_desc, "Extract the skewness of an audio spectrum"); jamie@108: strcpy(author, ""); jamie@108: break; jamie@108: case XTRACT_SPECTRAL_KURTOSIS: jamie@108: strcpy(name, "spectral_kurtosis"); jamie@108: strcpy(p_name, "Spectral Kurtosis"); jamie@108: strcpy(desc, "Extract the kurtosis of an input spectrum"); jamie@108: strcpy(p_desc, "Extract the kurtosis of an audio spectrum"); jamie@108: strcpy(author, ""); jamie@108: break; jamie@108: case XTRACT_PEAK_SPECTRUM: jamie@108: strcpy(name, "peak_spectrum"); jamie@108: strcpy(p_name, "Peak Spectrum"); jamie@108: strcpy(desc, "Extract the spectral peaks from of a spectrum"); jamie@108: strcpy(p_desc, jamie@108: "Extract the spectral peaks from an audio spectrum"); jamie@108: strcpy(author, ""); jamie@108: break; jamie@108: case XTRACT_HARMONIC_SPECTRUM: jamie@108: strcpy(name, "harmonic_spectrum"); jamie@108: strcpy(p_name, "Harmonic Spectrum"); jamie@108: strcpy(desc, "Extract the harmonics from a spectrum"); jamie@108: strcpy(p_desc, "Extract the harmonics from an audio spectrum"); jamie@108: strcpy(author, ""); jamie@108: break; jamie@108: case XTRACT_NOISINESS: jamie@108: strcpy(name, "noisiness"); jamie@108: strcpy(p_name, "Noisiness"); jamie@108: strcpy(desc, "Extract the noisiness of a spectrum"); jamie@108: strcpy(p_desc, "Extract the noisiness of an audio spectrum"); jamie@108: strcpy(author, "Tae Hong Park"); jamie@108: *year = 2000; jamie@108: break; jamie@108: case XTRACT_CREST: jamie@108: strcpy(name, "crest"); jamie@108: strcpy(p_name, "Spectral Crest Measure"); jamie@108: strcpy(desc, jamie@108: "Extract the spectral crest measure of a spectrum"); jamie@108: strcpy(p_desc, jamie@108: "Extract the spectral crest measure of an audio spectrum"); jamie@108: strcpy(author, "Peeters"); jamie@108: *year = 2003; jamie@108: break; jamie@108: case XTRACT_MFCC: jamie@108: strcpy(name, "mfcc"); jamie@108: strcpy(p_name, "Mel-Frequency Cepstral Coefficients"); jamie@108: strcpy(desc, "Extract MFCC from a spectrum"); jamie@108: strcpy(p_desc, "Extract MFCC from an audio spectrum"); jamie@108: strcpy(author, "Rabiner"); jamie@104: break; jamie@104: case XTRACT_LPC: jamie@108: strcpy(name, "lpc"); jamie@108: strcpy(p_name, "Linear predictive coding coefficients"); jamie@108: strcpy(desc, "Extract LPC from autocorrelation coefficients"); jamie@108: strcpy(p_desc, jamie@104: "Extract LPC from autocorrelation coefficients"); jamie@108: strcpy(author, jamie@104: "Rabiner and Juang as implemented by Jutta Degener"); jamie@104: *year = 1994; jamie@104: break; jamie@104: case XTRACT_LPCC: jamie@108: strcpy(name, "lpcc"); jamie@108: strcpy(p_name, "Linear predictive coding cepstral coefficients"); jamie@108: strcpy(desc, "Extract LPC cepstrum from LPC coefficients"); jamie@108: strcpy(p_desc, jamie@104: "Extract LPC cepstrum from LPC coefficients"); jamie@108: strcpy(author, "Rabiner and Juang"); jamie@104: *year = 1993; jamie@108: break; jamie@108: case XTRACT_BARK_COEFFICIENTS: jamie@108: strcpy(name, "bark_coefficients"); jamie@108: strcpy(p_name, "Bark Coefficients"); jamie@108: strcpy(desc, "Extract bark coefficients from a spectrum"); jamie@108: strcpy(p_desc, jamie@108: "Extract bark coefficients from an audio spectrum"); jamie@108: strcpy(author, ""); jamie@108: break; jamie@108: case XTRACT_SPECTRAL_CENTROID: jamie@108: strcpy(name, "spectral_centroid"); jamie@108: strcpy(p_name, "Spectral Centroid"); jamie@108: strcpy(desc, "Extract the spectral centroid of a spectrum"); jamie@108: strcpy(p_desc, jamie@108: "Extract the spectral centroid of an audio spectrum"); jamie@108: strcpy(author, ""); jamie@108: break; jamie@108: case XTRACT_IRREGULARITY_K: jamie@108: strcpy(name, "irregularity_k"); jamie@108: strcpy(p_name, "Irregularity I"); jamie@108: strcpy(desc, "Extract the irregularity (type I) of a spectrum"); jamie@108: strcpy(p_desc, jamie@108: "Extract the irregularity (type I) of an audio spectrum"); jamie@108: strcpy(author, "Krimphoff"); jamie@108: *year = 1994; jamie@108: break; jamie@108: case XTRACT_IRREGULARITY_J: jamie@108: strcpy(name, "irregularity_j"); jamie@108: strcpy(p_name, "Irregularity II"); jamie@108: strcpy(desc, "Extract the irregularity (type II) of a spectrum"); jamie@108: strcpy(p_desc, jamie@108: "Extract the irregularity (type II) of an audio spectrum"); jamie@108: strcpy(author, "Jensen"); jamie@108: *year = 1999; jamie@108: break; jamie@108: case XTRACT_TRISTIMULUS_1: jamie@108: strcpy(name, "tristimulus_1"); jamie@108: strcpy(p_name, "Tristimulus I"); jamie@108: strcpy(desc, "Extract the tristimulus (type I) of a spectrum"); jamie@108: strcpy(p_desc, jamie@108: "Extract the tristimulus (type I) of an audio spectrum"); jamie@108: strcpy(author, "Pollard and Jansson"); jamie@108: *year = 1982; jamie@108: break; jamie@108: case XTRACT_TRISTIMULUS_2: jamie@108: strcpy(name, "tristimulus_2"); jamie@108: strcpy(p_name, "Tristimulus II"); jamie@108: strcpy(desc, "Extract the tristimulus (type II) of a spectrum"); jamie@108: strcpy(p_desc, jamie@108: "Extract the tristimulus (type II) of an audio spectrum"); jamie@108: strcpy(author, "Pollard and Jansson"); jamie@108: *year = 1982; jamie@108: break; jamie@108: case XTRACT_TRISTIMULUS_3: jamie@108: strcpy(name, "tristimulus_3"); jamie@108: strcpy(p_name, "Tristimulus III"); jamie@108: strcpy(desc, jamie@108: "Extract the tristimulus (type III) of a spectrum"); jamie@108: strcpy(p_desc, jamie@108: "Extract the tristimulus (type III) of an audio spectrum"); jamie@108: strcpy(author, "Pollard and Jansson"); jamie@108: *year = 1982; jamie@108: break; jamie@108: case XTRACT_SMOOTHNESS: jamie@108: strcpy(name, "smoothness"); jamie@108: strcpy(p_name, "Spectral Smoothness"); jamie@108: strcpy(desc, "Extract the spectral smoothness of a spectrum"); jamie@108: strcpy(p_desc, jamie@108: "Extract the spectral smoothness of an audio spectrum"); jamie@108: strcpy(author, "McAdams"); jamie@108: *year = 1999; jamie@108: break; jamie@108: case XTRACT_FLATNESS: jamie@108: strcpy(name, "flatness"); jamie@108: strcpy(p_name, "Spectral Flatness"); jamie@108: strcpy(desc, "Extract the spectral flatness of a spectrum"); jamie@108: strcpy(p_desc, jamie@108: "Extract the spectral flatness of an audio spectrum"); jamie@108: strcpy(author, "Tristan Jehan"); jamie@108: *year = 2005; jamie@108: break; jamie@108: case XTRACT_SPREAD: jamie@108: strcpy(name, "spread"); jamie@108: strcpy(p_name, "Spectral Spread"); jamie@108: strcpy(desc, "Extract the spectral spread of a spectrum"); jamie@108: strcpy(p_desc, jamie@108: "Extract the spectral spread of an audio spectrum"); jamie@108: strcpy(author, "Norman Casagrande"); jamie@108: *year = 2005; jamie@108: break; jamie@108: case XTRACT_ZCR: jamie@108: strcpy(name, "zcr"); jamie@108: strcpy(p_name, "Zero Crossing Rate"); jamie@108: strcpy(desc, "Extract the zero crossing rate of a vector"); jamie@108: strcpy(p_desc, jamie@108: "Extract the zero crossing rate of an audio signal"); jamie@108: strcpy(author, ""); jamie@108: break; jamie@108: case XTRACT_LOUDNESS: jamie@108: strcpy(name, "loudness"); jamie@108: strcpy(p_name, "Loudness"); jamie@108: strcpy(desc, jamie@108: "Extract the loudness of a signal from its spectrum"); jamie@108: strcpy(p_desc, jamie@108: "Extract the loudness of an audio signal from its spectrum"); jamie@108: strcpy(author, "Moore, Glasberg et al"); jamie@108: *year = 2005; jamie@108: break; jamie@108: case XTRACT_HIGHEST_VALUE: jamie@108: strcpy(name, "highest_value"); jamie@108: strcpy(p_name, "Highest Value"); jamie@108: strcpy(desc, "Extract the highest value from an input vector"); jamie@108: strcpy(p_desc, "Extract the highest value from a given range"); jamie@108: strcpy(author, ""); jamie@108: break; jamie@108: case XTRACT_SUM: jamie@108: strcpy(name, "sum"); jamie@108: strcpy(p_name, "Sum of Values"); jamie@108: strcpy(desc, jamie@108: "Extract the sum of the values in an input vector"); jamie@108: strcpy(p_desc, jamie@108: "Extract the sum of the values in a given range"); jamie@108: strcpy(author, ""); jamie@108: break; jamie@108: case XTRACT_RMS_AMPLITUDE: jamie@108: strcpy(name, "rms_amplitude"); jamie@108: strcpy(p_name, "RMS Amplitude"); jamie@108: strcpy(desc, "Extract the RMS amplitude of a signal"); jamie@108: strcpy(p_desc, "Extract the RMS amplitude of an audio signal"); jamie@108: strcpy(author, ""); jamie@108: break; jamie@108: case XTRACT_POWER: jamie@108: strcpy(name, "power"); jamie@108: strcpy(p_name, "Spectral Power"); jamie@108: strcpy(desc, "Extract the spectral power of a spectrum"); jamie@108: strcpy(p_desc, jamie@108: "Extract the spectral power of an audio spectrum"); jamie@108: strcpy(author, "Bee Suan Ong"); jamie@108: *year = 2005; jamie@108: break; jamie@108: case XTRACT_SHARPNESS: jamie@108: strcpy(name, "sharpness"); jamie@108: strcpy(p_name, "Spectral Sharpness"); jamie@108: strcpy(desc, "Extract the spectral sharpness of a spectrum"); jamie@108: strcpy(p_desc, jamie@108: "Extract the spectral sharpness of an audio spectrum"); jamie@108: strcpy(author, ""); jamie@108: break; jamie@108: case XTRACT_SPECTRAL_SLOPE: jamie@108: strcpy(name, "spectral_slope"); jamie@108: strcpy(p_name, "Spectral Slope"); jamie@108: strcpy(desc, "Extract the spectral slope of a spectrum"); jamie@108: strcpy(p_desc, jamie@108: "Extract the spectral slope of an audio spectrum"); jamie@108: strcpy(author, ""); jamie@108: break; jamie@108: case XTRACT_HPS: jamie@108: strcpy(name, "hps"); jamie@108: strcpy(p_name, "Harmonic Product Spectrum"); jamie@108: strcpy(desc, jamie@108: "Extract the harmonic product spectrum of a spectrum"); jamie@108: strcpy(p_desc, jamie@108: "Extract the harmonic product spectrum of an audio spectrum"); jamie@108: strcpy(author, ""); jamie@108: break; jamie@108: case XTRACT_FLUX: jamie@108: strcpy(name, "flux"); jamie@108: strcpy(p_name, "Spectral Flux"); jamie@108: strcpy(desc, "Extract the spectral flux of a spectrum"); jamie@108: strcpy(p_desc, jamie@108: "Extract the spectral flux of an audio spectrum"); jamie@108: strcpy(author, ""); jamie@108: break; jamie@106: case XTRACT_LNORM: jamie@108: strcpy(name, "lnorm"); jamie@108: strcpy(p_name, "L-norm"); jamie@108: strcpy(desc, "Extract the L-norm of a vector"); jamie@108: strcpy(p_desc, "Extract the L-norm of a vector"); jamie@108: strcpy(author, ""); jamie@108: break; jamie@108: case XTRACT_ATTACK_TIME: jamie@108: strcpy(name, "attack_time"); jamie@108: strcpy(p_name, "Attack Time"); jamie@108: strcpy(desc, "Extract the attack time of a signal"); jamie@108: strcpy(p_desc, "Extract the attack time of an audio signal"); jamie@108: strcpy(author, ""); jamie@108: break; jamie@108: case XTRACT_DECAY_TIME: jamie@108: strcpy(name, "decay_time"); jamie@108: strcpy(p_name, "Decay Time"); jamie@108: strcpy(desc, "Extract the decay time of a signal"); jamie@108: strcpy(p_desc, "Extract the decay time of an audio signal"); jamie@108: strcpy(author, ""); jamie@108: break; jamie@108: case XTRACT_DIFFERENCE_VECTOR: jamie@108: strcpy(name, "difference_vector"); jamie@108: strcpy(p_name, "Difference vector"); jamie@108: strcpy(desc, "Extract the difference between two vectors"); jamie@108: strcpy(p_desc, "Extract the difference between two vectors"); jamie@108: strcpy(author, ""); jamie@108: break; jamie@108: case XTRACT_AUTOCORRELATION_FFT: jamie@108: strcpy(name, "autocorrelation_fft"); jamie@108: strcpy(p_name, "Autocorrelation (FFT method)"); jamie@108: strcpy(desc, "Extract the autocorrelation of a signal (fft method)"); jamie@108: strcpy(p_desc, "Extract the autocorrelation of an audio signal (fft method)"); jamie@108: strcpy(author, ""); jamie@108: break; jamie@108: case XTRACT_DCT: jamie@108: strcpy(name, "dct"); jamie@108: strcpy(p_name, "Discrete Cosine Transform"); jamie@108: strcpy(desc, "Extract the DCT of a signal"); jamie@108: strcpy(p_desc, "Extract the DCT of an audio signal"); jamie@108: strcpy(author, ""); jamie@108: break; jamie@108: case XTRACT_AUTOCORRELATION: jamie@108: strcpy(name, "autocorrelation"); jamie@108: strcpy(p_name, "Autocorrelation"); jamie@108: strcpy(desc, "Extract the autocorrelation of a signal"); jamie@108: strcpy(p_desc, jamie@108: "Extract the autocorrelation of an audio signal"); jamie@108: strcpy(author, ""); jamie@108: break; jamie@108: case XTRACT_AMDF: jamie@108: strcpy(name, "amdf"); jamie@108: strcpy(p_name, "Average Magnitude Difference Function"); jamie@108: strcpy(desc, "Extract the AMDF of a signal"); jamie@108: strcpy(p_desc, "Extract the AMDF of an audio signal"); jamie@108: strcpy(author, ""); jamie@108: break; jamie@108: case XTRACT_ASDF: jamie@108: strcpy(name, "asdf"); jamie@108: strcpy(p_name, "Average Squared Difference Function"); jamie@108: strcpy(desc, "Extract the ASDF of a signal"); jamie@108: strcpy(p_desc, "Extract the ASDF of an audio signal"); jamie@108: strcpy(author, ""); jamie@108: break; jamie@108: case XTRACT_NONZERO_COUNT: jamie@108: strcpy(name, "nonzero_count"); jamie@108: strcpy(p_name, "Non-zero count"); jamie@108: strcpy(desc, jamie@108: "Extract the number of non-zero elements in the input vector"); jamie@108: strcpy(p_desc, jamie@108: "Extract the number of non-zero elements in an input spectrum"); jamie@108: strcpy(author, ""); jamie@108: break; jamie@108: case XTRACT_WINDOWED: jamie@108: strcpy(name, "windowed"); jamie@108: strcpy(p_name, "Windowed frame"); jamie@108: strcpy(desc, "Apply a window function to a frame of data"); jamie@108: strcpy(p_desc, "Apply a window function to a frame of data"); jamie@108: strcpy(author, ""); jamie@108: break; jamie@108: default: jamie@108: strcpy(name, ""); jamie@108: strcpy(p_name, ""); jamie@108: strcpy(desc, ""); jamie@108: strcpy(p_desc, ""); jamie@108: strcpy(author, ""); jamie@108: break; jamie@108: } jamie@55: jamie@108: switch(f){ jamie@55: jamie@108: case XTRACT_VARIANCE: jamie@108: case XTRACT_STANDARD_DEVIATION: jamie@108: case XTRACT_AVERAGE_DEVIATION: jamie@108: case XTRACT_SPECTRAL_VARIANCE: jamie@108: case XTRACT_SPECTRAL_STANDARD_DEVIATION: jamie@108: case XTRACT_SPECTRAL_AVERAGE_DEVIATION: jamie@108: case XTRACT_SPECTRAL_INHARMONICITY: jamie@108: case XTRACT_LOWEST_VALUE: jamie@108: case XTRACT_F0: jamie@108: case XTRACT_FAILSAFE_F0: jamie@108: case XTRACT_TONALITY: jamie@108: *argc = 1; jamie@108: *argv_type = XTRACT_FLOAT; jamie@108: break; jamie@108: case XTRACT_SKEWNESS: jamie@108: case XTRACT_KURTOSIS: jamie@108: case XTRACT_SPECTRAL_SKEWNESS: jamie@108: case XTRACT_SPECTRAL_KURTOSIS: jamie@108: case XTRACT_PEAK_SPECTRUM: jamie@108: case XTRACT_HARMONIC_SPECTRUM: jamie@108: case XTRACT_NOISINESS: jamie@108: case XTRACT_CREST: jamie@108: case XTRACT_ROLLOFF: jamie@108: case XTRACT_FLUX: jamie@108: case XTRACT_LNORM: jamie@108: *argc = 2; jamie@108: *argv_type = XTRACT_FLOAT; jamie@108: break; jamie@108: case XTRACT_SPECTRUM: jamie@108: *argc = 4; jamie@108: *argv_type = XTRACT_FLOAT; jamie@108: break; jamie@108: case XTRACT_MFCC: jamie@108: *argc = 1; jamie@108: *argv_type = XTRACT_MEL_FILTER; jamie@108: break; jamie@104: case XTRACT_LPCC: jamie@104: *argc = 1; jamie@104: *argv_type = XTRACT_INT; jamie@104: break; jamie@108: case XTRACT_BARK_COEFFICIENTS: jamie@108: *argc = XTRACT_BARK_BANDS; jamie@108: *argv_type = XTRACT_INT; jamie@108: break; jamie@108: case XTRACT_WINDOWED: jamie@108: *argc = XTRACT_WINDOW_SIZE; jamie@108: *argv_type = XTRACT_FLOAT; jamie@108: break; jamie@108: case XTRACT_MEAN: jamie@108: case XTRACT_SPECTRAL_MEAN: jamie@108: case XTRACT_SPECTRAL_CENTROID: jamie@108: case XTRACT_IRREGULARITY_K: jamie@108: case XTRACT_IRREGULARITY_J: jamie@108: case XTRACT_TRISTIMULUS_1: jamie@108: case XTRACT_TRISTIMULUS_2: jamie@108: case XTRACT_TRISTIMULUS_3: jamie@108: case XTRACT_SMOOTHNESS: jamie@108: case XTRACT_FLATNESS: jamie@108: case XTRACT_SPREAD: jamie@108: case XTRACT_ZCR: jamie@108: case XTRACT_LOUDNESS: jamie@108: case XTRACT_HIGHEST_VALUE: jamie@108: case XTRACT_SUM: jamie@108: case XTRACT_RMS_AMPLITUDE: jamie@108: case XTRACT_POWER: jamie@108: case XTRACT_SHARPNESS: jamie@108: case XTRACT_SPECTRAL_SLOPE: jamie@108: case XTRACT_HPS: jamie@108: case XTRACT_ATTACK_TIME: jamie@108: case XTRACT_DECAY_TIME: jamie@108: case XTRACT_DIFFERENCE_VECTOR: jamie@108: case XTRACT_AUTOCORRELATION_FFT: jamie@108: case XTRACT_DCT: jamie@108: case XTRACT_AUTOCORRELATION: jamie@108: case XTRACT_AMDF: jamie@108: case XTRACT_ASDF: jamie@108: case XTRACT_NONZERO_COUNT: jamie@108: case XTRACT_ODD_EVEN_RATIO: jamie@104: case XTRACT_LPC: jamie@108: default: jamie@108: *argc = 0; jamie@108: break; jamie@108: } jamie@55: jamie@108: is_scalar = &d->is_scalar; jamie@108: jamie@108: switch(f){ jamie@108: case XTRACT_MEAN: jamie@108: case XTRACT_VARIANCE: jamie@108: case XTRACT_STANDARD_DEVIATION: jamie@108: case XTRACT_AVERAGE_DEVIATION: jamie@108: case XTRACT_SKEWNESS: jamie@108: case XTRACT_KURTOSIS: jamie@108: case XTRACT_SPECTRAL_MEAN: jamie@108: case XTRACT_SPECTRAL_VARIANCE: jamie@108: case XTRACT_SPECTRAL_STANDARD_DEVIATION: jamie@108: case XTRACT_SPECTRAL_AVERAGE_DEVIATION: jamie@108: case XTRACT_SPECTRAL_SKEWNESS: jamie@108: case XTRACT_SPECTRAL_KURTOSIS: jamie@108: case XTRACT_SPECTRAL_CENTROID: jamie@108: case XTRACT_IRREGULARITY_K: jamie@108: case XTRACT_IRREGULARITY_J: jamie@108: case XTRACT_TRISTIMULUS_1: jamie@108: case XTRACT_TRISTIMULUS_2: jamie@108: case XTRACT_TRISTIMULUS_3: jamie@108: case XTRACT_SMOOTHNESS: jamie@108: case XTRACT_SPREAD: jamie@108: case XTRACT_ZCR: jamie@108: case XTRACT_ROLLOFF: jamie@108: case XTRACT_LOUDNESS: jamie@108: case XTRACT_FLATNESS: jamie@108: case XTRACT_TONALITY: jamie@108: case XTRACT_CREST: jamie@108: case XTRACT_NOISINESS: jamie@108: case XTRACT_RMS_AMPLITUDE: jamie@108: case XTRACT_SPECTRAL_INHARMONICITY: jamie@108: case XTRACT_POWER: jamie@108: case XTRACT_ODD_EVEN_RATIO: jamie@108: case XTRACT_SHARPNESS: jamie@108: case XTRACT_SPECTRAL_SLOPE: jamie@108: case XTRACT_LOWEST_VALUE: jamie@108: case XTRACT_HIGHEST_VALUE: jamie@108: case XTRACT_SUM: jamie@108: case XTRACT_HPS: jamie@108: case XTRACT_F0: jamie@108: case XTRACT_FAILSAFE_F0: jamie@106: case XTRACT_FLUX: jamie@106: case XTRACT_LNORM: jamie@108: case XTRACT_NONZERO_COUNT: jamie@108: *is_scalar = XTRACT_TRUE; jamie@108: break; jamie@108: case XTRACT_AUTOCORRELATION: jamie@108: case XTRACT_AMDF: jamie@108: case XTRACT_ASDF: jamie@108: case XTRACT_BARK_COEFFICIENTS: jamie@108: case XTRACT_PEAK_SPECTRUM: jamie@108: case XTRACT_SPECTRUM: jamie@108: case XTRACT_AUTOCORRELATION_FFT: jamie@108: case XTRACT_MFCC: jamie@108: case XTRACT_LPC: jamie@108: case XTRACT_LPCC: jamie@108: case XTRACT_DCT: jamie@108: case XTRACT_HARMONIC_SPECTRUM: jamie@108: case XTRACT_DIFFERENCE_VECTOR: jamie@108: case XTRACT_WINDOWED: jamie@108: *is_scalar = XTRACT_FALSE; jamie@108: break; jamie@108: default: jamie@108: *is_scalar = XTRACT_TRUE; jamie@108: break; jamie@55: jamie@108: } jamie@55: jamie@108: is_delta = &d->is_delta; jamie@55: jamie@108: switch(f){ jamie@108: case XTRACT_FLUX: jamie@108: case XTRACT_LNORM: jamie@108: case XTRACT_DIFFERENCE_VECTOR: jamie@108: *is_delta = XTRACT_TRUE; jamie@108: break; jamie@108: case XTRACT_MEAN: jamie@108: case XTRACT_VARIANCE: jamie@108: case XTRACT_STANDARD_DEVIATION: jamie@108: case XTRACT_AVERAGE_DEVIATION: jamie@108: case XTRACT_SKEWNESS: jamie@108: case XTRACT_KURTOSIS: jamie@108: case XTRACT_SPECTRAL_MEAN: jamie@108: case XTRACT_SPECTRAL_VARIANCE: jamie@108: case XTRACT_SPECTRAL_STANDARD_DEVIATION: jamie@108: case XTRACT_SPECTRAL_AVERAGE_DEVIATION: jamie@108: case XTRACT_SPECTRAL_SKEWNESS: jamie@108: case XTRACT_SPECTRAL_KURTOSIS: jamie@108: case XTRACT_SPECTRAL_CENTROID: jamie@108: case XTRACT_IRREGULARITY_K: jamie@108: case XTRACT_IRREGULARITY_J: jamie@108: case XTRACT_TRISTIMULUS_1: jamie@108: case XTRACT_TRISTIMULUS_2: jamie@108: case XTRACT_TRISTIMULUS_3: jamie@108: case XTRACT_SMOOTHNESS: jamie@108: case XTRACT_SPREAD: jamie@108: case XTRACT_ZCR: jamie@108: case XTRACT_ROLLOFF: jamie@108: case XTRACT_LOUDNESS: jamie@108: case XTRACT_FLATNESS: jamie@108: case XTRACT_TONALITY: jamie@108: case XTRACT_CREST: jamie@108: case XTRACT_NOISINESS: jamie@108: case XTRACT_RMS_AMPLITUDE: jamie@108: case XTRACT_SPECTRAL_INHARMONICITY: jamie@108: case XTRACT_POWER: jamie@108: case XTRACT_ODD_EVEN_RATIO: jamie@108: case XTRACT_SHARPNESS: jamie@108: case XTRACT_SPECTRAL_SLOPE: jamie@108: case XTRACT_LOWEST_VALUE: jamie@108: case XTRACT_HIGHEST_VALUE: jamie@108: case XTRACT_SUM: jamie@108: case XTRACT_HPS: jamie@108: case XTRACT_F0: jamie@108: case XTRACT_FAILSAFE_F0: jamie@108: case XTRACT_NONZERO_COUNT: jamie@108: case XTRACT_AUTOCORRELATION: jamie@108: case XTRACT_AMDF: jamie@108: case XTRACT_ASDF: jamie@108: case XTRACT_BARK_COEFFICIENTS: jamie@108: case XTRACT_PEAK_SPECTRUM: jamie@108: case XTRACT_SPECTRUM: jamie@108: case XTRACT_AUTOCORRELATION_FFT: jamie@108: case XTRACT_MFCC: jamie@108: case XTRACT_LPC: jamie@108: case XTRACT_LPCC: jamie@108: case XTRACT_DCT: jamie@108: case XTRACT_HARMONIC_SPECTRUM: jamie@108: case XTRACT_WINDOWED: jamie@108: default: jamie@108: *is_delta = XTRACT_FALSE; jamie@108: break; jamie@108: } jamie@55: jamie@108: if(*is_scalar){ jamie@108: jamie@108: result_unit = &d->result.scalar.unit; jamie@108: result_min = &d->result.scalar.min; jamie@108: result_max = &d->result.scalar.max; jamie@108: jamie@108: switch(f){ jamie@108: case XTRACT_MEAN: jamie@108: case XTRACT_VARIANCE: jamie@108: case XTRACT_STANDARD_DEVIATION: jamie@108: case XTRACT_AVERAGE_DEVIATION: jamie@108: case XTRACT_SKEWNESS: jamie@108: case XTRACT_KURTOSIS: jamie@108: case XTRACT_RMS_AMPLITUDE: jamie@108: case XTRACT_LOWEST_VALUE: jamie@108: case XTRACT_HIGHEST_VALUE: jamie@108: case XTRACT_SUM: jamie@106: case XTRACT_FLUX: jamie@106: case XTRACT_LNORM: jamie@108: case XTRACT_NONZERO_COUNT: jamie@108: case XTRACT_WINDOWED: jamie@108: *result_unit = XTRACT_ANY; jamie@108: *result_min = XTRACT_ANY; jamie@108: *result_max = XTRACT_ANY; jamie@104: break; jamie@108: case XTRACT_SPECTRAL_SKEWNESS: jamie@108: case XTRACT_SPECTRAL_KURTOSIS: jamie@108: case XTRACT_IRREGULARITY_K: jamie@108: case XTRACT_IRREGULARITY_J: jamie@108: case XTRACT_TRISTIMULUS_1: jamie@108: case XTRACT_TRISTIMULUS_2: jamie@108: case XTRACT_TRISTIMULUS_3: jamie@108: case XTRACT_NOISINESS: jamie@108: case XTRACT_SMOOTHNESS: jamie@108: *result_unit = XTRACT_NONE; jamie@108: *result_min = XTRACT_ANY; /* FIX: need to check these */ jamie@108: *result_max = XTRACT_ANY; jamie@104: break; jamie@108: case XTRACT_SPECTRAL_MEAN: jamie@108: case XTRACT_SPECTRAL_VARIANCE: jamie@108: case XTRACT_SPECTRAL_STANDARD_DEVIATION: jamie@108: case XTRACT_SPECTRAL_AVERAGE_DEVIATION: jamie@108: case XTRACT_SPECTRAL_CENTROID: jamie@108: case XTRACT_SPREAD: jamie@108: case XTRACT_F0: jamie@108: case XTRACT_FAILSAFE_F0: jamie@108: case XTRACT_HPS: jamie@108: case XTRACT_ROLLOFF: jamie@108: *result_unit = XTRACT_HERTZ; jamie@108: *result_min = 0.f; jamie@108: *result_max = XTRACT_SR_UPPER_LIMIT / 2; jamie@104: break; jamie@108: case XTRACT_ZCR: jamie@108: *result_unit = XTRACT_HERTZ; jamie@108: *result_min = 0.f; jamie@108: *result_max = XTRACT_ANY; jamie@108: break; jamie@108: case XTRACT_ODD_EVEN_RATIO: jamie@108: *result_unit = XTRACT_NONE; jamie@108: *result_min = 0.f; jamie@108: *result_max = 1.f; jamie@108: break; jamie@108: case XTRACT_LOUDNESS: jamie@108: case XTRACT_FLATNESS: jamie@108: case XTRACT_TONALITY: jamie@108: case XTRACT_CREST: jamie@108: case XTRACT_SPECTRAL_INHARMONICITY: jamie@108: case XTRACT_POWER: jamie@108: case XTRACT_SHARPNESS: jamie@108: case XTRACT_SPECTRAL_SLOPE: jamie@104: case XTRACT_LPC: jamie@104: case XTRACT_LPCC: jamie@108: default: jamie@108: *result_unit = XTRACT_UNKNOWN; jamie@108: *result_min = XTRACT_UNKNOWN; jamie@108: *result_max = XTRACT_UNKNOWN; jamie@104: break; jamie@108: } jamie@108: } jamie@108: else { jamie@55: jamie@108: result_min = NULL; jamie@108: result_max = NULL; jamie@108: result_unit = &d->result.vector.unit; jamie@108: result_format = &d->result.vector.format; jamie@55: jamie@108: switch(f) { jamie@108: case XTRACT_AUTOCORRELATION: jamie@108: case XTRACT_AMDF: jamie@108: case XTRACT_ASDF: jamie@108: case XTRACT_DCT: jamie@108: case XTRACT_WINDOWED: jamie@108: *result_format = XTRACT_ARBITRARY_SERIES; jamie@108: *result_unit = XTRACT_ANY; jamie@104: break; jamie@108: case XTRACT_BARK_COEFFICIENTS: jamie@108: *result_format = XTRACT_BARK_COEFFS; jamie@108: *result_unit = XTRACT_UNKNOWN; /* FIX: check */ jamie@104: break; jamie@108: case XTRACT_PEAK_SPECTRUM: jamie@108: case XTRACT_SPECTRUM: jamie@108: case XTRACT_HARMONIC_SPECTRUM: jamie@108: *result_format = XTRACT_SPECTRAL; jamie@108: *result_unit = XTRACT_ANY_AMPLITUDE_HERTZ; jamie@104: break; jamie@108: case XTRACT_AUTOCORRELATION_FFT: jamie@104: break; jamie@108: case XTRACT_MFCC: jamie@108: *result_format = XTRACT_MEL_COEFFS; jamie@108: *result_unit = XTRACT_UNKNOWN; /* FIX: check */ jamie@104: break; jamie@104: case XTRACT_LPC: jamie@104: *result_format = XTRACT_LPC_COEFFS; jamie@104: *result_unit = XTRACT_UNKNOWN; jamie@104: break; jamie@104: case XTRACT_LPCC: jamie@104: *result_format = XTRACT_LPCC_COEFFS; jamie@104: *result_unit = XTRACT_UNKNOWN; jamie@104: break; jamie@108: default: jamie@108: break; jamie@108: } jamie@108: } jamie@50: } jamie@50: jamie@50: return fd; jamie@50: } jamie@50: jamie@110: int xtract_free_descriptors(xtract_function_descriptor_t *fd){ jamie@50: jamie@50: if (fd != NULL) { jamie@108: free(fd); jamie@50: } jamie@50: jamie@56: return XTRACT_SUCCESS; jamie@50: } jamie@50: jamie@50: jamie@50: jamie@50: jamie@50: