view src/descriptors.c @ 214:f28f66faa016

Add "stateful" feature type with initial feature "last n" Stateful feature extraction functions are functions that require state to be maintained between successive calls. This is necessary, for example when an accumulation of values is required, or changes need to be measured over time. The initial xtract_last_n() function accumulates the last N (single) values from *data and writes them to *result
author Jamie Bullock <jamie@jamiebullock.com>
date Tue, 03 Jun 2014 21:17:07 +0100
parents ef80f7c52c6d
children d383a8c66b5d
line wrap: on
line source
/*
 * Copyright (C) 2012 Jamie Bullock
 *
 * Permission is hereby granted, free of charge, to any person obtaining a copy
 * of this software and associated documentation files (the "Software"), to
 * deal in the Software without restriction, including without limitation the
 * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or
 * sell copies of the Software, and to permit persons to whom the Software is
 * furnished to do so, subject to the following conditions:
 *
 * The above copyright notice and this permission notice shall be included in
 * all copies or substantial portions of the Software.
 *
 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
 * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
 * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
 * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
 * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
 * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS
 * IN THE SOFTWARE.
 *
 */

#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;
    double *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 = (xtract_function_descriptor_t*)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.0;
            *argv_max = XTRACT_SR_UPPER_LIMIT / 2.0;
            *argv_def = XTRACT_FUNDAMENTAL_DEFAULT;
            *argv_unit = XTRACT_HERTZ;
            break;
        case XTRACT_F0:
        case XTRACT_FAILSAFE_F0:
        case XTRACT_WAVELET_F0:
        case XTRACT_MIDICENT:
            *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.0;
            *(argv_max + 1) = 100.0;
            *(argv_def + 1) = 95.0;
            *(argv_unit + 1) = XTRACT_PERCENT;
            break;
        case XTRACT_PEAK_SPECTRUM:
            *argv_min  = XTRACT_SR_LOWER_LIMIT / 2.0;
            *argv_max = XTRACT_SR_UPPER_LIMIT / 2.0;
            *argv_def = XTRACT_SR_DEFAULT / 2.0;
            *argv_unit = XTRACT_HERTZ;
            *(argv_min + 1) = 0.0;
            *(argv_max + 1) = 100.0 ;
            *(argv_def + 1) = 10.0 ;
            *(argv_unit + 1) = XTRACT_PERCENT;
            break;
        case XTRACT_HARMONIC_SPECTRUM:
            *argv_min = 0.0;
            *argv_max = XTRACT_SR_UPPER_LIMIT / 2.0;
            *argv_def = XTRACT_FUNDAMENTAL_DEFAULT;
            *argv_unit = XTRACT_HERTZ;
            *(argv_min + 1) = 0.0;
            *(argv_max + 1) = 1.0 ;
            *(argv_def + 1) = .1 ;
            *(argv_unit + 1) = (xtract_unit_t)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_unit_t)XTRACT_NONE;
            *(argv_min + 1) = XTRACT_NONE;
            *(argv_max + 1) = XTRACT_NONE;
            *(argv_def + 1) = XTRACT_NONE;
            *(argv_unit + 1) = (xtract_unit_t)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_unit_t)XTRACT_NONE;
            *(argv_min + 2) = 0;
            *(argv_max + 2) = 1;
            *(argv_def + 2) = 0;
            *(argv_unit + 2) = (xtract_unit_t)XTRACT_NONE;
            *(argv_min + 3) = 0;
            *(argv_max + 3) = 1;
            *(argv_def + 3) = 0;
            *(argv_unit + 3) = (xtract_unit_t)XTRACT_NONE;
            break;
        case XTRACT_SUBBANDS:
            *argv_min  = XTRACT_ANY;
            *argv_max = XTRACT_ANY;
            *argv_def = XTRACT_MEAN;
            *argv_unit = (xtract_unit_t)XTRACT_NONE;
            *(argv_min + 1) = 1;
            *(argv_max + 1) = 16384;
            *(argv_def + 1) = 4;
            *(argv_unit + 1) = (xtract_unit_t)XTRACT_NONE;
            *(argv_min + 2) = 0;
            *(argv_max + 2) = 32;
            *(argv_def + 2) = 0;
            *(argv_unit + 2) = (xtract_unit_t)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_unit_t)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:
        case XTRACT_WAVELET_F0:
        case XTRACT_MIDICENT:
            *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_WAVELET_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:
        case XTRACT_MIDICENT:
        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_WAVELET_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_unit_t)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_WAVELET_F0:
            strcpy(name, "wavelet_f0");
            strcpy(p_name, "Fundamental Frequency (wavelet method)");
            strcpy(desc, "Extract the fundamental frequency of a signal (wavelet method)");
            strcpy(p_desc,
                   "Extract the fundamental frequency of an audio signal (wavelet method)");
            strcpy(author, "Antoine Schmitt");
            break;
        case XTRACT_MIDICENT:
                strcpy(name, "midicent");
                strcpy(p_name, "Frequency to MIDI Cent conversion");
                strcpy(desc, "Convert frequency in Hertz to Pitch in MIDI cents");
                strcpy(p_desc, "Convert frequency in Hertz to Pitch in MIDI cents");
                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_WAVELET_F0:
        case XTRACT_MIDICENT:
        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_WAVELET_F0:
        case XTRACT_MIDICENT:
        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_WAVELET_F0:
        case XTRACT_MIDICENT:
        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_unit_t)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_unit_t)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_WAVELET_F0:
            case XTRACT_HPS:
            case XTRACT_ROLLOFF:
                *result_unit = XTRACT_HERTZ;
                *result_min = 0.0;
                *result_max = XTRACT_SR_UPPER_LIMIT / 2.0;
                break;
            case XTRACT_MIDICENT:
                *result_unit = XTRACT_MIDI_CENT;
                *result_min = 0.0;
                *result_max = 12700;
            case XTRACT_ZCR:
                *result_unit = XTRACT_HERTZ;
                *result_min = 0.0;
                *result_max = XTRACT_ANY;
                break;
            case XTRACT_ODD_EVEN_RATIO:
                *result_unit = (xtract_unit_t)XTRACT_NONE;
                *result_min = 0.0;
                *result_max = 1.0;
                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_unit_t)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_unit_t)XTRACT_ANY;
                break;
            case XTRACT_BARK_COEFFICIENTS:
                *result_format = XTRACT_BARK_COEFFS;
                *result_unit = (xtract_unit_t)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_unit_t)XTRACT_UNKNOWN; /* FIX: check */
                break;
            case XTRACT_LPC:
                *result_format = XTRACT_LPC_COEFFS;
                *result_unit = (xtract_unit_t)XTRACT_UNKNOWN;
                break;
            case XTRACT_LPCC:
                *result_format = XTRACT_LPCC_COEFFS;
                *result_unit = (xtract_unit_t)XTRACT_UNKNOWN;
                break;
            default:
                break;
            }
        }
    }

    return fd;
}

int xtract_free_descriptors(xtract_function_descriptor_t *fd)
{

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

    return XTRACT_SUCCESS;
}