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@2
|
44 int xtract_mean(float *data, int N, 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@2
|
50 * \param *argv: a pointer to a value 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@1
|
53 int xtract_variance(float *data, int N, 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@2
|
59 * \param *argv: a pointer to a value 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@1
|
62 int xtract_standard_deviation(float *data, int N, 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@2
|
68 * \param *argv: a pointer to a value 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@1
|
71 int xtract_average_deviation(float *data, int N, 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@2
|
77 * \param *argv: a pointer to an array of values 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@1
|
80 int xtract_skewness(float *data, int N, 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@1
|
89 int xtract_kurtosis(float *data, int N, void *argv, float *result);
|
jamie@1
|
90
|
jamie@11
|
91 /** \brief Extract the kurtosis 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@11
|
98 int xtract_centroid(float *data, int N, 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@2
|
107 int xtract_irregularity_k(float *data, int N, 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@1
|
116 int xtract_irregularity_j(float *data, int N, 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@2
|
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
|
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@1
|
128 int xtract_tristimulus_1(float *data, int N, void *argv, float *result);
|
jamie@1
|
129 int xtract_tristimulus_2(float *data, int N, void *argv, float *result);
|
jamie@1
|
130 int xtract_tristimulus_3(float *data, int N, 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@2
|
136 * \param *argv: a pointer to NULL
|
jamie@2
|
137 * \param *result: the smoothness of N values from the array pointed to by *data
|
jamie@2
|
138 */
|
jamie@1
|
139 int xtract_smoothness(float *data, int N, 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@1
|
148 int xtract_spread(float *data, int N, 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@1
|
159 int xtract_zcr(float *data, int N, 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@2
|
165 * \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
|
166 * \param *result: the spectral rolloff of N values from the array pointed to by *data
|
jamie@2
|
167 */
|
jamie@1
|
168 int xtract_rolloff(float *data, int N, 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@1
|
180 int xtract_loudness(float *data, int N, 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@1
|
189 int xtract_flatness(float *data, int N, 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@2
|
194 * \param *data: a pointer to the first element in an array of floats representing the spectral peaks of an audio vector
|
jamie@2
|
195 * \param N: the number of elements to be considered
|
jamie@2
|
196 * \param *argv: a pointer to NULL
|
jamie@2
|
197 * \param *result: the tonality factor of N values from the array pointed to by *data
|
jamie@2
|
198 */
|
jamie@1
|
199 int xtract_tonality(float *data, int N, 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@1
|
208 int xtract_noisiness(float *data, int N, 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@1
|
217 int xtract_rms_amplitude(float *data, int N, void *argv, float *result);
|
jamie@1
|
218
|
jamie@2
|
219 /** \brief Extract the Inharmonicity of an input vector
|
jamie@2
|
220 *
|
jamie@2
|
221 * \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
|
222 * \param N: the number of elements to be considered
|
jamie@2
|
223 * \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
|
224 * \param *result: the inharmonicity of N values from the array pointed to by *data
|
jamie@2
|
225 */
|
jamie@1
|
226 int xtract_inharmonicity(float *data, int N, 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@1
|
235 int xtract_crest(float *data, int N, 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@1
|
244 int xtract_power(float *data, int N, 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@2
|
249 * \param *data: a pointer to the first element in an array of floats representing the harmonic spectrum of an audio vector
|
jamie@2
|
250 * \param N: the number of elements to be considered
|
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@1
|
254 int xtract_odd_even_ratio(float *data, int N, 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@1
|
263 int xtract_sharpness(float *data, int N, 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@1
|
272 int xtract_slope(float *data, int N, void *argv, float *result);
|
jamie@1
|
273
|
jamie@5
|
274 /** \brief Extract the value of the first partial in an input vector that closely matches a certain 'guess'
|
jamie@2
|
275 *
|
jamie@2
|
276 * \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
|
277 * \param N: the number of elements to be considered
|
jamie@5
|
278 * \param *argv: a pointer to a float value representing the guess
|
jamie@2
|
279 * \param *result: the F0 of N values from the array pointed to by *data
|
jamie@2
|
280 *
|
jamie@2
|
281 * 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
|
282 int xtract_lowest_match(float *data, int N, 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@1
|
293 int xtract_hps(float *data, int N, 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@5
|
305 int xtract_f0(float *data, int N, void *argv, float *result);
|
jamie@5
|
306
|
jamie@20
|
307 /** @} */
|
jamie@20
|
308
|
jamie@1
|
309 #ifdef __cplusplus
|
jamie@1
|
310 }
|
jamie@1
|
311 #endif
|
jamie@1
|
312
|
jamie@1
|
313 #endif
|
jamie@1
|
314
|
jamie@1
|
315
|
jamie@1
|
316
|