annotate xtract/xtract_scalar.h @ 43:4a36f70a76e9

Numerous fixes and enhancements, see ChangeLog.
author Jamie Bullock <jamie@postlude.co.uk>
date Fri, 15 Dec 2006 21:17:12 +0000
parents 84e69b155098
children e8f4c56de591
rev   line source
jamie@1 1 /* libxtract feature extraction library
jamie@1 2 *
jamie@1 3 * Copyright (C) 2006 Jamie Bullock
jamie@1 4 *
jamie@1 5 * This program is free software; you can redistribute it and/or modify
jamie@1 6 * it under the terms of the GNU General Public License as published by
jamie@1 7 * the Free Software Foundation; either version 2 of the License, or
jamie@1 8 * (at your option) any later version.
jamie@1 9 *
jamie@1 10 * This program is distributed in the hope that it will be useful,
jamie@1 11 * but WITHOUT ANY WARRANTY; without even the implied warranty of
jamie@1 12 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
jamie@1 13 * GNU General Public License for more details.
jamie@1 14 *
jamie@1 15 * You should have received a copy of the GNU General Public License
jamie@1 16 * along with this program; if not, write to the Free Software
jamie@1 17 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301,
jamie@1 18 * USA.
jamie@1 19 */
jamie@1 20
jamie@2 21 /** \file xtract_scalar.h: declares functions that extract a feature as a single value from an input vector */
jamie@1 22
jamie@1 23 #ifndef XTRACT_SCALAR
jamie@1 24 #define XTRACT_SCALAR
jamie@1 25
jamie@1 26 #ifdef __cplusplus
jamie@1 27 extern "C" {
jamie@1 28 #endif
jamie@1 29
jamie@20 30 /**
jamie@20 31 * \defgroup scalar extraction functions
jamie@20 32 *
jamie@20 33 * Defines scalar extraction functions, and their parameters.
jamie@20 34 * @{
jamie@20 35 */
jamie@1 36
jamie@2 37 /** \brief Extract the mean of an input vector
jamie@2 38 *
jamie@2 39 * \param *data: a pointer to the first element in an array of floats
jamie@2 40 * \param N: the number of array elements to be considered
jamie@2 41 * \param *argv: a pointer to NULL
jamie@2 42 * \param *result: the mean of N values from the array pointed to by *data
jamie@2 43 */
jamie@43 44 int xtract_mean(const float *data, const int N, const void *argv, float *result);
jamie@1 45
jamie@2 46 /** \brief Extract the variance of an input vector
jamie@2 47 *
jamie@2 48 * \param *data: a pointer to the first element in an array of floats
jamie@2 49 * \param N: the number of elements to be considered
jamie@41 50 * \param *argv: a pointer to a float representing the mean of the input vector
jamie@2 51 * \param *result: the variance of N values from the array pointed to by *data
jamie@2 52 */
jamie@43 53 int xtract_variance(const float *data, const int N, const void *argv, float *result);
jamie@2 54
jamie@2 55 /** \brief Extract the deviation of an input vector
jamie@2 56 *
jamie@2 57 * \param *data: a pointer to the first element in an array of floats
jamie@2 58 * \param N: the number of elements to be considered
jamie@41 59 * \param *argv: a pointer to a float representing the variance of the input vector
jamie@2 60 * \param *result: the deviation of N values from the array pointed to by *data
jamie@2 61 */
jamie@43 62 int xtract_standard_deviation(const float *data, const int N, const void *argv, float *result);
jamie@2 63
jamie@2 64 /** \brief Extract the average deviation of an input vector
jamie@2 65 *
jamie@2 66 * \param *data: a pointer to the first element in an array of floats
jamie@2 67 * \param N: the number of elements to be considered
jamie@41 68 * \param *argv: a pointer to a float representing the mean of the input vector
jamie@2 69 * \param *result: the average deviation of N values from the array pointed to by *data
jamie@2 70 */
jamie@43 71 int xtract_average_deviation(const float *data, const int N, const void *argv, float *result);
jamie@2 72
jamie@2 73 /** \brief Extract the skewness of an input vector
jamie@2 74 *
jamie@2 75 * \param *data: a pointer to the first element in an array of floats
jamie@2 76 * \param N: the number of elements to be considered
jamie@41 77 * \param *argv: a pointer to an array of floats representing the mean and standard deviation of the input vector
jamie@2 78 * \param *result: the skewness of N values from the array pointed to by *data
jamie@2 79 */
jamie@43 80 int xtract_skewness(const float *data, const int N, const void *argv, float *result);
jamie@2 81
jamie@2 82 /** \brief Extract the kurtosis of an input vector
jamie@2 83 *
jamie@2 84 * \param *data: a pointer to the first element in an array of floats
jamie@2 85 * \param N: the number of elements to be considered
jamie@2 86 * \param *argv: a pointer to an array of values representing the mean and standard deviation of the input vector
jamie@2 87 * \param *result: the kurtosis of N values from the array pointed to by *data
jamie@2 88 */
jamie@43 89 int xtract_kurtosis(const float *data, const int N, const void *argv, float *result);
jamie@1 90
jamie@41 91 /** \brief Extract the centroid of an input vector
jamie@11 92 *
jamie@11 93 * \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 94 * \param N: the number of elements to be considered
jamie@11 95 * \param *argv: a pointer to NULL
jamie@11 96 * \param *result: the centroid of the values pointed to by *data
jamie@11 97 */
jamie@43 98 int xtract_centroid(const float *data, const int N, const void *argv, float *result);
jamie@11 99
jamie@2 100 /** \brief Calculate the Irregularity of an input vector using a method described by Krimphoff (1994)
jamie@2 101 *
jamie@2 102 * \param *data: a pointer to the first element in an array of floats representing the magnitude spectrum of an audio vector
jamie@2 103 * \param N: the number of elements to be considered
jamie@2 104 * \param *argv: a pointer to NULL
jamie@2 105 * \param *result: the irregularity of N values from the array pointed to by *data
jamie@2 106 */
jamie@43 107 int xtract_irregularity_k(const float *data, const int N, const void *argv, float *result);
jamie@1 108
jamie@2 109 /** \brief Calculate the Irregularity of an input vector using a method described by Jensen (1999)
jamie@2 110 *
jamie@2 111 * \param *data: a pointer to the first element in an array of floats representing the magnitude spectrum of an audio vector
jamie@2 112 * \param N: the number of elements to be considered
jamie@2 113 * \param *argv: a pointer to NULL
jamie@2 114 * \param *result: the irregularity of N values from the array pointed to by *data
jamie@2 115 */
jamie@43 116 int xtract_irregularity_j(const float *data, const int N, const void *argv, float *result);
jamie@1 117
jamie@2 118 /** \brief Calculate the Tristimulus of an input vector using a method described by Pollard and Jansson (1982)
jamie@2 119 *
jamie@42 120 * \param *data: a pointer to the first element in an array of floats representing the amplitudes of the harmonic spectrum of an audio vector e.g. a pointer to the second half of the array pointed to by *result from xtract_harmonics(). The amplitudes of the peak spectrum (e.g. *result from xtract_peaks()) can be used if one wishes to consider all partials not just harmonics.
jamie@2 121 * \param N: the number of elements to be considered
jamie@2 122 * \param *argv: a pointer to NULL
jamie@2 123 * \param *result: the tristimulus of N values from the array pointed to by *data
jamie@2 124 *
jamie@2 125 * These three functions provide the first, second and third order tristimulus formulae
jamie@2 126 *
jamie@2 127 */
jamie@43 128 int xtract_tristimulus_1(const float *data, const int N, const void *argv, float *result);
jamie@43 129 int xtract_tristimulus_2(const float *data, const int N, const void *argv, float *result);
jamie@43 130 int xtract_tristimulus_3(const float *data, const int N, const void *argv, float *result);
jamie@1 131
jamie@2 132 /** \brief Extract the smoothness of an input vector using a method described by McAdams (1999)
jamie@2 133 *
jamie@2 134 * \param *data: a pointer to the first element in an array of floats representing the magnitude spectrum of an audio vector
jamie@2 135 * \param N: the number of elements to be considered
jamie@43 136 * \param *argv: a pointer to the first element of an array of integers containing the lower bound, upper bound, and pre-scaling factor, whereby array data in the range lower < n < upper will be pre-scaled by p before processing.
jamie@2 137 * \param *result: the smoothness of N values from the array pointed to by *data
jamie@2 138 */
jamie@43 139 int xtract_smoothness(const float *data, const int N, const void *argv, float *result);
jamie@1 140
jamie@2 141 /** \brief Extract the spectral spread of an input vector using a method described by Casagrande(2005)
jamie@2 142 *
jamie@2 143 * \param *data: a pointer to the first element in an array of floats representing the magnitude spectrum of an audio vector
jamie@2 144 * \param N: the number of elements to be considered
jamie@2 145 * \param *argv: a pointer to NULL
jamie@2 146 * \param *result: the spectral spread of N values from the array pointed to by *data
jamie@2 147 */
jamie@43 148 int xtract_spread(const float *data, const int N, const void *argv, float *result);
jamie@1 149
jamie@1 150 /* Zero crossing rate */
jamie@1 151
jamie@2 152 /** \brief Extract the zero crossing rate of an input vector
jamie@2 153 *
jamie@2 154 * \param *data: a pointer to the first element in an array of floats
jamie@2 155 * \param N: the number of elements to be considered
jamie@2 156 * \param *argv: a pointer to NULL
jamie@2 157 * \param *result: the zero crossing rate of N values from the array pointed to by *data
jamie@2 158 */
jamie@43 159 int xtract_zcr(const float *data, const int N, const void *argv, float *result);
jamie@1 160
jamie@2 161 /** \brief Extract the spectral rolloff of an input vector using a method described by Bee Suan Ong (2005)
jamie@2 162 *
jamie@2 163 * \param *data: a pointer to the first element in an array of floats representing the magnitude spectrum of an audio vector
jamie@2 164 * \param N: the number of elements to be considered
jamie@42 165 * \param *argv: a pointer to an array containing a floating point value representing the threshold for rolloff, i.e. the percentile at which the rolloff is determined, expressed in the range 0-1.0, and a float representing the sample rate in Hz
jamie@42 166 * \param *result: the spectral rolloff in Hz of N values from the array pointed to by *data. This is the point in the spectrum below which argv[0] of the energy is distributed.
jamie@2 167 */
jamie@43 168 int xtract_rolloff(const float *data, const int N, const void *argv, float *result);
jamie@1 169
jamie@1 170 /* Loudness */
jamie@1 171 /* 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 172
jamie@2 173 /** \brief Extract the loudness of an input vector using a method described by Moore, Glasberg et al (2005)
jamie@2 174 *
jamie@2 175 * \param *data: a pointer to the first element in an array of floats representing a set of BARK_BANDS bark coefficients
jamie@2 176 * \param N: the number of coefficients to be considered
jamie@2 177 * \param *argv: a pointer to NULL
jamie@2 178 * \param *result: the loudness of N values from the array pointed to by *data
jamie@2 179 */
jamie@43 180 int xtract_loudness(const float *data, const int N, const void *argv, float *result);
jamie@1 181
jamie@2 182 /** \brief Extract the spectral flatness measure of an input vector using a method described by Tristan Jehan (2005)
jamie@2 183 *
jamie@2 184 * \param *data: a pointer to the first element in an array of floats representing the magnitude spectrum of an audio vector
jamie@2 185 * \param N: the number of elements to be considered
jamie@2 186 * \param *argv: a pointer to NULL
jamie@2 187 * \param *result: the spectral flatness of N values from the array pointed to by *data
jamie@2 188 */
jamie@43 189 int xtract_flatness(const float *data, const int N, const void *argv, float *result);
jamie@1 190
jamie@1 191
jamie@2 192 /** \brief Extract the tonality factor of an input vector using a method described by Tristan Jehan (2005)
jamie@2 193 *
jamie@42 194 * \param *data: not used.
jamie@42 195 * \param N: not used
jamie@42 196 * \param *argv: a pointer to the spectral flatness measure of an audio vector (e.g. the output from xtract_flatness)
jamie@2 197 * \param *result: the tonality factor of N values from the array pointed to by *data
jamie@2 198 */
jamie@43 199 int xtract_tonality(const float *data, const int N, const void *argv, float *result);
jamie@1 200
jamie@2 201 /** \brief Extract the noisiness of an input vector using a method described by Tae Hong Park (2000)
jamie@2 202 *
jamie@2 203 * \param *data: a pointer to the first element in an array of floats representing the magnitude spectrum of an audio vector
jamie@2 204 * \param N: the number of elements to be considered
jamie@2 205 * \param *argv: a pointer to NULL
jamie@2 206 * \param *result: the noisiness of N values from the array pointed to by *data
jamie@2 207 */
jamie@43 208 int xtract_noisiness(const float *data, const int N, const void *argv, float *result);
jamie@1 209
jamie@2 210 /** \brief Extract the RMS amplitude of an input vector using a method described by Tae Hong Park (2000)
jamie@2 211 *
jamie@2 212 * \param *data: a pointer to the first element in an array of floats
jamie@2 213 * \param N: the number of elements to be considered
jamie@2 214 * \param *argv: a pointer to NULL
jamie@2 215 * \param *result: the RMS amplitude of N values from the array pointed to by *data
jamie@2 216 */
jamie@43 217 int xtract_rms_amplitude(const float *data, const int N, const void *argv, float *result);
jamie@1 218
jamie@2 219 /** \brief Extract the Inharmonicity of an input vector
jamie@2 220 *
jamie@41 221 * \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@2 222 * \param N: the number of elements to be considered
jamie@41 223 * \param *argv: a pointer to a float representing the fundamental frequency of the input vector.
jamie@2 224 * \param *result: the inharmonicity of N values from the array pointed to by *data
jamie@2 225 */
jamie@43 226 int xtract_inharmonicity(const float *data, const int N, const void *argv, float *result);
jamie@1 227
jamie@2 228 /** \brief Extract the spectral crest of an input vector using a method described by Peeters (2003)
jamie@2 229 *
jamie@2 230 * \param *data: a pointer to the first element in an array of floats representing the magnitude spectrum of an audio vector
jamie@2 231 * \param N: the number of elements to be considered
jamie@2 232 * \param *argv: a pointer to NULL
jamie@2 233 * \param *result: the spectral crest of N values from the array pointed to by *data
jamie@2 234 */
jamie@43 235 int xtract_crest(const float *data, const int N, const void *argv, float *result);
jamie@1 236
jamie@2 237 /** \brief Extract the Spectral Power of an input vector using a method described by Bee Suan Ong (2005)
jamie@2 238 *
jamie@2 239 * \param *data: a pointer to the first element in an array of floats representing the magnitude spectrum of an audio vector
jamie@2 240 * \param N: the number of elements to be considered
jamie@2 241 * \param *argv: a pointer to NULL
jamie@2 242 * \param *result: the spectral power of N values from the array pointed to by *data
jamie@2 243 */
jamie@43 244 int xtract_power(const float *data, const int N, const void *argv, float *result);
jamie@1 245
jamie@1 246 /* Odd to even harmonic ratio */
jamie@2 247 /** \brief Extract the Odd to even harmonic ratio of an input vector
jamie@2 248 *
jamie@38 249 * \param *data: a pointer to the first element in an array of floats representing the frequencies of the harmonic spectrum of an audio vector. It is sufficient to pass in a pointer to the array pointed to by *result from xtract_harmonics.
jamie@38 250 * \param N: the number of elements to be considered. If using the array pointed to by *result from xtract_harmonics, N should equal half the total array size i.e., just the frequencies of the peaks.
jamie@2 251 * \param *argv: a pointer to NULL
jamie@2 252 * \param *result: the odd/even harmonic ratio of N values from the array pointed to by *data
jamie@2 253 */
jamie@43 254 int xtract_odd_even_ratio(const float *data, const int N, const void *argv, float *result);
jamie@1 255
jamie@2 256 /** \brief Extract the Sharpness of an input vector
jamie@2 257 *
jamie@2 258 * \param *data: a pointer to the first element in an array of floats representing the magnitude spectrum of an audio vector
jamie@2 259 * \param N: the number of elements to be considered
jamie@2 260 * \param *argv: a pointer to NULL
jamie@2 261 * \param *result: the Sharpness of N values from the array pointed to by *data
jamie@2 262 */
jamie@43 263 int xtract_sharpness(const float *data, const int N, const void *argv, float *result);
jamie@1 264
jamie@2 265 /** \brief Extract the Slope of an input vector
jamie@2 266 *
jamie@2 267 * \param *data: a pointer to the first element in an array of floats representing the magnitude spectrum of an audio vector
jamie@2 268 * \param N: the number of elements to be considered
jamie@2 269 * \param *argv: a pointer to NULL
jamie@2 270 * \param *result: the Slope of N values from the array pointed to by *data
jamie@2 271 */
jamie@43 272 int xtract_slope(const float *data, const int N, const void *argv, float *result);
jamie@1 273
jamie@43 274 /** \brief Extract the value of the lowest value in an input vector that between two bounds
jamie@2 275 *
jamie@43 276 * \param *data: a pointer to the first element in an array of floats
jamie@2 277 * \param N: the number of elements to be considered
jamie@43 278 * \param *argv: a pointer to an array containing a lower and upper bounds for search, where lower < n < upper.
jamie@43 279 * \param *result: a pointer to a value representing the lowest non-zero component in *data. If no match is found then -0 is returned.
jamie@2 280 *
jamie@43 281 */
jamie@43 282 int xtract_lowest(const float *data, const int N, const void *argv, float *result);
jamie@1 283
jamie@2 284 /** \brief Extract the Pitch of an input vector using Harmonic Product Spectrum (HPS) analysis
jamie@2 285 *
jamie@22 286 * \warning {This function doesn't work properly}
jamie@22 287 *
jamie@2 288 * \param *data: a pointer to the first element in an array of floats representing the magnitude spectrum of an audio vector
jamie@2 289 * \param N: the number of elements to be considered
jamie@2 290 * \param *argv: a pointer to NULL
jamie@2 291 * \param *result: the pitch of N values from the array pointed to by *data
jamie@2 292 */
jamie@43 293 int xtract_hps(const float *data, const int N, const void *argv, float *result);
jamie@1 294
jamie@5 295 /** \brief Extract the fundamental frequency of an input vector
jamie@5 296 *
jamie@5 297 * \param *data: a pointer to the first element in an array of floats representing an audio vector
jamie@5 298 * \param N: the number of elements to be considered
jamie@22 299 * \param *argv: a pointer to a float representing the audio sample rate
jamie@5 300 * \param *result: the pitch of N values from the array pointed to by *data
jamie@12 301 *
jamie@22 302 * This algorithm is based on the AMDF, with peak and centre clipping. It would benefit from further improvements to improve noise robustness and overall efficiency
jamie@12 303 *
jamie@5 304 */
jamie@43 305 int xtract_f0(const float *data, const int N, const void *argv, float *result);
jamie@43 306
jamie@43 307 /** \brief Extract the fundamental frequency of an input vector
jamie@43 308 *
jamie@43 309 * \param *data: a pointer to the first element in an array of floats representing an audio vector
jamie@43 310 * \param N: the number of elements to be considered
jamie@43 311 * \param *argv: a pointer to a float representing the audio sample rate
jamie@43 312 * \param *result: the pitch of N values from the array pointed to by *data
jamie@43 313 *
jamie@43 314 * This function wraps xtract_f0, but provides the frequency of the lowest partial in the peak spectrum if f0 can't be found.
jamie@43 315 *
jamie@43 316 */
jamie@43 317 int xtract_failsafe_f0(const float *data, const int N, const void *argv, float *result);
jamie@5 318
jamie@20 319 /** @} */
jamie@20 320
jamie@1 321 #ifdef __cplusplus
jamie@1 322 }
jamie@1 323 #endif
jamie@1 324
jamie@1 325 #endif
jamie@1 326
jamie@1 327
jamie@1 328