jamie@1: /* libxtract feature extraction library jamie@1: * jamie@1: * Copyright (C) 2006 Jamie Bullock jamie@1: * jamie@1: * This program is free software; you can redistribute it and/or modify jamie@1: * it under the terms of the GNU General Public License as published by jamie@1: * the Free Software Foundation; either version 2 of the License, or jamie@1: * (at your option) any later version. jamie@1: * jamie@1: * This program is distributed in the hope that it will be useful, jamie@1: * but WITHOUT ANY WARRANTY; without even the implied warranty of jamie@1: * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the jamie@1: * GNU General Public License for more details. jamie@1: * jamie@1: * You should have received a copy of the GNU General Public License jamie@1: * along with this program; if not, write to the Free Software jamie@1: * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, jamie@1: * USA. jamie@1: */ jamie@1: jamie@2: /** \file xtract_scalar.h: declares functions that extract a feature as a single value from an input vector */ jamie@1: jamie@1: #ifndef XTRACT_SCALAR jamie@1: #define XTRACT_SCALAR jamie@1: jamie@1: #ifdef __cplusplus jamie@1: extern "C" { jamie@1: #endif jamie@1: jamie@1: jamie@2: /** \brief Extract the mean of an input vector jamie@2: * jamie@2: * \param *data: a pointer to the first element in an array of floats jamie@2: * \param N: the number of array elements to be considered jamie@2: * \param *argv: a pointer to NULL jamie@2: * \param *result: the mean of N values from the array pointed to by *data jamie@2: */ jamie@2: int xtract_mean(float *data, int N, void *argv, float *result); jamie@1: jamie@2: /** \brief Extract the variance of an input vector jamie@2: * jamie@2: * \param *data: a pointer to the first element in an array of floats jamie@2: * \param N: the number of elements to be considered jamie@2: * \param *argv: a pointer to a value representing the mean of the input vector jamie@2: * \param *result: the variance of N values from the array pointed to by *data jamie@2: */ jamie@1: int xtract_variance(float *data, int N, void *argv, float *result); jamie@2: jamie@2: /** \brief Extract the deviation of an input vector jamie@2: * jamie@2: * \param *data: a pointer to the first element in an array of floats jamie@2: * \param N: the number of elements to be considered jamie@2: * \param *argv: a pointer to a value representing the variance of the input vector jamie@2: * \param *result: the deviation of N values from the array pointed to by *data jamie@2: */ jamie@1: int xtract_standard_deviation(float *data, int N, void *argv, float *result); jamie@2: jamie@2: /** \brief Extract the average deviation of an input vector jamie@2: * jamie@2: * \param *data: a pointer to the first element in an array of floats jamie@2: * \param N: the number of elements to be considered jamie@2: * \param *argv: a pointer to a value representing the mean of the input vector jamie@2: * \param *result: the average deviation of N values from the array pointed to by *data jamie@2: */ jamie@1: int xtract_average_deviation(float *data, int N, void *argv, float *result); jamie@2: jamie@2: /** \brief Extract the skewness of an input vector jamie@2: * jamie@2: * \param *data: a pointer to the first element in an array of floats jamie@2: * \param N: the number of elements to be considered jamie@2: * \param *argv: a pointer to an array of values representing the mean and standard deviation of the input vector jamie@2: * \param *result: the skewness of N values from the array pointed to by *data jamie@2: */ jamie@1: int xtract_skewness(float *data, int N, void *argv, float *result); jamie@2: jamie@2: /** \brief Extract the kurtosis of an input vector jamie@2: * jamie@2: * \param *data: a pointer to the first element in an array of floats jamie@2: * \param N: the number of elements to be considered jamie@2: * \param *argv: a pointer to an array of values representing the mean and standard deviation of the input vector jamie@2: * \param *result: the kurtosis of N values from the array pointed to by *data jamie@2: */ jamie@1: int xtract_kurtosis(float *data, int N, void *argv, float *result); jamie@1: jamie@11: /** \brief Extract the kurtosis of an input vector jamie@11: * jamie@11: * \param *data: a pointer to the first element in an array of floats represeting a frequency spectrum of size N/2 and a magnitude peak spectrum of size N/2 (This is the output format of xtract_peaks) jamie@11: * \param N: the number of elements to be considered jamie@11: * \param *argv: a pointer to NULL jamie@11: * \param *result: the centroid of the values pointed to by *data jamie@11: */ jamie@11: int xtract_centroid(float *data, int N, void *argv, float *result); jamie@11: jamie@2: /** \brief Calculate the Irregularity of an input vector using a method described by Krimphoff (1994) jamie@2: * jamie@2: * \param *data: a pointer to the first element in an array of floats representing the magnitude spectrum of an audio vector jamie@2: * \param N: the number of elements to be considered jamie@2: * \param *argv: a pointer to NULL jamie@2: * \param *result: the irregularity of N values from the array pointed to by *data jamie@2: */ jamie@2: int xtract_irregularity_k(float *data, int N, void *argv, float *result); jamie@1: jamie@2: /** \brief Calculate the Irregularity of an input vector using a method described by Jensen (1999) jamie@2: * jamie@2: * \param *data: a pointer to the first element in an array of floats representing the magnitude spectrum of an audio vector jamie@2: * \param N: the number of elements to be considered jamie@2: * \param *argv: a pointer to NULL jamie@2: * \param *result: the irregularity of N values from the array pointed to by *data jamie@2: */ jamie@1: int xtract_irregularity_j(float *data, int N, void *argv, float *result); jamie@1: jamie@2: /** \brief Calculate the Tristimulus of an input vector using a method described by Pollard and Jansson (1982) jamie@2: * jamie@2: * \param *data: a pointer to the first element in an array of floats representing the amplitudes of the harmonic spectrum of an audio vector jamie@2: * \param N: the number of elements to be considered jamie@2: * \param *argv: a pointer to NULL jamie@2: * \param *result: the tristimulus of N values from the array pointed to by *data jamie@2: * jamie@2: * These three functions provide the first, second and third order tristimulus formulae jamie@2: * jamie@2: */ jamie@1: int xtract_tristimulus_1(float *data, int N, void *argv, float *result); jamie@1: int xtract_tristimulus_2(float *data, int N, void *argv, float *result); jamie@1: int xtract_tristimulus_3(float *data, int N, void *argv, float *result); jamie@1: jamie@2: /** \brief Extract the smoothness of an input vector using a method described by McAdams (1999) jamie@2: * jamie@2: * \param *data: a pointer to the first element in an array of floats representing the magnitude spectrum of an audio vector jamie@2: * \param N: the number of elements to be considered jamie@2: * \param *argv: a pointer to NULL jamie@2: * \param *result: the smoothness of N values from the array pointed to by *data jamie@2: */ jamie@1: int xtract_smoothness(float *data, int N, void *argv, float *result); jamie@1: jamie@2: /** \brief Extract the spectral spread of an input vector using a method described by Casagrande(2005) jamie@2: * jamie@2: * \param *data: a pointer to the first element in an array of floats representing the magnitude spectrum of an audio vector jamie@2: * \param N: the number of elements to be considered jamie@2: * \param *argv: a pointer to NULL jamie@2: * \param *result: the spectral spread of N values from the array pointed to by *data jamie@2: */ jamie@1: int xtract_spread(float *data, int N, void *argv, float *result); jamie@1: jamie@1: /* Zero crossing rate */ jamie@1: jamie@2: /** \brief Extract the zero crossing rate of an input vector jamie@2: * jamie@2: * \param *data: a pointer to the first element in an array of floats jamie@2: * \param N: the number of elements to be considered jamie@2: * \param *argv: a pointer to NULL jamie@2: * \param *result: the zero crossing rate of N values from the array pointed to by *data jamie@2: */ jamie@1: int xtract_zcr(float *data, int N, void *argv, float *result); jamie@1: jamie@2: /** \brief Extract the spectral rolloff of an input vector using a method described by Bee Suan Ong (2005) jamie@2: * jamie@2: * \param *data: a pointer to the first element in an array of floats representing the magnitude spectrum of an audio vector jamie@2: * \param N: the number of elements to be considered jamie@2: * \param *argv: a pointer to a floating point value representing the threshold for rolloff, i.e. the percentile at which the rolloff is determined jamie@2: * \param *result: the spectral rolloff of N values from the array pointed to by *data jamie@2: */ jamie@1: int xtract_rolloff(float *data, int N, void *argv, float *result); jamie@1: jamie@1: /* Loudness */ jamie@1: /* A set of BARK_BANDS bark coefficients must be passed in, the loudness is calculated approximately according to Moore, Glasberg et al, 1997 */ jamie@1: jamie@2: /** \brief Extract the loudness of an input vector using a method described by Moore, Glasberg et al (2005) jamie@2: * jamie@2: * \param *data: a pointer to the first element in an array of floats representing a set of BARK_BANDS bark coefficients jamie@2: * \param N: the number of coefficients to be considered jamie@2: * \param *argv: a pointer to NULL jamie@2: * \param *result: the loudness of N values from the array pointed to by *data jamie@2: */ jamie@1: int xtract_loudness(float *data, int N, void *argv, float *result); jamie@1: jamie@2: /** \brief Extract the spectral flatness measure of an input vector using a method described by Tristan Jehan (2005) jamie@2: * jamie@2: * \param *data: a pointer to the first element in an array of floats representing the magnitude spectrum of an audio vector jamie@2: * \param N: the number of elements to be considered jamie@2: * \param *argv: a pointer to NULL jamie@2: * \param *result: the spectral flatness of N values from the array pointed to by *data jamie@2: */ jamie@1: int xtract_flatness(float *data, int N, void *argv, float *result); jamie@1: jamie@1: jamie@2: /** \brief Extract the tonality factor of an input vector using a method described by Tristan Jehan (2005) jamie@2: * jamie@2: * \param *data: a pointer to the first element in an array of floats representing the spectral peaks of an audio vector jamie@2: * \param N: the number of elements to be considered jamie@2: * \param *argv: a pointer to NULL jamie@2: * \param *result: the tonality factor of N values from the array pointed to by *data jamie@2: */ jamie@1: int xtract_tonality(float *data, int N, void *argv, float *result); jamie@1: jamie@2: /** \brief Extract the noisiness of an input vector using a method described by Tae Hong Park (2000) jamie@2: * jamie@2: * \param *data: a pointer to the first element in an array of floats representing the magnitude spectrum of an audio vector jamie@2: * \param N: the number of elements to be considered jamie@2: * \param *argv: a pointer to NULL jamie@2: * \param *result: the noisiness of N values from the array pointed to by *data jamie@2: */ jamie@1: int xtract_noisiness(float *data, int N, void *argv, float *result); jamie@1: jamie@2: /** \brief Extract the RMS amplitude of an input vector using a method described by Tae Hong Park (2000) jamie@2: * jamie@2: * \param *data: a pointer to the first element in an array of floats jamie@2: * \param N: the number of elements to be considered jamie@2: * \param *argv: a pointer to NULL jamie@2: * \param *result: the RMS amplitude of N values from the array pointed to by *data jamie@2: */ jamie@1: int xtract_rms_amplitude(float *data, int N, void *argv, float *result); jamie@1: jamie@2: /** \brief Extract the Inharmonicity of an input vector jamie@2: * jamie@2: * \param *data: a pointer to the first element in an array of floats representing the amplitudes of the spectral peaks in an audio vector jamie@2: * \param N: the number of elements to be considered jamie@2: * \param *argv: a pointer to a multidimensional array containing the fundamental frequency of the input vector in the first element of the first dimension, and the frequencies of the spectral peaks in the second dimension jamie@2: * \param *result: the inharmonicity of N values from the array pointed to by *data jamie@2: */ jamie@1: int xtract_inharmonicity(float *data, int N, void *argv, float *result); jamie@1: jamie@2: /** \brief Extract the spectral crest of an input vector using a method described by Peeters (2003) jamie@2: * jamie@2: * \param *data: a pointer to the first element in an array of floats representing the magnitude spectrum of an audio vector jamie@2: * \param N: the number of elements to be considered jamie@2: * \param *argv: a pointer to NULL jamie@2: * \param *result: the spectral crest of N values from the array pointed to by *data jamie@2: */ jamie@1: int xtract_crest(float *data, int N, void *argv, float *result); jamie@1: jamie@2: /** \brief Extract the Spectral Power of an input vector using a method described by Bee Suan Ong (2005) jamie@2: * jamie@2: * \param *data: a pointer to the first element in an array of floats representing the magnitude spectrum of an audio vector jamie@2: * \param N: the number of elements to be considered jamie@2: * \param *argv: a pointer to NULL jamie@2: * \param *result: the spectral power of N values from the array pointed to by *data jamie@2: */ jamie@1: int xtract_power(float *data, int N, void *argv, float *result); jamie@1: jamie@1: /* Odd to even harmonic ratio */ jamie@2: /** \brief Extract the Odd to even harmonic ratio of an input vector jamie@2: * jamie@2: * \param *data: a pointer to the first element in an array of floats representing the harmonic spectrum of an audio vector jamie@2: * \param N: the number of elements to be considered jamie@2: * \param *argv: a pointer to NULL jamie@2: * \param *result: the odd/even harmonic ratio of N values from the array pointed to by *data jamie@2: */ jamie@1: int xtract_odd_even_ratio(float *data, int N, void *argv, float *result); jamie@1: jamie@2: /** \brief Extract the Sharpness of an input vector jamie@2: * jamie@2: * \param *data: a pointer to the first element in an array of floats representing the magnitude spectrum of an audio vector jamie@2: * \param N: the number of elements to be considered jamie@2: * \param *argv: a pointer to NULL jamie@2: * \param *result: the Sharpness of N values from the array pointed to by *data jamie@2: */ jamie@1: int xtract_sharpness(float *data, int N, void *argv, float *result); jamie@1: jamie@2: /** \brief Extract the Slope of an input vector jamie@2: * jamie@2: * \param *data: a pointer to the first element in an array of floats representing the magnitude spectrum of an audio vector jamie@2: * \param N: the number of elements to be considered jamie@2: * \param *argv: a pointer to NULL jamie@2: * \param *result: the Slope of N values from the array pointed to by *data jamie@2: */ jamie@1: int xtract_slope(float *data, int N, void *argv, float *result); jamie@1: jamie@5: /** \brief Extract the value of the first partial in an input vector that closely matches a certain 'guess' jamie@2: * jamie@2: * \param *data: a pointer to the first element in an array of floats that represents the frequencies of the spectral peaks of an audio vector jamie@2: * \param N: the number of elements to be considered jamie@5: * \param *argv: a pointer to a float value representing the guess jamie@2: * \param *result: the F0 of N values from the array pointed to by *data jamie@2: * jamie@2: * This method takes a guess which can come from taking the ZCR of an autocorrelation function, and then finds the spectral peak that most closely matches the gess */ jamie@5: int xtract_lowest_match(float *data, int N, void *argv, float *result); jamie@1: jamie@2: /** \brief Extract the Pitch of an input vector using Harmonic Product Spectrum (HPS) analysis jamie@2: * jamie@2: * \param *data: a pointer to the first element in an array of floats representing the magnitude spectrum of an audio vector jamie@2: * \param N: the number of elements to be considered jamie@2: * \param *argv: a pointer to NULL jamie@2: * \param *result: the pitch of N values from the array pointed to by *data jamie@2: */ jamie@1: int xtract_hps(float *data, int N, void *argv, float *result); jamie@1: jamie@5: /** \brief Extract the fundamental frequency of an input vector jamie@5: * jamie@5: * \param *data: a pointer to the first element in an array of floats representing an audio vector jamie@5: * \param N: the number of elements to be considered jamie@5: * \param *argv: a pointer to NULL jamie@5: * \param *result: the pitch of N values from the array pointed to by *data jamie@5: */ jamie@5: int xtract_f0(float *data, int N, void *argv, float *result); jamie@5: jamie@1: #ifdef __cplusplus jamie@1: } jamie@1: #endif jamie@1: jamie@1: #endif jamie@1: jamie@1: jamie@1: