annotate include/xtract/libxtract.h @ 285:89fe52066db1 tip master

MSCV missing ssize_t fix
author Jamie Bullock <jamie@jamiebullock.com>
date Tue, 16 Jul 2019 18:29:20 +0100
parents 39f1f8cf6756
children
rev   line source
jamie@254 1 /*
jamie@254 2 * Copyright (C) 2012 Jamie Bullock
jamie@254 3 *
jamie@254 4 * Permission is hereby granted, free of charge, to any person obtaining a copy
jamie@254 5 * of this software and associated documentation files (the "Software"), to
jamie@254 6 * deal in the Software without restriction, including without limitation the
jamie@254 7 * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or
jamie@254 8 * sell copies of the Software, and to permit persons to whom the Software is
jamie@254 9 * furnished to do so, subject to the following conditions:
jamie@254 10 *
jamie@254 11 * The above copyright notice and this permission notice shall be included in
jamie@254 12 * all copies or substantial portions of the Software.
jamie@254 13 *
jamie@254 14 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
jamie@254 15 * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
jamie@254 16 * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
jamie@254 17 * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
jamie@254 18 * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
jamie@254 19 * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS
jamie@254 20 * IN THE SOFTWARE.
jamie@254 21 *
jamie@254 22 */
jamie@254 23
jamie@254 24 /** \mainpage
jamie@254 25 *
jamie@254 26 * LibXtract is a simple, portable, lightweight library of audio feature extraction functions. The purpose of the library is to provide a relatively exhaustive set of feature extraction primatives that are designed to be 'cascaded' to create a extraction hierarchies.
jamie@254 27 * For example, 'variance', 'average deviation', 'skewness' and 'kurtosis', all require the 'mean' of the input vector to be precomputed. However, rather than compute the 'mean' 'inside' each function, it is expected that the 'mean' will be passed in as an argument. This means that if the user wishes to use all of these features, the mean is calculated only once, and then passed to any functions that require it.
jamie@254 28 *
jamie@254 29 * This philosophy of 'cascading' features is followed throughout the library, for example with features that operate on the magnitude spectrum of a signal vector (e.g. 'irregularity'), the magnitude spectrum is not calculated 'inside' the respective function, instead, a pointer to the first element in an array containing the magnitude spectrum is passed in as an argument.
jamie@254 30 *
jamie@254 31 * Hopefully this not only makes the library more efficient when computing large numbers of features, but also makes it more flexible because extraction functions can be combined arbitrarily (one can take the irregularility of the Mel Frequency Cepstral Coefficients for example).
jamie@254 32 *
jamie@254 33 * All feature extraction functions follow the same prototype:
jamie@254 34 *
jamie@254 35 * **int xtract_function_name(const double *data, const int N, const void *argv, double *result);**
jamie@254 36 *
jamie@254 37 * \param const double *data points to an array of doubles representing the input data
jamie@254 38 * \param const int N represents the number of elementes from *data to be considered in the calculation
jamie@254 39 * \param const void *argv represents an arbitrary list of arguments. Used to pass in values required by the feature calculation
jamie@254 40 * \param double *result points to an array of doubles, or a single double represnting the result of the calculation
jamie@254 41 *
jamie@254 42 *
jamie@254 43 * It is up to the calling function to allocate enough memory for the *data, *argv, and *result, and to free it when required. Some feature extraction functions may also require an _init() function to be called in order to perform some initialisation. The struct xtract_function_descriptor_t is used to give an indication of recommended default values, and argc for the *argv array.
jamie@254 44 *
jamie@254 45 * LibXtract can be downloaded from http://www.sf.net/projects/libxtract
jamie@254 46 *
jamie@254 47 */
jamie@254 48
jamie@254 49 #ifndef XTRACT_H
jamie@254 50 #define XTRACT_H
jamie@254 51
jamie@254 52 #ifdef __cplusplus
jamie@254 53 extern "C" {
jamie@254 54 #endif
jamie@254 55
jamie@254 56 /**
jamie@254 57 * \file libxtract.h
jamie@254 58 * \brief main header file and API definition
jamie@254 59 */
jamie@254 60
jamie@254 61 #include "xtract_scalar.h"
jamie@254 62 #include "xtract_vector.h"
jamie@254 63 #include "xtract_delta.h"
jamie@254 64 #include "xtract_types.h"
jamie@254 65 #include "xtract_macros.h"
jamie@254 66 #include "xtract_helper.h"
jamie@254 67
jamie@254 68 /** \defgroup libxtract API
jamie@254 69 *
jamie@254 70 * Defines a very simple API that provides access to the functions in the library
jamie@254 71 * @{
jamie@254 72 */
jamie@254 73
jamie@254 74 #define XTRACT_FEATURES 62
jamie@254 75
jamie@254 76 /** \brief Enumeration of features, elements are used as indixes to an array of pointers to feature extracton functions */
jamie@254 77 enum xtract_features_ {
jamie@254 78 XTRACT_MEAN,
jamie@254 79 XTRACT_VARIANCE,
jamie@254 80 XTRACT_STANDARD_DEVIATION,
jamie@254 81 XTRACT_AVERAGE_DEVIATION,
jamie@254 82 XTRACT_SKEWNESS,
jamie@254 83 XTRACT_KURTOSIS,
jamie@254 84 XTRACT_SPECTRAL_MEAN,
jamie@254 85 XTRACT_SPECTRAL_VARIANCE,
jamie@254 86 XTRACT_SPECTRAL_STANDARD_DEVIATION,
jamie@254 87 /*XTRACT_SPECTRAL_AVERAGE_DEVIATION, */
jamie@254 88 XTRACT_SPECTRAL_SKEWNESS,
jamie@254 89 XTRACT_SPECTRAL_KURTOSIS,
jamie@254 90 XTRACT_SPECTRAL_CENTROID,
jamie@254 91 XTRACT_IRREGULARITY_K,
jamie@254 92 XTRACT_IRREGULARITY_J,
jamie@254 93 XTRACT_TRISTIMULUS_1,
jamie@254 94 XTRACT_TRISTIMULUS_2,
jamie@254 95 XTRACT_TRISTIMULUS_3,
jamie@254 96 XTRACT_SMOOTHNESS,
jamie@254 97 XTRACT_SPREAD,
jamie@254 98 XTRACT_ZCR,
jamie@254 99 XTRACT_ROLLOFF,
jamie@254 100 XTRACT_LOUDNESS,
jamie@254 101 XTRACT_FLATNESS,
jamie@254 102 XTRACT_FLATNESS_DB,
jamie@254 103 XTRACT_TONALITY,
jamie@254 104 XTRACT_CREST,
jamie@254 105 XTRACT_NOISINESS,
jamie@254 106 XTRACT_RMS_AMPLITUDE,
jamie@254 107 XTRACT_SPECTRAL_INHARMONICITY,
jamie@254 108 XTRACT_POWER,
jamie@254 109 XTRACT_ODD_EVEN_RATIO,
jamie@254 110 XTRACT_SHARPNESS,
jamie@254 111 XTRACT_SPECTRAL_SLOPE,
jamie@254 112 XTRACT_LOWEST_VALUE,
jamie@254 113 XTRACT_HIGHEST_VALUE,
jamie@254 114 XTRACT_SUM,
jamie@254 115 XTRACT_NONZERO_COUNT,
jamie@254 116 XTRACT_HPS,
jamie@254 117 XTRACT_F0,
jamie@254 118 XTRACT_FAILSAFE_F0,
jamie@254 119 XTRACT_WAVELET_F0,
jamie@254 120 XTRACT_MIDICENT,
jamie@254 121 XTRACT_LNORM,
jamie@254 122 XTRACT_FLUX,
jamie@254 123 XTRACT_ATTACK_TIME,
jamie@254 124 XTRACT_DECAY_TIME,
jamie@254 125 XTRACT_DIFFERENCE_VECTOR,
jamie@254 126 XTRACT_AUTOCORRELATION,
jamie@254 127 XTRACT_AMDF,
jamie@254 128 XTRACT_ASDF,
jamie@254 129 XTRACT_BARK_COEFFICIENTS,
jamie@254 130 XTRACT_PEAK_SPECTRUM,
jamie@254 131 XTRACT_SPECTRUM,
jamie@254 132 XTRACT_AUTOCORRELATION_FFT,
jamie@254 133 XTRACT_MFCC,
jamie@254 134 XTRACT_DCT,
jamie@254 135 XTRACT_HARMONIC_SPECTRUM,
jamie@254 136 XTRACT_LPC,
jamie@254 137 XTRACT_LPCC,
jamie@254 138 XTRACT_SUBBANDS,
jamie@254 139 /* Helper functions */
jamie@254 140 XTRACT_WINDOWED,
jamie@254 141 XTRACT_SMOOTHED
jamie@254 142 };
jamie@254 143
jamie@254 144 /** \brief Enumeration of feature initialisation functions */
jamie@254 145 enum xtract_feature_init_ {
jamie@254 146 XTRACT_INIT_MFCC = 100,
jamie@254 147 XTRACT_INIT_BARK,
jamie@254 148 XTRACT_INIT_WINDOWED
jamie@254 149 };
jamie@254 150
jamie@254 151 /** \brief Enumeration of feature types */
jamie@254 152 enum xtract_feature_types_ {
jamie@254 153 XTRACT_SCALAR,
jamie@254 154 XTRACT_VECTOR,
jamie@254 155 XTRACT_DELTA
jamie@254 156 };
jamie@254 157
jamie@254 158 /** \brief Enumeration of mfcc types */
jamie@254 159 enum xtract_mfcc_types_ {
jamie@254 160 XTRACT_EQUAL_GAIN,
jamie@254 161 XTRACT_EQUAL_AREA
jamie@254 162 };
jamie@254 163
jamie@254 164 enum xtract_lnorm_filter_types_ {
jamie@254 165 XTRACT_NO_LNORM_FILTER,
jamie@254 166 XTRACT_POSITIVE_SLOPE,
jamie@254 167 XTRACT_NEGATIVE_SLOPE
jamie@254 168 };
jamie@254 169
jamie@254 170 /** \brief Enumeration of return codes */
jamie@254 171 enum xtract_return_codes_ {
jamie@254 172 XTRACT_SUCCESS,
jamie@254 173 XTRACT_MALLOC_FAILED,
jamie@254 174 XTRACT_BAD_ARGV,
jamie@254 175 XTRACT_BAD_VECTOR_SIZE,
jamie@254 176 XTRACT_BAD_STATE,
jamie@254 177 XTRACT_DENORMAL_FOUND,
jamie@254 178 XTRACT_NO_RESULT, /* This usually occurs when the correct calculation cannot take place because required data is missing or would result in a NaN or infinity/-infinity. Under these curcumstances 0.f is usually given by *result */
jamie@254 179 XTRACT_FEATURE_NOT_IMPLEMENTED,
jamie@254 180 XTRACT_ARGUMENT_ERROR
jamie@254 181 };
jamie@254 182
jamie@254 183 /** \brief Enumeration of spectrum types */
jamie@254 184 enum xtract_spectrum_ {
jamie@254 185 XTRACT_MAGNITUDE_SPECTRUM,
jamie@254 186 XTRACT_LOG_MAGNITUDE_SPECTRUM,
jamie@254 187 XTRACT_POWER_SPECTRUM,
jamie@254 188 XTRACT_LOG_POWER_SPECTRUM
jamie@254 189 };
jamie@254 190
jamie@254 191 /** \brief Subband scales */
jamie@254 192 enum xtract_subband_scales_ {
jamie@254 193 XTRACT_OCTAVE_SUBBANDS,
jamie@254 194 XTRACT_LINEAR_SUBBANDS
jamie@254 195 };
jamie@254 196
jamie@254 197 /** \brief Enumeration of data types*/
jamie@254 198 typedef enum type_ {
jamie@254 199 XTRACT_FLOAT,
jamie@254 200 XTRACT_FLOATARRAY,
jamie@254 201 XTRACT_INT,
jamie@254 202 XTRACT_MEL_FILTER
jamie@254 203 } xtract_type_t;
jamie@254 204
jamie@254 205 /** \brief Enumeration of units*/
jamie@254 206 typedef enum unit_ {
jamie@254 207 /* NONE, ANY */
jamie@254 208 XTRACT_HERTZ = 2,
jamie@254 209 XTRACT_ANY_AMPLITUDE_HERTZ,
jamie@254 210 XTRACT_DBFS,
jamie@254 211 XTRACT_DBFS_HERTZ,
jamie@254 212 XTRACT_PERCENT,
jamie@254 213 XTRACT_BINS,
jamie@254 214 XTRACT_SONE,
jamie@254 215 XTRACT_MIDI_CENT
jamie@254 216 } xtract_unit_t;
jamie@254 217
jamie@254 218 /** \brief Boolean */
jamie@254 219 typedef enum {
jamie@254 220 XTRACT_FALSE,
jamie@254 221 XTRACT_TRUE
jamie@254 222 } xtract_bool_t;
jamie@254 223
jamie@254 224 /** \brief Window types */
jamie@254 225 enum xtract_window_types_ {
jamie@254 226 XTRACT_GAUSS,
jamie@254 227 XTRACT_HAMMING,
jamie@254 228 XTRACT_HANN,
jamie@254 229 XTRACT_BARTLETT,
jamie@254 230 XTRACT_TRIANGULAR,
jamie@254 231 XTRACT_BARTLETT_HANN,
jamie@254 232 XTRACT_BLACKMAN,
jamie@254 233 XTRACT_KAISER,
jamie@254 234 XTRACT_BLACKMAN_HARRIS
jamie@254 235 };
jamie@254 236
jamie@254 237 /** \brief Enumeration of vector format types*/
jamie@254 238 typedef enum xtract_vector_ {
jamie@254 239 /* N/2 magnitude/log-magnitude/power/log-power coeffs and N/2 frequencies */
jamie@254 240 XTRACT_SPECTRAL,
jamie@254 241 /* N spectral amplitudes */
jamie@254 242 XTRACT_SPECTRAL_MAGNITUDES,
jamie@254 243 /* N/2 magnitude/log-magnitude/power/log-power peak coeffs and N/2
jamie@254 244 * frequencies */
jamie@254 245 XTRACT_SPECTRAL_PEAKS,
jamie@254 246 /* N spectral peak amplitudes */
jamie@254 247 XTRACT_SPECTRAL_PEAKS_MAGNITUDES,
jamie@254 248 /* N spectral peak frequencies */
jamie@254 249 XTRACT_SPECTRAL_PEAKS_FREQUENCIES,
jamie@254 250 /* N/2 magnitude/log-magnitude/power/log-power harmonic peak coeffs and N/2
jamie@254 251 * frequencies */
jamie@254 252 XTRACT_SPECTRAL_HARMONICS,
jamie@254 253 /* N spectral harmonic amplitudes */
jamie@254 254 XTRACT_SPECTRAL_HARMONICS_MAGNITUDES,
jamie@254 255 /* N spectral harmonic frequencies */
jamie@254 256 XTRACT_SPECTRAL_HARMONICS_FREQUENCIES,
jamie@254 257 XTRACT_AUTOCORRELATION_COEFFS,
jamie@254 258 XTRACT_ARBITRARY_SERIES,
jamie@254 259 XTRACT_AUDIO_SAMPLES,
jamie@254 260 XTRACT_MEL_COEFFS,
jamie@254 261 XTRACT_LPC_COEFFS,
jamie@254 262 XTRACT_LPCC_COEFFS,
jamie@254 263 XTRACT_BARK_COEFFS,
jamie@254 264 XTRACT_SUBFRAMES,
jamie@254 265 XTRACT_NO_DATA
jamie@254 266 } xtract_vector_t;
jamie@254 267
jamie@254 268 /** \brief Data structure containing useful information about functions provided by LibXtract. */
jamie@254 269 typedef struct _xtract_function_descriptor {
jamie@254 270
jamie@254 271 int id;
jamie@254 272
jamie@254 273 struct {
jamie@254 274 char name[XTRACT_MAX_NAME_LENGTH];
jamie@254 275 char p_name[XTRACT_MAX_NAME_LENGTH]; /* pretty name */
jamie@254 276 char desc[XTRACT_MAX_DESC_LENGTH];
jamie@254 277 char p_desc[XTRACT_MAX_DESC_LENGTH]; /* pretty description */
jamie@254 278 char author[XTRACT_MAX_AUTHOR_LENGTH];
jamie@254 279 int year;
jamie@254 280 } algo;
jamie@254 281
jamie@254 282 struct {
jamie@254 283 xtract_vector_t format;
jamie@254 284 xtract_unit_t unit;
jamie@254 285 } data;
jamie@254 286
jamie@254 287 int argc;
jamie@254 288
jamie@254 289 struct {
jamie@254 290 xtract_type_t type; /* type of the array/value pointed to by argv */
jamie@254 291 double min[XTRACT_MAXARGS];
jamie@254 292 double max[XTRACT_MAXARGS];
jamie@254 293 double def[XTRACT_MAXARGS]; /* defaults */
jamie@254 294 xtract_unit_t unit[XTRACT_MAXARGS];
jamie@254 295 int donor[XTRACT_MAXARGS]; /* suggested donor functions for argv */
jamie@254 296 } argv;
jamie@254 297
jamie@254 298 xtract_bool_t is_scalar;
jamie@254 299 xtract_bool_t is_delta; /* features in xtract_delta.h can be scalar or vector */
jamie@254 300
jamie@254 301 /* The result.<> entries in descritors.c need to be checked */
jamie@254 302 union {
jamie@254 303
jamie@254 304 struct {
jamie@254 305 double min;
jamie@254 306 double max;
jamie@254 307 xtract_unit_t unit;
jamie@254 308 } scalar;
jamie@254 309
jamie@254 310 struct {
jamie@254 311 xtract_vector_t format;
jamie@254 312 xtract_unit_t unit;
jamie@254 313 } vector;
jamie@254 314
jamie@254 315 } result;
jamie@254 316
jamie@254 317 } xtract_function_descriptor_t;
jamie@254 318
jamie@254 319 /**
jamie@254 320 *
jamie@254 321 * \brief An array of pointers to functions that perform the extraction
jamie@254 322 *
jamie@254 323 * \param *data: a pointer to the start of the input data (usually the first element in an array)
jamie@254 324 *
jamie@254 325 * \param N: the number of elements to be processed
jamie@254 326 *
jamie@254 327 * \param *argv: an abitrary number of additional arguments, used to pass additional parameters to the function being called. All arguments are compulsary!
jamie@254 328 *
jamie@254 329 * \param *result: a pointer to the first element in the result
jamie@254 330 *
jamie@254 331 * Each function will iterate over N array elements, the first of which is
jamie@254 332 * pointed to by *data. It is up to the calling function to ensure that the array is in the format expected by the function being called.
jamie@254 333 *
jamie@254 334 * For scalar and delta features, *result will point to a single value.
jamie@254 335 *
jamie@254 336 * For vector features it will point to the first element in an array.
jamie@254 337 *
jamie@254 338 * Memory for this array must be allocated and freed by the calling
jamie@254 339 * function.
jamie@254 340 *
jamie@254 341 * All functions return an integer error code as descibed in the enumeration
jamie@254 342 * return_codes_
jamie@254 343 *
jamie@254 344 * The preprocessor macro: XTRACT must be defined before this can be used
jamie@254 345 *
jamie@254 346 * example:<br>
jamie@254 347 * \verbatim
jamie@254 348 #include <stdio.h>
jamie@254 349 #define XTRACT
jamie@254 350 #include "libxtract.h"
jamie@254 351
jamie@254 352 main () {
jamie@254 353 double values[] = {1.0, 2.0, 3.0, 4.0, 5.0};
jamie@254 354 int N = 5;
jamie@254 355 double mean;
jamie@254 356
jamie@254 357 xtract[MEAN]((void *)values, N, NULL, &mean);
jamie@254 358
jamie@254 359 printf("Mean = %.2f\n", mean);
jamie@254 360 }
jamie@254 361 \endverbatim
jamie@254 362 * The calling function may additionally make some tests against the value returned by xtract
jamie@254 363 *
jamie@254 364 */
jamie@254 365 #ifdef XTRACT_H
jamie@254 366 extern int(*xtract[XTRACT_FEATURES])(const double *data, const int N, const void *argv, double *result);
jamie@254 367
jamie@254 368 #endif
jamie@254 369
jamie@254 370 /** \brief A function to initialise wavelet f0 detector state */
jamie@254 371 int xtract_init_wavelet_f0_state(void);
jamie@254 372
jamie@254 373 /** \brief A structure to store a set of n_filters Mel filters */
jamie@254 374 typedef struct xtract_mel_filter_ {
jamie@254 375 int n_filters;
jamie@254 376 double **filters;
jamie@254 377 } xtract_mel_filter;
jamie@254 378
jamie@254 379 /** \brief A function to initialise a mel filter bank
jamie@254 380 *
jamie@254 381 * It is up to the caller to pass in a pointer to memory allocated for freq_bands arrays of length N. This function populates these arrays with magnitude coefficients representing the mel filterbank on a linear scale
jamie@254 382 */
jamie@254 383 int xtract_init_mfcc(int N, double nyquist, int style, double freq_min, double freq_max, int freq_bands, double **fft_tables);
jamie@254 384
jamie@254 385 /** \brief A function to initialise bark filter bounds
jamie@254 386 *
jamie@254 387 * A pointer to an array of BARK_BANDS ints most be passed in, and is populated with BARK_BANDS fft bin numbers representing the limits of each band
jamie@254 388 *
jamie@254 389 * \param N: the audio block size
jamie@254 390 * \param sr: The sample audio sample rate
jamie@254 391 * \param *band_limits: a pointer to an array of BARK_BANDS ints
jamie@254 392 */
jamie@254 393 int xtract_init_bark(int N, double sr, int *band_limits);
jamie@254 394
jamie@254 395 /** \brief An initialisation function for functions using FFT
jamie@254 396 *
jamie@254 397 * This function initialises global data structures used by functions requiring FFT functionality. It can be called multiple times with different feature names. Calling it more than once with the same feature name is not a valid operation and will result in a memory leak.
jamie@254 398 *
jamie@254 399 * \param N: the size of the FFT
jamie@254 400 * \param feature_name: the name of the feature the FFT is being used for,
jamie@254 401 * e.g. XTRACT_DCT
jamie@254 402 *
jamie@254 403 */
jamie@254 404 int xtract_init_fft(int N, int feature_name);
jamie@254 405
jamie@254 406 /** \brief Free memory used for fft plans
jamie@254 407 *
jamie@254 408 * This function should be used to explicitly free memory allocated for ffts by xtract_init_fft(). It is primarily intended for use if a new FFT needs to be taken with a different blocksize. If only one fft size is required then there is no need to call this function since it will be called when the program exits.
jamie@254 409 * */
jamie@254 410 void xtract_free_fft(void);
jamie@254 411
jamie@254 412 /** \brief Make a window of a given type and return a pointer to it
jamie@254 413 *
jamie@254 414 * \param N: the size of the window
jamie@254 415 * \param type: the type of the window as given in the enumeration window_types_
jamie@254 416 *
jamie@254 417 */
jamie@254 418 double *xtract_init_window(const int N, const int type);
jamie@254 419
jamie@254 420 /** \brief Free a window as allocated by xtract_make_window()
jamie@254 421 *
jamie@254 422 * \param *window: a pointer to an array of doubles as allocated by xtract_make_window()
jamie@254 423 *
jamie@254 424 */
jamie@254 425 void xtract_free_window(double *window);
jamie@254 426
jamie@254 427 /* \brief A function to build an array of function descriptors */
jamie@254 428 xtract_function_descriptor_t *xtract_make_descriptors();
jamie@254 429
jamie@254 430 /* \brief A function to free an array of function descriptors */
jamie@254 431 int xtract_free_descriptors(xtract_function_descriptor_t *fd);
jamie@254 432 /* Free functions */
jamie@254 433
jamie@254 434 /** @} */
jamie@254 435
jamie@254 436 #ifdef __cplusplus
jamie@254 437 }
jamie@254 438 #endif
jamie@254 439
jamie@254 440 #endif