view src/descriptors.c @ 123:efb1c1ae2ba8

- reimplemented xtract_spectral_variance() xtract_spectral_skewness() and xtract_spectral_kurtosis() using correct maths - removed xtract_spectral_average_deviation()
author Jamie Bullock <jamie@postlude.co.uk>
date Wed, 30 Mar 2011 10:51:39 +0000
parents 6c5ece9cba3a
children 67f6b6e63d45
line wrap: on
line source
/* libxtract feature extraction library
 *  
 * Copyright (C) 2006 Jamie Bullock
 *
 * This program is free software; you can redistribute it and/or modify
 * it under the terms of the GNU General Public License as published by
 * the Free Software Foundation; either version 2 of the License, or
 * (at your option) any later version.
 *
 * This program is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 * GNU General Public License for more details.
 *
 * You should have received a copy of the GNU General Public License
 * along with this program; if not, write to the Free Software
 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, 
 * USA.
 */

#include "xtract/libxtract.h"
#include "xtract_macros_private.h"
#include <stdlib.h>
#include <string.h>
#define XTRACT

xtract_function_descriptor_t *xtract_make_descriptors(void){

    int f , F;
    char *name, *p_name, *desc, *p_desc, *author; 
    float *argv_min, *argv_max, *argv_def, *result_min, *result_max;
    int *argc, *year, *argv_donor;
    xtract_vector_t *data_format, *result_format; 
    xtract_unit_t *data_unit, *argv_unit, *result_unit;
    xtract_bool_t *is_scalar, *is_delta;
    xtract_function_descriptor_t *fd, *d;
    xtract_type_t *argv_type;

    f = F = XTRACT_FEATURES;

    fd = malloc(XTRACT_FEATURES * sizeof(xtract_function_descriptor_t));

    /* FIX - this file probably needs a rewrite for readability */

    while(f--){

        d = &fd[f];
        d->id = f;
        argc = &d->argc;
        argv_type = &d->argv.type;

        argv_min = &d->argv.min[0];
        argv_max = &d->argv.max[0];
        argv_def = &d->argv.def[0];
        argv_unit = &d->argv.unit[0];

        switch (f) {
            /* argc = 1 */
            case XTRACT_VARIANCE:
            case XTRACT_SPECTRAL_VARIANCE:
            case XTRACT_STANDARD_DEVIATION:
            case XTRACT_DIFFERENCE_VECTOR: 
            case XTRACT_AVERAGE_DEVIATION:
            case XTRACT_SPECTRAL_STANDARD_DEVIATION:
            /* case XTRACT_SPECTRAL_AVERAGE_DEVIATION: */
            case XTRACT_LOWEST_VALUE:
            case XTRACT_TONALITY:
            case XTRACT_MFCC:
            case XTRACT_LPC:
            case XTRACT_LPCC:
                *argv_min = XTRACT_ANY;
                *argv_max = XTRACT_ANY;
                *argv_def = XTRACT_ANY;
                *argv_unit = XTRACT_DBFS;
                break;
            case XTRACT_SPECTRAL_INHARMONICITY:
                *argv_min = 0.f;
                *argv_max = XTRACT_SR_UPPER_LIMIT / 2;
                *argv_def = XTRACT_FUNDAMENTAL_DEFAULT;
                *argv_unit = XTRACT_HERTZ;
                break;
            case XTRACT_F0:
            case XTRACT_FAILSAFE_F0:
                *argv_min = XTRACT_SR_LOWER_LIMIT;
                *argv_max = XTRACT_SR_UPPER_LIMIT;
                *argv_def = XTRACT_SR_DEFAULT; 
                *argv_unit = XTRACT_HERTZ;
                break;
            case XTRACT_FLATNESS_DB:
                *argv_min = 0;
                *argv_max = 1.0;
                *argv_def = XTRACT_ANY;
                *argv_unit = XTRACT_DBFS;
                break;
            /* argc = 2 */;
            case XTRACT_ROLLOFF:
                *argv_min  = XTRACT_FFT_BANDS_MIN;
                *argv_max = XTRACT_FFT_BANDS_MAX;
                *argv_def = XTRACT_SPEC_BW_DEF ;
                *argv_unit = XTRACT_HERTZ;
                *(argv_min + 1) = 0.f;
                *(argv_max + 1) = 100.f;
                *(argv_def + 1) = 95.f;
                *(argv_unit + 1) = XTRACT_PERCENT;
                break;
            case XTRACT_PEAK_SPECTRUM:
                *argv_min  = XTRACT_SR_LOWER_LIMIT / 2; 
                *argv_max = XTRACT_SR_UPPER_LIMIT / 2;
                *argv_def = XTRACT_SR_DEFAULT / 2;
                *argv_unit = XTRACT_HERTZ;
                *(argv_min + 1) = 0.f;
                *(argv_max + 1) = 100.f ;
                *(argv_def + 1) = 10.f ;
                *(argv_unit + 1) = XTRACT_PERCENT;
                break;
            case XTRACT_HARMONIC_SPECTRUM:
                *argv_min = 0.f;
                *argv_max = XTRACT_SR_UPPER_LIMIT / 2;
                *argv_def = XTRACT_FUNDAMENTAL_DEFAULT;
                *argv_unit = XTRACT_HERTZ;
                *(argv_min + 1) = 0.f;
                *(argv_max + 1) = 1.f ;
                *(argv_def + 1) = .1f ;
                *(argv_unit + 1) = XTRACT_NONE;
                break;
            case XTRACT_NOISINESS:
            case XTRACT_SKEWNESS:
            case XTRACT_KURTOSIS:
            case XTRACT_SPECTRAL_SKEWNESS:
            case XTRACT_SPECTRAL_KURTOSIS:
            case XTRACT_CREST:
                *argv_min = XTRACT_NONE;
                *argv_max = XTRACT_NONE;
                *argv_def = XTRACT_NONE;
                *argv_unit = XTRACT_NONE;
                *(argv_min + 1) = XTRACT_NONE;
                *(argv_max + 1) = XTRACT_NONE;
                *(argv_def + 1) = XTRACT_NONE;
                *(argv_unit + 1) = XTRACT_NONE;
                break;
            /* argc = 4 */
            case XTRACT_SPECTRUM:
                *argv_min  = XTRACT_SR_LOWER_LIMIT / XTRACT_FFT_BANDS_MIN; 
                *argv_max = XTRACT_SR_UPPER_LIMIT / XTRACT_FFT_BANDS_MAX;
                *argv_def = XTRACT_SR_DEFAULT / XTRACT_FFT_BANDS_DEF;
                *argv_unit = XTRACT_HERTZ;
                *(argv_min + 1) = 0;
                *(argv_max + 1) = 3 ;
                *(argv_def + 1) = 0;
                *(argv_unit + 1) = XTRACT_NONE;
                *(argv_min + 2) = 0;
                *(argv_max + 2) = 1;
                *(argv_def + 2) = 0;
                *(argv_unit + 2) = XTRACT_NONE;
                *(argv_min + 3) = 0;
                *(argv_max + 3) = 1;
                *(argv_def + 3) = 0;
                *(argv_unit + 3) = XTRACT_NONE;
                break;
            case XTRACT_SUBBANDS:
                *argv_min  = XTRACT_ANY; 
                *argv_max = XTRACT_ANY;
                *argv_def = XTRACT_MEAN;
                *argv_unit = XTRACT_NONE;
                *(argv_min + 1) = 1;
                *(argv_max + 1) = 16384;
                *(argv_def + 1) = 4;
                *(argv_unit + 1) = XTRACT_NONE;
                *(argv_min + 2) = 0;
                *(argv_max + 2) = 32;
                *(argv_def + 2) = 0;
                *(argv_unit + 2) = XTRACT_NONE;
                *(argv_min + 3) = 0;
                *(argv_max + 3) = XTRACT_ANY;
                *(argv_def + 3) = 0;
                *(argv_unit + 3) = XTRACT_BINS;
                break;
            case XTRACT_BARK_COEFFICIENTS:
                /* BARK_COEFFICIENTS is special because argc = BARK_BANDS */
            case XTRACT_WINDOWED:
                /* WINDOWED is special because argc = window size = N */
            default:
                *argv_min = XTRACT_NONE;
                *argv_max = XTRACT_NONE;
                *argv_def = XTRACT_NONE;
                *argv_unit = XTRACT_NONE;
                break;
        }

        argv_donor = &d->argv.donor[0];

        switch (f) {
            /* argc = 1 */
            case XTRACT_VARIANCE:
                *argv_donor = XTRACT_MEAN;
                break;
            case XTRACT_SPECTRAL_VARIANCE:
                *argv_donor = XTRACT_SPECTRAL_MEAN;
                break;
            case XTRACT_STANDARD_DEVIATION:
                *argv_donor = XTRACT_VARIANCE;
                break;
            case XTRACT_AVERAGE_DEVIATION:
                *argv_donor = XTRACT_MEAN;
                break;
            case XTRACT_SPECTRAL_STANDARD_DEVIATION:
                *argv_donor = XTRACT_SPECTRAL_VARIANCE;
                break;
            /* case XTRACT_SPECTRAL_AVERAGE_DEVIATION:
                *argv_donor = XTRACT_SPECTRAL_MEAN;
                break; */
            case XTRACT_SPECTRAL_INHARMONICITY:
                *argv_donor = XTRACT_FAILSAFE_F0;
                break;
            case XTRACT_FLATNESS_DB:
                *argv_donor = XTRACT_FLATNESS;
                break;
            case XTRACT_TONALITY:
                *argv_donor = XTRACT_FLATNESS_DB;
                break;
            case XTRACT_LOWEST_VALUE:
            case XTRACT_F0:
            case XTRACT_FAILSAFE_F0:
                *argv_donor = XTRACT_ANY;
                break;
            case XTRACT_MFCC:
                *argv_donor = XTRACT_INIT_MFCC;
                break;
                /* argc = 2 */;
            case XTRACT_ROLLOFF:
            case XTRACT_PEAK_SPECTRUM:
            case XTRACT_FLUX:
            case XTRACT_LNORM:
                *argv_donor = XTRACT_ANY;
                *(argv_donor + 1) = XTRACT_ANY;
                break;
            case XTRACT_SKEWNESS:
            case XTRACT_KURTOSIS:
                *argv_donor = XTRACT_MEAN;
                *(argv_donor + 1) = XTRACT_STANDARD_DEVIATION;
                break;
            case XTRACT_SPECTRAL_SKEWNESS:
            case XTRACT_SPECTRAL_KURTOSIS:
                *argv_donor = XTRACT_SPECTRAL_MEAN;
                *(argv_donor + 1) = XTRACT_SPECTRAL_STANDARD_DEVIATION;
                break;
            case XTRACT_HARMONIC_SPECTRUM:
                *argv_donor = XTRACT_FAILSAFE_F0;
                *(argv_donor + 1) = XTRACT_ANY;
                break;
            case XTRACT_NOISINESS:
                *argv_donor = XTRACT_SUM;
                *(argv_donor + 1) = XTRACT_SUM;
                break;
            case XTRACT_CREST:
                *argv_donor = XTRACT_HIGHEST_VALUE;
                *(argv_donor + 1) = XTRACT_MEAN;
                break;
                /* argc = 4 */
            case XTRACT_SPECTRUM:
                *argv_donor = XTRACT_ANY;
                *(argv_donor + 1) = XTRACT_ANY;
                *(argv_donor + 2) = XTRACT_ANY;
                *(argv_donor + 3) = XTRACT_ANY;
                break;
            case XTRACT_SUBBANDS:
                *argv_donor = XTRACT_ANY;
                *(argv_donor + 1) = XTRACT_ANY;
                *(argv_donor + 2) = XTRACT_ANY;
                *(argv_donor + 3) = XTRACT_ANY;
                break;
            /* BARK_BANDS */
            case XTRACT_BARK_COEFFICIENTS:
                *argv_donor = XTRACT_INIT_BARK;
                break;
            case XTRACT_WINDOWED:
                *argv_donor = XTRACT_INIT_WINDOWED;
                break;
            default:
                *argv_donor = XTRACT_ANY;
                break;
        }

        data_format = &d->data.format;

        switch(f){

            case XTRACT_MEAN: 
            case XTRACT_VARIANCE:
            case XTRACT_STANDARD_DEVIATION:
            case XTRACT_AVERAGE_DEVIATION:
            case XTRACT_SKEWNESS:
            case XTRACT_KURTOSIS:
            case XTRACT_LOWEST_VALUE:
            case XTRACT_HIGHEST_VALUE:
            case XTRACT_SUM:
            case XTRACT_WINDOWED:
                *data_format = XTRACT_ARBITRARY_SERIES;
                break;
            case XTRACT_SPECTRAL_MEAN:
            case XTRACT_SPECTRAL_VARIANCE:
            case XTRACT_SPECTRAL_STANDARD_DEVIATION:
            /* case XTRACT_SPECTRAL_AVERAGE_DEVIATION: */
            case XTRACT_SPECTRAL_SKEWNESS:
            case XTRACT_SPECTRAL_KURTOSIS:
            case XTRACT_SPECTRAL_CENTROID:
            case XTRACT_SPECTRAL_SLOPE:
                *data_format = XTRACT_SPECTRAL;     
                break;
            case XTRACT_ROLLOFF:
            case XTRACT_NOISINESS:
            case XTRACT_BARK_COEFFICIENTS:
            case XTRACT_CREST:
            case XTRACT_IRREGULARITY_K:
            case XTRACT_IRREGULARITY_J:
            case XTRACT_SMOOTHNESS:
            case XTRACT_FLATNESS:
            case XTRACT_SPREAD:
            case XTRACT_POWER:
            case XTRACT_HPS:
            case XTRACT_PEAK_SPECTRUM:
            case XTRACT_SUBBANDS:
            case XTRACT_MFCC:
                *data_format = XTRACT_SPECTRAL_MAGNITUDES;
                break;
            case XTRACT_LPC:
                *data_format = XTRACT_AUTOCORRELATION_COEFFS;
                break;
            case XTRACT_LPCC:
                *data_format = XTRACT_LPC_COEFFS;
                break;
            case XTRACT_SPECTRAL_INHARMONICITY:
            case XTRACT_HARMONIC_SPECTRUM:
                *data_format = XTRACT_SPECTRAL_PEAKS;
                break;
            case XTRACT_NONZERO_COUNT:
                *data_format = XTRACT_SPECTRAL_PEAKS_MAGNITUDES;
                break;
            case XTRACT_F0:
            case XTRACT_FAILSAFE_F0:
            case XTRACT_SPECTRUM:
            case XTRACT_AUTOCORRELATION:
            case XTRACT_AUTOCORRELATION_FFT:
            case XTRACT_DCT:
            case XTRACT_AMDF:
            case XTRACT_ASDF:
            case XTRACT_ZCR:
            case XTRACT_RMS_AMPLITUDE:
            case XTRACT_FLUX: 
            case XTRACT_LNORM: 
                *data_format = XTRACT_AUDIO_SAMPLES;
                break;
            case XTRACT_TONALITY:
            case XTRACT_FLATNESS_DB:
                *data_format = XTRACT_NO_DATA;
                break;
            case XTRACT_TRISTIMULUS_1:
            case XTRACT_TRISTIMULUS_2:
            case XTRACT_TRISTIMULUS_3:
            case XTRACT_ODD_EVEN_RATIO:
                *data_format = XTRACT_SPECTRAL_HARMONICS_MAGNITUDES;
                break;
            case XTRACT_LOUDNESS:
            case XTRACT_SHARPNESS:
                *data_format = XTRACT_BARK_COEFFS;
                break;
            case XTRACT_DIFFERENCE_VECTOR: 
                *data_format = XTRACT_SUBFRAMES;
                break;
            case XTRACT_ATTACK_TIME: 
            case XTRACT_DECAY_TIME: 
            default:
                *data_format = XTRACT_NO_DATA;
                break;
        }

        data_unit = &d->data.unit;

        switch(f){

            case XTRACT_MEAN: 
            case XTRACT_VARIANCE:
            case XTRACT_STANDARD_DEVIATION:
            case XTRACT_AVERAGE_DEVIATION:
            case XTRACT_SKEWNESS:
            case XTRACT_KURTOSIS:
            case XTRACT_LOWEST_VALUE:
            case XTRACT_HIGHEST_VALUE:
            case XTRACT_SUM:
            case XTRACT_ZCR:
            case XTRACT_PEAK_SPECTRUM:
            case XTRACT_TRISTIMULUS_1:
            case XTRACT_TRISTIMULUS_2:
            case XTRACT_TRISTIMULUS_3:
            case XTRACT_DCT:
            case XTRACT_AMDF:
            case XTRACT_ASDF:
            case XTRACT_IRREGULARITY_K:
            case XTRACT_IRREGULARITY_J:
            case XTRACT_ATTACK_TIME: 
            case XTRACT_DECAY_TIME: 
            case XTRACT_DIFFERENCE_VECTOR: 
            case XTRACT_FLUX: 
            case XTRACT_LNORM: 
            case XTRACT_F0:
            case XTRACT_FAILSAFE_F0:
            case XTRACT_MFCC:
            case XTRACT_AUTOCORRELATION:
            case XTRACT_AUTOCORRELATION_FFT:
            case XTRACT_ROLLOFF:
            case XTRACT_NOISINESS:
            case XTRACT_CREST:
            case XTRACT_FLATNESS:
            case XTRACT_FLATNESS_DB:
            case XTRACT_POWER:
            case XTRACT_BARK_COEFFICIENTS:
            case XTRACT_RMS_AMPLITUDE:
            case XTRACT_SMOOTHNESS:
            case XTRACT_SPREAD:
            case XTRACT_SHARPNESS:
            case XTRACT_HPS:
            case XTRACT_SPECTRUM:
            case XTRACT_TONALITY:
            case XTRACT_LOUDNESS:
            case XTRACT_NONZERO_COUNT:
            case XTRACT_LPC:
            case XTRACT_LPCC:
            case XTRACT_WINDOWED:
            case XTRACT_SUBBANDS:
                *data_unit = XTRACT_ANY;
                break;
            case XTRACT_SPECTRAL_MEAN:
            case XTRACT_SPECTRAL_VARIANCE:
            case XTRACT_SPECTRAL_STANDARD_DEVIATION:
            /* case XTRACT_SPECTRAL_AVERAGE_DEVIATION: */
            case XTRACT_SPECTRAL_SKEWNESS:
            case XTRACT_SPECTRAL_KURTOSIS:
            case XTRACT_SPECTRAL_CENTROID:
            case XTRACT_SPECTRAL_SLOPE:
            case XTRACT_HARMONIC_SPECTRUM:
            case XTRACT_SPECTRAL_INHARMONICITY:
                *data_unit = XTRACT_ANY_AMPLITUDE_HERTZ;
                break;
            case XTRACT_ODD_EVEN_RATIO:
                *data_unit = XTRACT_HERTZ;
                break;
        }

        name = d->algo.name;
        p_name = d->algo.p_name;
        desc = d->algo.desc;
        p_desc = d->algo.p_desc;
        author = d->algo.author;
        year = &d->algo.year;

        strcpy(author, "");
        *year = 0;

        switch(f){
            case XTRACT_MEAN: 
                strcpy(name, "mean");
                strcpy(p_name, "Mean");
                strcpy(desc, "Extract the mean of an input vector");
                strcpy(p_desc, "Extract the mean of a range of values");
                strcpy(author, "");
                break;
            case XTRACT_VARIANCE:
                strcpy(name, "variance");
                strcpy(p_name, "Variance");
                strcpy(desc, "Extract the variance of an input vector");
                strcpy(p_desc, "Extract the variance of a range of values");
                strcpy(author, "");
                break;
            case XTRACT_STANDARD_DEVIATION:
                strcpy(name, "standard_deviation");
                strcpy(p_name, "Standard Deviation");
                strcpy(desc, 
                        "Extract the standard deviation of an input vector");
                strcpy(p_desc, 
                        "Extract the standard deviation of a range of values");
                strcpy(author, "");
                break;
            case XTRACT_AVERAGE_DEVIATION:
                strcpy(name, "average_deviation");
                strcpy(p_name, "Average Deviation");
                strcpy(desc, 
                        "Extract the average deviation of an input vector");
                strcpy(p_desc, 
                        "Extract the average deviation of a range of values");
                strcpy(author, "");
                break;
            case XTRACT_SKEWNESS:
                strcpy(name, "skewness");
                strcpy(p_name, "Skewness");
                strcpy(desc, 
                        "Extract the skewness of an input vector");
                strcpy(p_desc, 
                        "Extract the skewness of a range of values");
                strcpy(author, "");
                break;
            case XTRACT_KURTOSIS:
                strcpy(name, "kurtosis");
                strcpy(p_name, "Kurtosis");
                strcpy(desc, 
                        "Extract the kurtosis of an input vector");
                strcpy(p_desc, 
                        "Extract the kurtosis of a range of values");
                strcpy(author, "");
                break;
            case XTRACT_SPECTRAL_MEAN: 
                strcpy(name, "spectral_mean");
                strcpy(p_name, "Spectral Mean");
                strcpy(desc, "Extract the mean of an input spectrum");
                strcpy(p_desc, "Extract the mean of an audio spectrum");
                strcpy(author, "");
                break;
            case XTRACT_SPECTRAL_VARIANCE:
                strcpy(name, "spectral_variance");
                strcpy(p_name, "Spectral Variance");
                strcpy(desc, "Extract the variance of an input spectrum");
                strcpy(p_desc, "Extract the variance of an audio spectrum");
                strcpy(author, "");
                break;
            case XTRACT_SPECTRAL_STANDARD_DEVIATION:
                strcpy(name, "spectral_standard_deviation");
                strcpy(p_name, "Spectral Standard Deviation");
                strcpy(desc, 
                        "Extract the standard deviation of an input spectrum");
                strcpy(p_desc, 
                        "Extract the standard deviation of an audio spectrum");
                strcpy(author, "");
                break;
            /* case XTRACT_SPECTRAL_AVERAGE_DEVIATION:
                strcpy(name, "spectral_average_deviation");
                strcpy(p_name, "Spectral Average Deviation");
                strcpy(desc, 
                        "Extract the average deviation of an input spectrum");
                strcpy(p_desc, 
                        "Extract the average deviation of an audio spectrum");
                strcpy(author, "");
                break;
                */
            case XTRACT_ROLLOFF:
                strcpy(name, "rolloff");
                strcpy(p_name, "Spectral Rolloff");
                strcpy(desc, 
                        "Extract the rolloff point of a spectrum");
                strcpy(p_desc, 
                        "Extract the rolloff point of an audio spectrum");
                strcpy(author, "Bee Suan Ong");
                *year = 2005;
                break;
            case XTRACT_SPECTRAL_INHARMONICITY:
                strcpy(name, "spectral_inharmonicity");
                strcpy(p_name, "Inharmonicity");
                strcpy(desc, "Extract the inharmonicity of a spectrum");
                strcpy(p_desc, 
                        "Extract the inharmonicity of an audio spectrum");
                break;
            case XTRACT_SPECTRUM:
                strcpy(name, "spectrum");
                strcpy(p_name, "Spectrum");
                strcpy(desc, 
                        "Extract the spectrum of an input vector");
                strcpy(p_desc, 
                        "Extract the spectrum of an audio signal");
                strcpy(author, "");
                break;
            case XTRACT_ODD_EVEN_RATIO:
                strcpy(name, "odd_even_ratio");
                strcpy(p_name, "Odd/even Harmonic Ratio");
                strcpy(desc, 
                        "Extract the odd-to-even harmonic ratio of a spectrum");
                strcpy(p_desc, 
                        "Extract the odd-to-even harmonic ratio of an audio spectrum");
                strcpy(author, "");
                break;
            case XTRACT_LOWEST_VALUE:
                strcpy(name, "lowest_value");
                strcpy(p_name, "Lowest Value");
                strcpy(desc, "Extract the lowest value from an input vector");
                strcpy(p_desc, "Extract the lowest value from a given range");
                strcpy(author, "");
                break;
            case XTRACT_F0:
                strcpy(name, "f0");
                strcpy(p_name, "Fundamental Frequency");
                strcpy(desc, "Extract the fundamental frequency	of a signal");
                strcpy(p_desc, 
                        "Extract the fundamental frequency of an audio signal");
                strcpy(author, "Jamie Bullock");
                break;
            case XTRACT_FAILSAFE_F0:
                strcpy(name, "failsafe_f0");
                strcpy(p_name, "Fundamental Frequency (failsafe)");
                strcpy(desc, "Extract the fundamental frequency of a signal (failsafe)");
                strcpy(p_desc, 
                        "Extract the fundamental frequency of an audio signal (failsafe)");
                strcpy(author, "Jamie Bullock");
                break;
            case XTRACT_TONALITY:
                strcpy(name, "tonality");
                strcpy(p_name, "Tonality");
                strcpy(desc, "Extract the tonality of a spectrum");
                strcpy(p_desc, "Extract the tonality an audio spectrum");
                strcpy(author, "J. D. Johnston");
                *year = 1988;
                break;
            case XTRACT_SPECTRAL_SKEWNESS:
                strcpy(name, "spectral_skewness");
                strcpy(p_name, "Spectral Skewness");
                strcpy(desc, "Extract the skewness of an input spectrum");
                strcpy(p_desc, "Extract the skewness of an audio spectrum");
                strcpy(author, "");
                break;
            case XTRACT_SPECTRAL_KURTOSIS:
                strcpy(name, "spectral_kurtosis");
                strcpy(p_name, "Spectral Kurtosis");
                strcpy(desc, "Extract the kurtosis of an input spectrum");
                strcpy(p_desc, "Extract the kurtosis of an audio spectrum");
                strcpy(author, "");
                break;
            case XTRACT_PEAK_SPECTRUM:
                strcpy(name, "peak_spectrum");
                strcpy(p_name, "Peak Spectrum");
                strcpy(desc, "Extract the spectral peaks from of a spectrum");
                strcpy(p_desc, 
                        "Extract the spectral peaks from an audio spectrum");
                strcpy(author, "");
                break;
            case XTRACT_HARMONIC_SPECTRUM:
                strcpy(name, "harmonic_spectrum");
                strcpy(p_name, "Harmonic Spectrum");
                strcpy(desc, "Extract the harmonics from a spectrum");
                strcpy(p_desc, "Extract the harmonics from an audio spectrum");
                strcpy(author, "");
                break;
            case XTRACT_NOISINESS:
                strcpy(name, "noisiness");
                strcpy(p_name, "Noisiness");
                strcpy(desc, "Extract the noisiness of a spectrum");
                strcpy(p_desc, "Extract the noisiness of an audio  spectrum");
                strcpy(author, "Tae Hong Park");
                *year = 2000;
                break;
            case XTRACT_CREST:
                strcpy(name, "crest");
                strcpy(p_name, "Spectral Crest Measure");
                strcpy(desc, 
                        "Extract the spectral crest measure of a spectrum");
                strcpy(p_desc, 
                        "Extract the spectral crest measure of an audio spectrum");
                strcpy(author, "Peeters");
                *year = 2003;
                break;
            case XTRACT_MFCC:
                strcpy(name, "mfcc");
                strcpy(p_name, "Mel-Frequency Cepstral Coefficients");
                strcpy(desc, "Extract MFCC from a spectrum");
                strcpy(p_desc, "Extract MFCC from an audio spectrum");
                strcpy(author, "Rabiner");
                break;
            case XTRACT_LPC:
                strcpy(name, "lpc");
                strcpy(p_name, "Linear predictive coding coefficients");
                strcpy(desc, "Extract LPC from autocorrelation coefficients");
                strcpy(p_desc, 
                        "Extract LPC from autocorrelation coefficients");
                strcpy(author, 
                        "Rabiner and Juang as implemented by Jutta Degener");
                *year = 1994;
                break;
            case XTRACT_LPCC:
                strcpy(name, "lpcc");
                strcpy(p_name, "Linear predictive coding cepstral coefficients");
                strcpy(desc, "Extract LPC cepstrum from LPC coefficients");
                strcpy(p_desc, 
                        "Extract LPC cepstrum from LPC coefficients");
                strcpy(author, "Rabiner and Juang");
                *year = 1993;
                break;
            case XTRACT_SUBBANDS:
                strcpy(name, "subbands");
                strcpy(p_name, "Sub band coefficients");
                strcpy(desc, "Extract subband coefficients from spectral magnitudes");
                strcpy(p_desc, 
                        "Extract subband coefficients from spectral magnitudes");
                strcpy(author, "");
                break;
            case XTRACT_BARK_COEFFICIENTS:
                strcpy(name, "bark_coefficients");
                strcpy(p_name, "Bark Coefficients");
                strcpy(desc, "Extract bark coefficients from a spectrum");
                strcpy(p_desc, 
                        "Extract bark coefficients from an audio spectrum");
                strcpy(author, "");
                break;
            case XTRACT_SPECTRAL_CENTROID:
                strcpy(name, "spectral_centroid");
                strcpy(p_name, "Spectral Centroid");
                strcpy(desc, "Extract the spectral centroid of a spectrum");
                strcpy(p_desc, 
                        "Extract the spectral centroid of an audio spectrum");
                strcpy(author, "");
                break;
            case XTRACT_IRREGULARITY_K:
                strcpy(name, "irregularity_k");
                strcpy(p_name, "Irregularity I");
                strcpy(desc, "Extract the irregularity (type I) of a spectrum");
                strcpy(p_desc, 
                        "Extract the irregularity (type I) of an audio spectrum");
                strcpy(author, "Krimphoff");
                *year = 1994;
                break;
            case XTRACT_IRREGULARITY_J:
                strcpy(name, "irregularity_j");
                strcpy(p_name, "Irregularity II");
                strcpy(desc, "Extract the irregularity (type II) of a spectrum");
                strcpy(p_desc, 
                        "Extract the irregularity (type II) of an audio spectrum");
                strcpy(author, "Jensen");
                *year = 1999;
                break;
            case XTRACT_TRISTIMULUS_1:
                strcpy(name, "tristimulus_1");
                strcpy(p_name, "Tristimulus I");
                strcpy(desc, "Extract the tristimulus (type I) of a spectrum");
                strcpy(p_desc, 
                        "Extract the tristimulus (type I) of an audio spectrum");
                strcpy(author, "Pollard and Jansson");
                *year = 1982;
                break;
            case XTRACT_TRISTIMULUS_2:
                strcpy(name, "tristimulus_2");
                strcpy(p_name, "Tristimulus II");
                strcpy(desc, "Extract the tristimulus (type II) of a spectrum");
                strcpy(p_desc, 
                        "Extract the tristimulus (type II) of an audio spectrum");
                strcpy(author, "Pollard and Jansson");
                *year = 1982;
                break;
            case XTRACT_TRISTIMULUS_3:
                strcpy(name, "tristimulus_3");
                strcpy(p_name, "Tristimulus III");
                strcpy(desc, 
                        "Extract the tristimulus (type III) of a spectrum");
                strcpy(p_desc, 
                        "Extract the tristimulus (type III) of an audio spectrum");
                strcpy(author, "Pollard and Jansson");
                *year = 1982;
                break;
            case XTRACT_SMOOTHNESS:
                strcpy(name, "smoothness");
                strcpy(p_name, "Spectral Smoothness");
                strcpy(desc, "Extract the spectral smoothness of a spectrum");
                strcpy(p_desc, 
                        "Extract the spectral smoothness of an audio spectrum");
                strcpy(author, "McAdams");
                *year = 1999;
                break;
            case XTRACT_FLATNESS:
                strcpy(name, "flatness");
                strcpy(p_name, "Spectral Flatness");
                strcpy(desc, "Extract the spectral flatness of a spectrum");
                strcpy(p_desc, 
                        "Extract the spectral flatness of an audio spectrum");
                strcpy(author, "Tristan Jehan");
                *year = 2005;
                break;
            case XTRACT_FLATNESS_DB:
                strcpy(name, "flatness_db");
                strcpy(p_name, "Log Spectral Flatness");
                strcpy(desc, "Extract the log spectral flatness of a spectrum");
                strcpy(p_desc, 
                        "Extract the log spectral flatness of an audio spectrum");
                strcpy(author, "Peeters");
                *year = 2003;
                break;
            case XTRACT_SPREAD:
                strcpy(name, "spread");
                strcpy(p_name, "Spectral Spread");
                strcpy(desc, "Extract the spectral spread of a spectrum");
                strcpy(p_desc, 
                        "Extract the spectral spread of an audio spectrum");
                strcpy(author, "Norman Casagrande");
                *year = 2005;
                break;
            case XTRACT_ZCR:
                strcpy(name, "zcr");
                strcpy(p_name, "Zero Crossing Rate");
                strcpy(desc, "Extract the zero crossing rate of a vector");
                strcpy(p_desc, 
                        "Extract the zero crossing rate of an audio signal");
                strcpy(author, "");
                break;
            case XTRACT_LOUDNESS:
                strcpy(name, "loudness");
                strcpy(p_name, "Loudness");
                strcpy(desc, 
                        "Extract the loudness of a signal from its spectrum");
                strcpy(p_desc, 
                        "Extract the loudness of an audio signal from its spectrum");
                strcpy(author, "Moore, Glasberg et al");
                *year = 2005;
                break;
            case XTRACT_HIGHEST_VALUE:
                strcpy(name, "highest_value");
                strcpy(p_name, "Highest Value");
                strcpy(desc, "Extract the highest value from an input vector");
                strcpy(p_desc, "Extract the highest value from a given range");
                strcpy(author, "");
                break;
            case XTRACT_SUM:
                strcpy(name, "sum");
                strcpy(p_name, "Sum of Values");
                strcpy(desc, 
                        "Extract the sum of the values in an input vector");
                strcpy(p_desc, 
                        "Extract the sum of the values in a given range");
                strcpy(author, "");
                break;
            case XTRACT_RMS_AMPLITUDE:
                strcpy(name, "rms_amplitude");
                strcpy(p_name, "RMS Amplitude");
                strcpy(desc, "Extract the RMS amplitude of a signal");
                strcpy(p_desc, "Extract the RMS amplitude of an audio signal");
                strcpy(author, "");
                break;
            case XTRACT_POWER:
                strcpy(name, "power");
                strcpy(p_name, "Spectral Power");
                strcpy(desc, "Extract the spectral power of a spectrum");
                strcpy(p_desc, 
                        "Extract the spectral power of an audio spectrum");
                strcpy(author, "Bee Suan Ong");
                *year = 2005;
                break;
            case XTRACT_SHARPNESS:
                strcpy(name, "sharpness");
                strcpy(p_name, "Spectral Sharpness");
                strcpy(desc, "Extract the spectral sharpness of a spectrum");
                strcpy(p_desc, 
                        "Extract the spectral sharpness of an audio spectrum");
                strcpy(author, "");
                break;
            case XTRACT_SPECTRAL_SLOPE:
                strcpy(name, "spectral_slope");
                strcpy(p_name, "Spectral Slope");
                strcpy(desc, "Extract the spectral slope of a spectrum");
                strcpy(p_desc, 
                        "Extract the spectral slope of an audio spectrum");
                strcpy(author, "");
                break;
            case XTRACT_HPS:
                strcpy(name, "hps");
                strcpy(p_name, "Harmonic Product Spectrum");
                strcpy(desc, 
                        "Extract the harmonic product spectrum of a spectrum");
                strcpy(p_desc, 
                        "Extract the harmonic product spectrum of an audio spectrum");
                strcpy(author, "");
                break;
            case XTRACT_FLUX: 
                strcpy(name, "flux");
                strcpy(p_name, "Spectral Flux");
                strcpy(desc, "Extract the spectral flux of a spectrum");
                strcpy(p_desc, 
                        "Extract the spectral flux of an audio spectrum");
                strcpy(author, "");
                break;
            case XTRACT_LNORM: 
                strcpy(name, "lnorm");
                strcpy(p_name, "L-norm");
                strcpy(desc, "Extract the L-norm of a vector");
                strcpy(p_desc, "Extract the L-norm of a vector");
                strcpy(author, "");
                break;
            case XTRACT_ATTACK_TIME: 
                strcpy(name, "attack_time");
                strcpy(p_name, "Attack Time");
                strcpy(desc, "Extract the attack time of a signal");
                strcpy(p_desc, "Extract the attack time of an audio signal");
                strcpy(author, "");
                break;
            case XTRACT_DECAY_TIME: 
                strcpy(name, "decay_time");
                strcpy(p_name, "Decay Time");
                strcpy(desc, "Extract the decay time of a signal");
                strcpy(p_desc, "Extract the decay time of an audio signal");
                strcpy(author, "");
                break;
            case XTRACT_DIFFERENCE_VECTOR: 
                strcpy(name, "difference_vector");
                strcpy(p_name, "Difference vector");
                strcpy(desc, "Extract the difference between two vectors");
                strcpy(p_desc, "Extract the difference between two vectors");
                strcpy(author, "");
                break;
            case XTRACT_AUTOCORRELATION_FFT:
                strcpy(name, "autocorrelation_fft");
                strcpy(p_name, "Autocorrelation (FFT method)");
                strcpy(desc, "Extract the autocorrelation of a signal (fft method)");
                strcpy(p_desc, "Extract the autocorrelation of an audio signal (fft method)");
                strcpy(author, "");
                break;
            case XTRACT_DCT:
                strcpy(name, "dct");
                strcpy(p_name, "Discrete Cosine Transform");
                strcpy(desc, "Extract the DCT of a signal");
                strcpy(p_desc, "Extract the DCT of an audio signal");
                strcpy(author, "");
                break;
            case XTRACT_AUTOCORRELATION:
                strcpy(name, "autocorrelation");
                strcpy(p_name, "Autocorrelation");
                strcpy(desc, "Extract the autocorrelation of a signal");
                strcpy(p_desc, 
                        "Extract the autocorrelation of an audio signal");
                strcpy(author, "");
                break;
            case XTRACT_AMDF:
                strcpy(name, "amdf");
                strcpy(p_name, "Average Magnitude Difference Function");
                strcpy(desc, "Extract the AMDF of a signal");
                strcpy(p_desc, "Extract the AMDF of an audio signal");
                strcpy(author, "");
                break;
            case XTRACT_ASDF:
                strcpy(name, "asdf");
                strcpy(p_name, "Average Squared Difference Function");
                strcpy(desc, "Extract the ASDF of a signal");
                strcpy(p_desc, "Extract the ASDF of an audio signal");
                strcpy(author, "");
                break;
            case XTRACT_NONZERO_COUNT:
                strcpy(name, "nonzero_count");
                strcpy(p_name, "Non-zero count");
                strcpy(desc, 
                        "Extract the number of non-zero elements in the input vector");
                strcpy(p_desc, 
                        "Extract the number of non-zero elements in an input spectrum");
                strcpy(author, "");
                break;
            case XTRACT_WINDOWED:
                strcpy(name, "windowed");
                strcpy(p_name, "Windowed frame");
                strcpy(desc, "Apply a window function to a frame of data");
                strcpy(p_desc, "Apply a window function to a frame of data");
                strcpy(author, "");
                break;
            default:
                strcpy(name, "");
                strcpy(p_name, "");
                strcpy(desc, "");
                strcpy(p_desc, "");
                strcpy(author, "");
                break;
        }

        switch(f){

            case XTRACT_VARIANCE:
            case XTRACT_STANDARD_DEVIATION:
            case XTRACT_AVERAGE_DEVIATION:
            case XTRACT_SPECTRAL_VARIANCE:
            case XTRACT_SPECTRAL_STANDARD_DEVIATION:
            /* case XTRACT_SPECTRAL_AVERAGE_DEVIATION: */
            case XTRACT_SPECTRAL_INHARMONICITY:
            case XTRACT_LOWEST_VALUE:
            case XTRACT_F0:
            case XTRACT_FAILSAFE_F0:
            case XTRACT_FLATNESS_DB:
            case XTRACT_TONALITY:
                *argc = 1;
                *argv_type = XTRACT_FLOAT;
                break;
            case XTRACT_SKEWNESS:
            case XTRACT_KURTOSIS:
            case XTRACT_SPECTRAL_SKEWNESS:
            case XTRACT_SPECTRAL_KURTOSIS:
            case XTRACT_PEAK_SPECTRUM:
            case XTRACT_HARMONIC_SPECTRUM:
            case XTRACT_NOISINESS:
            case XTRACT_CREST:
            case XTRACT_ROLLOFF:
            case XTRACT_FLUX: 
            case XTRACT_LNORM: 
                *argc = 2;
                *argv_type = XTRACT_FLOAT;
                break;
            case XTRACT_SPECTRUM:
                *argc = 4;
                *argv_type = XTRACT_FLOAT;
                break;
            case XTRACT_SUBBANDS:
                *argc = 4;
                *argv_type = XTRACT_INT;
                break;
            case XTRACT_MFCC:
                *argc = 1;
                *argv_type = XTRACT_MEL_FILTER;
                break;
            case XTRACT_LPCC:
                *argc = 1;
                *argv_type = XTRACT_INT;
                break;
            case XTRACT_BARK_COEFFICIENTS:
                *argc = XTRACT_BARK_BANDS;
                *argv_type = XTRACT_INT;
                break;
            case XTRACT_WINDOWED:
                *argc = XTRACT_WINDOW_SIZE;
                *argv_type = XTRACT_FLOAT;
                break;
            case XTRACT_MEAN:
            case XTRACT_SPECTRAL_MEAN:
            case XTRACT_SPECTRAL_CENTROID:
            case XTRACT_IRREGULARITY_K:
            case XTRACT_IRREGULARITY_J:
            case XTRACT_TRISTIMULUS_1:
            case XTRACT_TRISTIMULUS_2:
            case XTRACT_TRISTIMULUS_3:
            case XTRACT_SMOOTHNESS:
            case XTRACT_FLATNESS:
            case XTRACT_SPREAD:
            case XTRACT_ZCR:
            case XTRACT_LOUDNESS:
            case XTRACT_HIGHEST_VALUE:
            case XTRACT_SUM:
            case XTRACT_RMS_AMPLITUDE:
            case XTRACT_POWER:
            case XTRACT_SHARPNESS:
            case XTRACT_SPECTRAL_SLOPE:
            case XTRACT_HPS:
            case XTRACT_ATTACK_TIME: 
            case XTRACT_DECAY_TIME: 
            case XTRACT_DIFFERENCE_VECTOR: 
            case XTRACT_AUTOCORRELATION_FFT:
            case XTRACT_DCT:
            case XTRACT_AUTOCORRELATION:
            case XTRACT_AMDF:
            case XTRACT_ASDF:
            case XTRACT_NONZERO_COUNT:
            case XTRACT_ODD_EVEN_RATIO:
            case XTRACT_LPC:
            default:
                *argc = 0;
                break;
        }

        is_scalar = &d->is_scalar;

        switch(f){
            case XTRACT_MEAN:
            case XTRACT_VARIANCE:
            case XTRACT_STANDARD_DEVIATION:
            case XTRACT_AVERAGE_DEVIATION:
            case XTRACT_SKEWNESS:
            case XTRACT_KURTOSIS:
            case XTRACT_SPECTRAL_MEAN:
            case XTRACT_SPECTRAL_VARIANCE:
            case XTRACT_SPECTRAL_STANDARD_DEVIATION:
            /* case XTRACT_SPECTRAL_AVERAGE_DEVIATION: */
            case XTRACT_SPECTRAL_SKEWNESS:
            case XTRACT_SPECTRAL_KURTOSIS:
            case XTRACT_SPECTRAL_CENTROID:
            case XTRACT_IRREGULARITY_K:
            case XTRACT_IRREGULARITY_J:
            case XTRACT_TRISTIMULUS_1:
            case XTRACT_TRISTIMULUS_2:
            case XTRACT_TRISTIMULUS_3:
            case XTRACT_SMOOTHNESS:
            case XTRACT_SPREAD:
            case XTRACT_ZCR:
            case XTRACT_ROLLOFF:
            case XTRACT_LOUDNESS:
            case XTRACT_FLATNESS:
            case XTRACT_FLATNESS_DB:
            case XTRACT_TONALITY:
            case XTRACT_CREST:
            case XTRACT_NOISINESS:
            case XTRACT_RMS_AMPLITUDE:
            case XTRACT_SPECTRAL_INHARMONICITY:
            case XTRACT_POWER:
            case XTRACT_ODD_EVEN_RATIO:
            case XTRACT_SHARPNESS:
            case XTRACT_SPECTRAL_SLOPE:
            case XTRACT_LOWEST_VALUE:
            case XTRACT_HIGHEST_VALUE:
            case XTRACT_SUM:
            case XTRACT_HPS:
            case XTRACT_F0:
            case XTRACT_FAILSAFE_F0:
            case XTRACT_FLUX:
            case XTRACT_LNORM:
            case XTRACT_NONZERO_COUNT:
                *is_scalar = XTRACT_TRUE;
                break;
            case XTRACT_AUTOCORRELATION:
            case XTRACT_AMDF:
            case XTRACT_ASDF:
            case XTRACT_BARK_COEFFICIENTS:
            case XTRACT_PEAK_SPECTRUM:
            case XTRACT_SPECTRUM:
            case XTRACT_SUBBANDS:
            case XTRACT_AUTOCORRELATION_FFT:
            case XTRACT_MFCC:
            case XTRACT_LPC:
            case XTRACT_LPCC:
            case XTRACT_DCT:
            case XTRACT_HARMONIC_SPECTRUM:
            case XTRACT_DIFFERENCE_VECTOR: 
            case XTRACT_WINDOWED:
                *is_scalar = XTRACT_FALSE;
                break;
            default:
                *is_scalar = XTRACT_TRUE;
                break;

        }

        is_delta = &d->is_delta;

        switch(f){
            case XTRACT_FLUX:
            case XTRACT_LNORM:
            case XTRACT_DIFFERENCE_VECTOR:
                *is_delta = XTRACT_TRUE;
                break;
            case XTRACT_MEAN:
            case XTRACT_VARIANCE:
            case XTRACT_STANDARD_DEVIATION:
            case XTRACT_AVERAGE_DEVIATION:
            case XTRACT_SKEWNESS:
            case XTRACT_KURTOSIS:
            case XTRACT_SPECTRAL_MEAN:
            case XTRACT_SPECTRAL_VARIANCE:
            case XTRACT_SPECTRAL_STANDARD_DEVIATION:
            /* case XTRACT_SPECTRAL_AVERAGE_DEVIATION: */
            case XTRACT_SPECTRAL_SKEWNESS:
            case XTRACT_SPECTRAL_KURTOSIS:
            case XTRACT_SPECTRAL_CENTROID:
            case XTRACT_IRREGULARITY_K:
            case XTRACT_IRREGULARITY_J:
            case XTRACT_TRISTIMULUS_1:
            case XTRACT_TRISTIMULUS_2:
            case XTRACT_TRISTIMULUS_3:
            case XTRACT_SMOOTHNESS:
            case XTRACT_SPREAD:
            case XTRACT_ZCR:
            case XTRACT_ROLLOFF:
            case XTRACT_LOUDNESS:
            case XTRACT_FLATNESS:
            case XTRACT_FLATNESS_DB:
            case XTRACT_TONALITY:
            case XTRACT_CREST:
            case XTRACT_NOISINESS:
            case XTRACT_RMS_AMPLITUDE:
            case XTRACT_SPECTRAL_INHARMONICITY:
            case XTRACT_POWER:
            case XTRACT_ODD_EVEN_RATIO:
            case XTRACT_SHARPNESS:
            case XTRACT_SPECTRAL_SLOPE:
            case XTRACT_LOWEST_VALUE:
            case XTRACT_HIGHEST_VALUE:
            case XTRACT_SUM:
            case XTRACT_HPS:
            case XTRACT_F0:
            case XTRACT_FAILSAFE_F0:
            case XTRACT_NONZERO_COUNT:
            case XTRACT_AUTOCORRELATION:
            case XTRACT_AMDF:
            case XTRACT_ASDF:
            case XTRACT_BARK_COEFFICIENTS:
            case XTRACT_PEAK_SPECTRUM:
            case XTRACT_SPECTRUM:
            case XTRACT_SUBBANDS:
            case XTRACT_AUTOCORRELATION_FFT:
            case XTRACT_MFCC:
            case XTRACT_LPC:
            case XTRACT_LPCC:
            case XTRACT_DCT:
            case XTRACT_HARMONIC_SPECTRUM:
            case XTRACT_WINDOWED:
            default:
                *is_delta = XTRACT_FALSE;
                break;
        }

        if(*is_scalar){

            result_unit = &d->result.scalar.unit;
            result_min = &d->result.scalar.min;
            result_max = &d->result.scalar.max;

            switch(f){
                case XTRACT_MEAN:
                case XTRACT_VARIANCE:
                case XTRACT_STANDARD_DEVIATION:
                case XTRACT_AVERAGE_DEVIATION:
                case XTRACT_SKEWNESS:
                case XTRACT_KURTOSIS:
                case XTRACT_RMS_AMPLITUDE:
                case XTRACT_LOWEST_VALUE:
                case XTRACT_HIGHEST_VALUE:
                case XTRACT_SUM:
                case XTRACT_FLUX:
                case XTRACT_LNORM:
                case XTRACT_NONZERO_COUNT: 
                case XTRACT_WINDOWED:
                    *result_unit = XTRACT_ANY;
                    *result_min = XTRACT_ANY;
                    *result_max = XTRACT_ANY;
                    break;
                case XTRACT_SPECTRAL_SKEWNESS:
                case XTRACT_SPECTRAL_KURTOSIS:
                case XTRACT_IRREGULARITY_K:
                case XTRACT_IRREGULARITY_J:
                case XTRACT_TRISTIMULUS_1:
                case XTRACT_TRISTIMULUS_2:
                case XTRACT_TRISTIMULUS_3:
                case XTRACT_NOISINESS:
                case XTRACT_SMOOTHNESS:
                    *result_unit = XTRACT_NONE;
                    *result_min = XTRACT_ANY; /* FIX: need to check these */
                    *result_max = XTRACT_ANY;
                    break;
                case XTRACT_SPECTRAL_MEAN:
                case XTRACT_SPECTRAL_VARIANCE:
                case XTRACT_SPECTRAL_STANDARD_DEVIATION:
                /* case XTRACT_SPECTRAL_AVERAGE_DEVIATION: */
                case XTRACT_SPECTRAL_CENTROID:
                case XTRACT_SPREAD:
                case XTRACT_F0:
                case XTRACT_FAILSAFE_F0:
                case XTRACT_HPS:
                case XTRACT_ROLLOFF:
                    *result_unit = XTRACT_HERTZ;
                    *result_min = 0.f;
                    *result_max = XTRACT_SR_UPPER_LIMIT / 2;
                    break;
                case XTRACT_ZCR:
                    *result_unit = XTRACT_HERTZ;
                    *result_min = 0.f;
                    *result_max = XTRACT_ANY;
                    break;
                case XTRACT_ODD_EVEN_RATIO:
                    *result_unit = XTRACT_NONE;
                    *result_min = 0.f;
                    *result_max = 1.f; 
                    break;
                case XTRACT_FLATNESS_DB:
                    *result_unit = XTRACT_DBFS;
                    *result_min = XTRACT_ANY; /* FIX: check this */
                    *result_max = XTRACT_ANY; 
                    break;
                case XTRACT_LOUDNESS:
                case XTRACT_FLATNESS:
                case XTRACT_TONALITY:
                case XTRACT_CREST:
                case XTRACT_SPECTRAL_INHARMONICITY:
                case XTRACT_POWER:
                case XTRACT_SHARPNESS:
                case XTRACT_SPECTRAL_SLOPE:
                case XTRACT_LPC:
                case XTRACT_LPCC:
                default:
                    *result_unit = XTRACT_UNKNOWN;
                    *result_min = XTRACT_UNKNOWN;
                    *result_max = XTRACT_UNKNOWN; 
                    break;
            }
        }
        else {

            result_min = NULL;
            result_max = NULL;
            result_unit = &d->result.vector.unit;
            result_format = &d->result.vector.format;

            switch(f) {
                case XTRACT_AUTOCORRELATION:
                case XTRACT_AMDF:
                case XTRACT_ASDF:
                case XTRACT_DCT:
                case XTRACT_SUBBANDS:
                case XTRACT_WINDOWED:
                    *result_format = XTRACT_ARBITRARY_SERIES;
                    *result_unit = XTRACT_ANY;
                    break;
                case XTRACT_BARK_COEFFICIENTS:
                    *result_format = XTRACT_BARK_COEFFS;
                    *result_unit = XTRACT_UNKNOWN; /* FIX: check */
                    break;
                case XTRACT_PEAK_SPECTRUM:
                case XTRACT_SPECTRUM:
                case XTRACT_HARMONIC_SPECTRUM:
                    *result_format = XTRACT_SPECTRAL;
                    *result_unit = XTRACT_ANY_AMPLITUDE_HERTZ;
                    break;
                case XTRACT_AUTOCORRELATION_FFT:
                    break;
                case XTRACT_MFCC:
                    *result_format = XTRACT_MEL_COEFFS;
                    *result_unit = XTRACT_UNKNOWN; /* FIX: check */
                    break;
                case XTRACT_LPC:
                    *result_format = XTRACT_LPC_COEFFS;
                    *result_unit = XTRACT_UNKNOWN;
                    break;
                case XTRACT_LPCC:
                    *result_format = XTRACT_LPCC_COEFFS;
                    *result_unit = XTRACT_UNKNOWN;
                    break;
                default:
                    break;
            }
        }
    }

    return fd;
}

int xtract_free_descriptors(xtract_function_descriptor_t *fd){

    if (fd != NULL) {
        free(fd);
    }

    return XTRACT_SUCCESS;
}