2 Copyright (C) 2003-2009 Paul Brossier <piem@aubio.org>
4 This file is part of aubio.
6 aubio is free software: you can redistribute it and/or modify
7 it under the terms of the GNU General Public License as published by
8 the Free Software Foundation, either version 3 of the License, or
9 (at your option) any later version.
11 aubio is distributed in the hope that it will be useful,
12 but WITHOUT ANY WARRANTY; without even the implied warranty of
13 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14 GNU General Public License for more details.
16 You should have received a copy of the GNU General Public License
17 along with aubio. If not, see <http://www.gnu.org/licenses/>.
22 * various math functions
36 - <a href="http://en.wikipedia.org/wiki/Window_function">Window
37 function</a> on Wikipedia
38 - Amalia de Götzen, Nicolas Bernardini, and Daniel Arfib. Traditional (?)
39 implementations of a phase vocoder: the tricks of the trade. In Proceedings of
40 the International Conference on Digital Audio Effects (DAFx-00), pages 37–44,
41 Uni- versity of Verona, Italy, 2000.
42 (<a href="http://profs.sci.univr.it/%7Edafx/Final-Papers/ps/Bernardini.ps.gz">
46 fvec_t *new_aubio_window (char_t * window_type, uint_t size);
48 /** compute the principal argument
50 This function maps the input phase to its corresponding value wrapped in the
51 range \f$ [-\pi, \pi] \f$.
53 \param phase unwrapped phase to map to the unit circle
55 \return equivalent phase wrapped to the unit circle
58 smpl_t aubio_unwrap2pi (smpl_t phase);
60 /** compute the mean of a vector
62 \param s vector to compute mean from
67 smpl_t fvec_mean (fvec_t * s);
69 /** compute the mean of a vector channel
71 \param s vector to compute mean from
72 \param i channel to compute mean from
77 smpl_t fvec_mean_channel (fvec_t * s, uint_t i);
79 /** find the max of a vector
81 \param s vector to get the max from
83 \return the value of the minimum of v
86 smpl_t fvec_max (fvec_t * s);
88 /** find the min of a vector
90 \param s vector to get the min from
92 \return the value of the maximum of v
95 smpl_t fvec_min (fvec_t * s);
97 /** find the index of the min of a vector
99 \param s vector to get the index from
101 \return the index of the minimum element of v
104 uint_t fvec_min_elem (fvec_t * s);
106 /** find the index of the max of a vector
108 \param s vector to get the index from
110 \return the index of the maximum element of v
113 uint_t fvec_max_elem (fvec_t * s);
115 /** swap the left and right halves of a vector
117 This function swaps the left part of the signal with the right part of the
120 \f$ a[0], a[1], ..., a[\frac{N}{2}], a[\frac{N}{2}+1], ..., a[N-1], a[N] \f$
124 \f$ a[\frac{N}{2}+1], ..., a[N-1], a[N], a[0], a[1], ..., a[\frac{N}{2}] \f$
126 This operation, known as 'fftshift' in the Matlab Signal Processing Toolbox,
127 can be used before computing the FFT to simplify the phase relationship of the
128 resulting spectrum. See Amalia de Götzen's paper referred to above.
131 void fvec_shift (fvec_t * v);
133 /** compute the sum of all elements of a vector
135 \param v vector to compute the sum of
140 smpl_t fvec_sum (fvec_t * v);
142 /** compute the energy of a vector
144 This function compute the sum of the squared elements of a vector.
146 \param v vector to get the energy from
148 \return the energy of v
151 smpl_t fvec_local_energy (fvec_t * v);
153 /** compute the High Frequency Content of a vector
155 The High Frequency Content is defined as \f$ \sum_0^{N-1} (k+1) v[k] \f$.
157 \param v vector to get the energy from
162 smpl_t fvec_local_hfc (fvec_t * v);
164 /** computes the p-norm of a vector
166 Computes the p-norm of a vector for \f$ p = \alpha \f$
168 \f$ L^p = ||x||_p = (|x_1|^p + |x_2|^p + ... + |x_n|^p ) ^ \frac{1}{p} \f$
170 If p = 1, the result is the Manhattan distance.
172 If p = 2, the result is the Euclidean distance.
174 As p tends towards large values, \f$ L^p \f$ tends towards the maximum of the
179 - <a href="http://en.wikipedia.org/wiki/Lp_space">\f$L^p\f$ space</a> on
182 \param v vector to compute norm from
183 \param p order of the computed norm
185 \return the p-norm of v
188 smpl_t fvec_alpha_norm (fvec_t * v, smpl_t p);
190 /** alpha normalisation
192 This function divides all elements of a vector by the p-norm as computed by
195 \param v vector to compute norm from
196 \param p order of the computed norm
199 void fvec_alpha_normalise (fvec_t * v, smpl_t p);
201 /** add a constant to each elements of a vector
203 \param v vector to add constant to
204 \param c constant to add to v
207 void fvec_add (fvec_t * v, smpl_t c);
209 /** remove the minimum value of the vector to each elements
211 \param v vector to remove minimum from
214 void fvec_min_removal (fvec_t * v);
216 /** compute moving median theshold of a vector
218 This function computes the moving median threshold value of at the given
219 position of a vector, taking the median amongs post elements before and up to
220 pre elements after pos.
222 \param v input vector
223 \param tmp temporary vector of length post+1+pre
224 \param post length of causal part to take before pos
225 \param pre length of anti-causal part to take after pos
226 \param pos index to compute threshold for
228 \return moving median threshold value
231 smpl_t fvec_moving_thres (fvec_t * v, fvec_t * tmp, uint_t post, uint_t pre,
232 uint_t pos, uint_t channel);
234 /** apply adaptive threshold to a vector
236 For each points at position p of an input vector, this function remove the
237 moving median threshold computed at p.
239 \param v input vector
240 \param tmp temporary vector of length post+1+pre
241 \param post length of causal part to take before pos
242 \param pre length of anti-causal part to take after pos
245 void fvec_adapt_thres (fvec_t * v, fvec_t * tmp, uint_t post, uint_t pre,
248 /** returns the median of a vector
250 The QuickSelect routine is based on the algorithm described in "Numerical
251 recipes in C", Second Edition, Cambridge University Press, 1992, Section 8.5,
254 This implementation of the QuickSelect routine is based on Nicolas
255 Devillard's implementation, available at http://ndevilla.free.fr/median/median/
256 and in the Public Domain.
258 \param v vector to get median from
259 \param channel channel to get median from
261 \return the median of v
264 smpl_t fvec_median_channel (fvec_t * v, uint_t channel);
266 /** finds exact peak index by quadratic interpolation*/
267 smpl_t fvec_quadint (fvec_t * x, uint_t pos, uint_t channel);
269 /** Quadratic interpolation using Lagrange polynomial.
271 Inspired from ``Comparison of interpolation algorithms in real-time sound
272 processing'', Vladimir Arnost,
274 \param s0,s1,s2 are 3 consecutive samples of a curve
275 \param pf is the floating point index [0;2]
277 \return s0 + (pf/2.)*((pf-3.)*s0-2.*(pf-2.)*s1+(pf-1.)*s2);
280 smpl_t aubio_quadfrac (smpl_t s0, smpl_t s1, smpl_t s2, smpl_t pf);
282 /** return 1 if v[p] is a peak and positive, 0 otherwise
284 This function returns 1 if a peak is found at index p in the vector v. The
285 peak is defined as follows:
291 \param v input vector
292 \param p position of supposed for peak
294 \return 1 if a peak is found, 0 otherwise
297 uint_t fvec_peakpick (fvec_t * v, uint_t p);
299 /** convert frequency bin to midi value */
300 smpl_t aubio_bintomidi (smpl_t bin, smpl_t samplerate, smpl_t fftsize);
302 /** convert midi value to frequency bin */
303 smpl_t aubio_miditobin (smpl_t midi, smpl_t samplerate, smpl_t fftsize);
305 /** convert frequency bin to frequency (Hz) */
306 smpl_t aubio_bintofreq (smpl_t bin, smpl_t samplerate, smpl_t fftsize);
308 /** convert frequency (Hz) to frequency bin */
309 smpl_t aubio_freqtobin (smpl_t freq, smpl_t samplerate, smpl_t fftsize);
311 /** convert frequency (Hz) to midi value (0-128) */
312 smpl_t aubio_freqtomidi (smpl_t freq);
314 /** convert midi value (0-128) to frequency (Hz) */
315 smpl_t aubio_miditofreq (smpl_t midi);
317 /** return 1 if a is a power of 2, 0 otherwise */
318 uint_t aubio_is_power_of_two(uint_t a);
320 /** return the next power of power of 2 greater than a */
321 uint_t aubio_next_power_of_two(uint_t a);
323 /** compute sound pressure level (SPL) in dB
325 This quantity is often wrongly called 'loudness'.
327 \param v vector to compute dB SPL from
329 \return level of v in dB SPL
332 smpl_t aubio_db_spl (fvec_t * v);
334 /** check if buffer level in dB SPL is under a given threshold
336 \param v vector to get level from
337 \param threshold threshold in dB SPL
339 \return 0 if level is under the given threshold, 1 otherwise
342 uint_t aubio_silence_detection (fvec_t * v, smpl_t threshold);
344 /** get buffer level if level >= threshold, 1. otherwise
346 \param v vector to get level from
347 \param threshold threshold in dB SPL
349 \return level in dB SPL if level >= threshold, 1. otherwise
352 smpl_t aubio_level_detection (fvec_t * v, smpl_t threshold);
354 /** compute normalised autocorrelation function
356 \param input vector to compute autocorrelation from
357 \param output vector to store autocorrelation function to
360 void aubio_autocorr (fvec_t * input, fvec_t * output);
362 /** zero-crossing rate (ZCR)
364 The zero-crossing rate is the number of times a signal changes sign,
365 divided by the length of this signal.
367 \param v vector to compute ZCR from
369 \return zero-crossing rate of v
372 smpl_t aubio_zero_crossing_rate (fvec_t * v);
374 /** clean up cached memory at the end of program
376 This function should be used at the end of programs to purge all cached
377 memory. So far it is only useful to clean FFTW's cache.
380 void aubio_cleanup (void);