ref: 32d69586108e1d0e451655e0a0da51bbea9169d4
parent: bcf38fe01822c610831591851df8abd76bfaacf7
author: Paul Brossier <piem@piem.org>
date: Sat Nov 24 17:00:20 EST 2007
src/: more moving and splitting
--- a/src/Makefile.am
+++ b/src/Makefile.am
@@ -1,17 +1,19 @@
noinst_HEADERS = aubio_priv.h
pkginclude_HEADERS = aubio.h \
types.h \
- phasevoc.h \
- mathutils.h \
- fft.h \
- sample.h \
fvec.h \
cvec.h \
- hist.h \
- scale.h \
- resample.h \
- tss.h \
- biquad.h \
+ mathutils.h \
+ utils/hist.h \
+ utils/scale.h \
+ temporal/resample.h \
+ temporal/biquad.h \
+ temporal/filter.h \
+ spectral/filterbank.h \
+ spectral/mfcc.c \
+ spectral/phasevoc.h \
+ spectral/fft.h \
+ spectral/tss.h \
pitch/pitchdetection.h \
pitch/pitchmcomb.h \
pitch/pitchyin.h \
@@ -22,10 +24,7 @@
onset/onsetdetection.h \
onset/peakpick.h \
tempo/tempo.h \
- tempo/beattracking.h \
- filter.h \
- filterbank.h \
- mfcc.h
+ tempo/beattracking.h
nodist_pkginclude_HEADERS = config.h
@@ -32,26 +31,32 @@
lib_LTLIBRARIES = libaubio.la
libaubio_la_SOURCES = aubio.h \
types.h \
- phasevoc.c \
- phasevoc.h \
- mathutils.c \
- mathutils.h \
- fft.c \
- fft.h \
fvec.c \
fvec.h \
cvec.c \
cvec.h \
- hist.c \
- hist.h \
- scale.c \
- scale.h \
- resample.c \
- resample.h \
- tss.c \
- tss.h \
- biquad.c \
- biquad.h \
+ mathutils.c \
+ mathutils.h \
+ utils/hist.c \
+ utils/hist.h \
+ utils/scale.c \
+ utils/scale.h \
+ temporal/resample.c \
+ temporal/resample.h \
+ temporal/biquad.c \
+ temporal/biquad.h \
+ temporal/filter.c \
+ temporal/filter.h \
+ spectral/filterbank.c \
+ spectral/filterbank.h \
+ spectral/mfcc.h \
+ spectral/mfcc.c \
+ spectral/phasevoc.c \
+ spectral/phasevoc.h \
+ spectral/fft.c \
+ spectral/fft.h \
+ spectral/tss.c \
+ spectral/tss.h \
pitch/pitchdetection.c \
pitch/pitchdetection.h \
pitch/pitchmcomb.c \
@@ -73,13 +78,7 @@
tempo/tempo.c \
tempo/tempo.h \
tempo/beattracking.c \
- tempo/beattracking.h \
- filter.c \
- filter.h \
- filterbank.c \
- filterbank.h \
- mfcc.h \
- mfcc.c
+ tempo/beattracking.h
AM_CFLAGS = @AUBIO_CFLAGS@ @FFTWLIB_CFLAGS@ @SAMPLERATE_CFLAGS@
libaubio_la_LIBADD = @FFTWLIB_LIBS@ @SAMPLERATE_LIBS@ @LTLIBOBJS@
--- a/src/aubio.h
+++ b/src/aubio.h
@@ -59,15 +59,15 @@
/* in this order */
#include "types.h"
#include "sample.h"
-#include "fft.h"
-#include "phasevoc.h"
+#include "spectral/fft.h"
+#include "spectral/phasevoc.h"
#include "mathutils.h"
-#include "scale.h"
-#include "hist.h"
-#include "tss.h"
-#include "resample.h"
-#include "biquad.h"
-#include "filter.h"
+#include "utils/scale.h"
+#include "utils/hist.h"
+#include "spectral/tss.h"
+#include "temporal/resample.h"
+#include "temporal/biquad.h"
+#include "temporal/filter.h"
#include "pitch/pitchdetection.h"
#include "pitch/pitchmcomb.h"
#include "pitch/pitchyin.h"
@@ -79,8 +79,8 @@
#include "onset/peakpick.h"
#include "tempo/beattracking.h"
#include "tempo/tempo.h"
-#include "filterbank.h"
-#include "mfcc.h"
+#include "spectral/filterbank.h"
+#include "spectral/mfcc.h"
#ifdef __cplusplus
} /* extern "C" */
--- a/src/biquad.c
+++ /dev/null
@@ -1,114 +1,0 @@
-/*
- Copyright (C) 2003 Paul Brossier
-
- This program is free software; you can redistribute it and/or modify
- it under the terms of the GNU General Public License as published by
- the Free Software Foundation; either version 2 of the License, or
- (at your option) any later version.
-
- This program is distributed in the hope that it will be useful,
- but WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- GNU General Public License for more details.
-
- You should have received a copy of the GNU General Public License
- along with this program; if not, write to the Free Software
- Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
-
-*/
-
-#include "aubio_priv.h"
-#include "sample.h"
-#include "mathutils.h"
-#include "biquad.h"
-
-/** \note this file needs to be in double or more less precision would lead to large
- * errors in the output
- */
-
-struct _aubio_biquad_t {
- lsmp_t a2;
- lsmp_t a3;
- lsmp_t b1;
- lsmp_t b2;
- lsmp_t b3;
- lsmp_t o1;
- lsmp_t o2;
- lsmp_t i1;
- lsmp_t i2;
-};
-
-void aubio_biquad_do(aubio_biquad_t * b, fvec_t * in) {
- uint_t i,j;
- lsmp_t i1 = b->i1;
- lsmp_t i2 = b->i2;
- lsmp_t o1 = b->o1;
- lsmp_t o2 = b->o2;
- lsmp_t a2 = b->a2;
- lsmp_t a3 = b->a3;
- lsmp_t b1 = b->b1;
- lsmp_t b2 = b->b2;
- lsmp_t b3 = b->b3;
-
- i=0; // works in mono only !!!
- //for (i=0;i<in->channels;i++) {
- for (j = 0; j < in->length; j++) {
- lsmp_t i0 = in->data[i][j];
- lsmp_t o0 = b1 * i0 + b2 * i1 + b3 * i2
- - a2 * o1 - a3 * o2;// + 1e-37;
- in->data[i][j] = o0;
- i2 = i1;
- i1 = i0;
- o2 = o1;
- o1 = o0;
- }
- b->i2 = i2;
- b->i1 = i1;
- b->o2 = o2;
- b->o1 = o1;
- //}
-}
-
-void aubio_biquad_do_filtfilt(aubio_biquad_t * b, fvec_t * in, fvec_t * tmp) {
- uint_t j,i=0;
- uint_t length = in->length;
- lsmp_t mir;
- /* mirroring */
- mir = 2*in->data[i][0];
- b->i1 = mir - in->data[i][2];
- b->i2 = mir - in->data[i][1];
- /* apply filtering */
- aubio_biquad_do(b,in);
- /* invert */
- for (j = 0; j < length; j++)
- tmp->data[i][length-j-1] = in->data[i][j];
- /* mirror again */
- mir = 2*tmp->data[i][0];
- b->i1 = mir - tmp->data[i][2];
- b->i2 = mir - tmp->data[i][1];
- /* apply filtering */
- aubio_biquad_do(b,tmp);
- /* invert back */
- for (j = 0; j < length; j++)
- in->data[i][j] = tmp->data[i][length-j-1];
-}
-
-aubio_biquad_t * new_aubio_biquad(
- lsmp_t b1, lsmp_t b2, lsmp_t b3,
- lsmp_t a2, lsmp_t a3) {
- aubio_biquad_t * b = AUBIO_NEW(aubio_biquad_t);
- b->a2 = a2;
- b->a3 = a3;
- b->b1 = b1;
- b->b2 = b2;
- b->b3 = b3;
- b->i1 = 0.;
- b->i2 = 0.;
- b->o1 = 0.;
- b->o2 = 0.;
- return b;
-}
-
-void del_aubio_biquad(aubio_biquad_t * b) {
- AUBIO_FREE(b);
-}
--- a/src/biquad.h
+++ /dev/null
@@ -1,80 +1,0 @@
-/*
- Copyright (C) 2003 Paul Brossier
-
- This program is free software; you can redistribute it and/or modify
- it under the terms of the GNU General Public License as published by
- the Free Software Foundation; either version 2 of the License, or
- (at your option) any later version.
-
- This program is distributed in the hope that it will be useful,
- but WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- GNU General Public License for more details.
-
- You should have received a copy of the GNU General Public License
- along with this program; if not, write to the Free Software
- Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
-
-*/
-
-#ifndef BIQUAD_H
-#define BIQUAD_H
-
-/** \file
-
- Second order Infinite Impulse Response filter
-
- This file implements a normalised biquad filter (second order IIR):
-
- \f$ y[n] = b_1 x[n] + b_2 x[n-1] + b_3 x[n-2] - a_2 y[n-1] - a_3 y[n-2] \f$
-
- The filtfilt version runs the filter twice, forward and backward, to
- compensate the phase shifting of the forward operation.
-
-*/
-
-#ifdef __cplusplus
-extern "C" {
-#endif
-
-/** biquad filter object */
-typedef struct _aubio_biquad_t aubio_biquad_t;
-
-/** filter input vector
-
- \param b biquad object as returned by new_aubio_biquad
- \param in input vector to filter
-
-*/
-void aubio_biquad_do(aubio_biquad_t * b, fvec_t * in);
-/** filter input vector forward and backward
-
- \param b biquad object as returned by new_aubio_biquad
- \param in input vector to filter
- \param tmp memory space to use for computation
-
-*/
-void aubio_biquad_do_filtfilt(aubio_biquad_t * b, fvec_t * in, fvec_t * tmp);
-/** create new biquad filter
-
- \param b1 forward filter coefficient
- \param b2 forward filter coefficient
- \param b3 forward filter coefficient
- \param a2 feedback filter coefficient
- \param a3 feedback filter coefficient
-
-*/
-aubio_biquad_t * new_aubio_biquad(lsmp_t b1, lsmp_t b2, lsmp_t b3, lsmp_t a2, lsmp_t a3);
-
-/** delete biquad filter
-
- \param b biquad object to delete
-
-*/
-void del_aubio_biquad(aubio_biquad_t * b);
-
-#ifdef __cplusplus
-}
-#endif
-
-#endif /*BIQUAD_H*/
--- a/src/fft.c
+++ /dev/null
@@ -1,194 +1,0 @@
-/*
- Copyright (C) 2003 Paul Brossier
-
- This program is free software; you can redistribute it and/or modify
- it under the terms of the GNU General Public License as published by
- the Free Software Foundation; either version 2 of the License, or
- (at your option) any later version.
-
- This program is distributed in the hope that it will be useful,
- but WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- GNU General Public License for more details.
-
- You should have received a copy of the GNU General Public License
- along with this program; if not, write to the Free Software
- Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
-
-*/
-
-#include "aubio_priv.h"
-#include "fvec.h"
-#include "cvec.h"
-#include "mathutils.h"
-#include "fft.h"
-
-#if FFTW3F_SUPPORT
-#define fftw_malloc fftwf_malloc
-#define fftw_free fftwf_free
-#define fftw_execute fftwf_execute
-#define fftw_plan_dft_r2c_1d fftwf_plan_dft_r2c_1d
-#define fftw_plan_dft_c2r_1d fftwf_plan_dft_c2r_1d
-#define fftw_plan_r2r_1d fftwf_plan_r2r_1d
-#define fftw_plan fftwf_plan
-#define fftw_destroy_plan fftwf_destroy_plan
-#endif
-
-#if FFTW3F_SUPPORT
-#define real_t smpl_t
-#else
-#define real_t lsmp_t
-#endif
-
-struct _aubio_fft_t {
- uint_t winsize;
- uint_t channels;
- uint_t fft_size;
- real_t *in, *out;
- fftw_plan pfw, pbw;
- fft_data_t * specdata; /* complex spectral data */
- fvec_t * compspec;
-};
-
-aubio_fft_t * new_aubio_fft(uint_t winsize, uint_t channels) {
- aubio_fft_t * s = AUBIO_NEW(aubio_fft_t);
- s->winsize = winsize;
- s->channels = channels;
- /* allocate memory */
- s->in = AUBIO_ARRAY(real_t,winsize);
- s->out = AUBIO_ARRAY(real_t,winsize);
- s->compspec = new_fvec(winsize,channels);
- /* create plans */
-#ifdef HAVE_COMPLEX_H
- s->fft_size = winsize/2 + 1;
- s->specdata = (fft_data_t*)fftw_malloc(sizeof(fft_data_t)*s->fft_size);
- s->pfw = fftw_plan_dft_r2c_1d(winsize, s->in, s->specdata, FFTW_ESTIMATE);
- s->pbw = fftw_plan_dft_c2r_1d(winsize, s->specdata, s->out, FFTW_ESTIMATE);
-#else
- s->fft_size = winsize;
- s->specdata = (fft_data_t*)fftw_malloc(sizeof(fft_data_t)*s->fft_size);
- s->pfw = fftw_plan_r2r_1d(winsize, s->in, s->specdata, FFTW_R2HC, FFTW_ESTIMATE);
- s->pbw = fftw_plan_r2r_1d(winsize, s->specdata, s->out, FFTW_HC2R, FFTW_ESTIMATE);
-#endif
- return s;
-}
-
-void del_aubio_fft(aubio_fft_t * s) {
- /* destroy data */
- del_fvec(s->compspec);
- fftw_destroy_plan(s->pfw);
- fftw_destroy_plan(s->pbw);
- fftw_free(s->specdata);
- AUBIO_FREE(s->out);
- AUBIO_FREE(s->in );
- AUBIO_FREE(s);
-}
-
-void aubio_fft_do(aubio_fft_t * s, fvec_t * input, cvec_t * spectrum) {
- aubio_fft_do_complex(s, input, s->compspec);
- aubio_fft_get_spectrum(s->compspec, spectrum);
-}
-
-void aubio_fft_rdo(aubio_fft_t * s, cvec_t * spectrum, fvec_t * output) {
- aubio_fft_get_realimag(spectrum, s->compspec);
- aubio_fft_rdo_complex(s, s->compspec, output);
-}
-
-void aubio_fft_do_complex(aubio_fft_t * s, fvec_t * input, fvec_t * compspec) {
- uint_t i, j;
- for (i = 0; i < s->channels; i++) {
- for (j=0; j < s->winsize; j++) {
- s->in[j] = input->data[i][j];
- }
- fftw_execute(s->pfw);
-#ifdef HAVE_COMPLEX_H
- compspec->data[i][0] = REAL(s->specdata[0]);
- for (j = 1; j < s->fft_size -1 ; j++) {
- compspec->data[i][j] = REAL(s->specdata[j]);
- compspec->data[i][compspec->length - j] = IMAG(s->specdata[j]);
- }
- compspec->data[i][s->fft_size-1] = REAL(s->specdata[s->fft_size-1]);
-#else
- for (j = 0; j < s->fft_size; j++) {
- compspec->data[i][j] = s->specdata[j];
- }
-#endif
- }
-}
-
-void aubio_fft_rdo_complex(aubio_fft_t * s, fvec_t * compspec, fvec_t * output) {
- uint_t i, j;
- const smpl_t renorm = 1./(smpl_t)s->winsize;
- for (i = 0; i < compspec->channels; i++) {
-#ifdef HAVE_COMPLEX_H
- s->specdata[0] = compspec->data[i][0];
- for (j=1; j < s->fft_size - 1; j++) {
- s->specdata[j] = compspec->data[i][j] +
- I * compspec->data[i][compspec->length - j];
- }
- s->specdata[s->fft_size - 1] = compspec->data[i][s->fft_size - 1];
-#else
- for (j=0; j < s->fft_size; j++) {
- s->specdata[j] = compspec->data[i][j];
- }
-#endif
- fftw_execute(s->pbw);
- for (j = 0; j < output->length; j++) {
- output->data[i][j] = s->out[j]*renorm;
- }
- }
-}
-
-void aubio_fft_get_spectrum(fvec_t * compspec, cvec_t * spectrum) {
- aubio_fft_get_phas(compspec, spectrum);
- aubio_fft_get_norm(compspec, spectrum);
-}
-
-void aubio_fft_get_realimag(cvec_t * spectrum, fvec_t * compspec) {
- aubio_fft_get_imag(spectrum, compspec);
- aubio_fft_get_real(spectrum, compspec);
-}
-
-void aubio_fft_get_phas(fvec_t * compspec, cvec_t * spectrum) {
- uint_t i, j;
- for (i = 0; i < spectrum->channels; i++) {
- spectrum->phas[i][0] = 0.;
- for (j=1; j < spectrum->length - 1; j++) {
- spectrum->phas[i][j] = atan2f(compspec->data[i][compspec->length-j],
- compspec->data[i][j]);
- }
- spectrum->phas[i][spectrum->length-1] = 0.;
- }
-}
-
-void aubio_fft_get_norm(fvec_t * compspec, cvec_t * spectrum) {
- uint_t i, j = 0;
- for (i = 0; i < spectrum->channels; i++) {
- spectrum->norm[i][0] = compspec->data[i][0];
- for (j=1; j < spectrum->length - 1; j++) {
- spectrum->norm[i][j] = SQRT(SQR(compspec->data[i][j])
- + SQR(compspec->data[i][compspec->length - j]) );
- }
- spectrum->norm[i][spectrum->length-1] = compspec->data[i][compspec->length/2];
- }
-}
-
-void aubio_fft_get_imag(cvec_t * spectrum, fvec_t * compspec) {
- uint_t i, j;
- for (i = 0; i < compspec->channels; i++) {
- for (j = 1; j < compspec->length / 2 + 1; j++) {
- compspec->data[i][compspec->length - j] =
- spectrum->norm[i][j]*SIN(spectrum->phas[i][j]);
- }
- }
-}
-
-void aubio_fft_get_real(cvec_t * spectrum, fvec_t * compspec) {
- uint_t i, j;
- for (i = 0; i < compspec->channels; i++) {
- for (j = 0; j< compspec->length / 2 + 1; j++) {
- compspec->data[i][j] =
- spectrum->norm[i][j]*COS(spectrum->phas[i][j]);
- }
- }
-}
--- a/src/fft.h
+++ /dev/null
@@ -1,163 +1,0 @@
-/*
- Copyright (C) 2003 Paul Brossier
-
- This program is free software; you can redistribute it and/or modify
- it under the terms of the GNU General Public License as published by
- the Free Software Foundation; either version 2 of the License, or
- (at your option) any later version.
-
- This program is distributed in the hope that it will be useful,
- but WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- GNU General Public License for more details.
-
- You should have received a copy of the GNU General Public License
- along with this program; if not, write to the Free Software
- Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
-
-*/
-
-/** \file
-
- Fast Fourier Transform object
-
-*/
-
-#ifndef FFT_H_
-#define FFT_H_
-
-/* note that <complex.h> is not included here but only in aubio_priv.h, so that
- * c++ projects can still use their own complex definition. */
-#include <fftw3.h>
-
-#ifdef HAVE_COMPLEX_H
-#if FFTW3F_SUPPORT
-#define FFTW_TYPE fftwf_complex
-#else
-#define FFTW_TYPE fftw_complex
-#endif
-#else
-#if FFTW3F_SUPPORT
-/** fft data type */
-#define FFTW_TYPE float
-#else
-/** fft data type */
-#define FFTW_TYPE double
-#endif
-#endif
-
-#ifdef __cplusplus
-extern "C" {
-#endif
-
-/** fft data type */
-typedef FFTW_TYPE fft_data_t;
-
-/** FFT object
-
- This object computes forward and backward FFTs, using the complex type to
- store the results. The phase vocoder or aubio_mfft_t objects should be
- preferred to using directly aubio_fft_t. The FFT are computed using FFTW3
- (although support for another library could be added).
-
-*/
-typedef struct _aubio_fft_t aubio_fft_t;
-
-/** create new FFT computation object
-
- \param size length of the FFT
- \param channels number of channels
-
-*/
-aubio_fft_t * new_aubio_fft(uint_t size, uint_t channels);
-/** delete FFT object
-
- \param s fft object as returned by new_aubio_fft
-
-*/
-void del_aubio_fft(aubio_fft_t * s);
-
-/** compute forward FFT
-
- \param s fft object as returned by new_aubio_fft
- \param input input signal
- \param spectrum output spectrum
-
-*/
-void aubio_fft_do (aubio_fft_t *s, fvec_t * input, cvec_t * spectrum);
-/** compute backward (inverse) FFT
-
- \param s fft object as returned by new_aubio_fft
- \param spectrum input spectrum
- \param output output signal
-
-*/
-void aubio_fft_rdo (aubio_fft_t *s, cvec_t * spectrum, fvec_t * output);
-
-/** compute forward FFT
-
- \param s fft object as returned by new_aubio_fft
- \param input real input signal
- \param compspec complex output fft real/imag
-
-*/
-void aubio_fft_do_complex (aubio_fft_t *s, fvec_t * input, fvec_t * compspec);
-/** compute backward (inverse) FFT from real/imag
-
- \param s fft object as returned by new_aubio_fft
- \param compspec real/imag input fft array
- \param output real output array
-
-*/
-void aubio_fft_rdo_complex (aubio_fft_t *s, fvec_t * compspec, fvec_t * output);
-
-/** convert real/imag spectrum to norm/phas spectrum
-
- \param compspec real/imag input fft array
- \param spectrum cvec norm/phas output array
-
-*/
-void aubio_fft_get_spectrum(fvec_t * compspec, cvec_t * spectrum);
-/** convert real/imag spectrum to norm/phas spectrum
-
- \param compspec real/imag input fft array
- \param spectrum cvec norm/phas output array
-
-*/
-void aubio_fft_get_realimag(cvec_t * spectrum, fvec_t * compspec);
-
-/** compute phas spectrum from real/imag parts
-
- \param compspec real/imag input fft array
- \param spectrum cvec norm/phas output array
-
-*/
-void aubio_fft_get_phas(fvec_t * compspec, cvec_t * spectrum);
-/** compute imaginary part from the norm/phas cvec
-
- \param spectrum norm/phas input array
- \param compspec real/imag output fft array
-
-*/
-void aubio_fft_get_imag(cvec_t * spectrum, fvec_t * compspec);
-
-/** compute norm component from real/imag parts
-
- \param compspec real/imag input fft array
- \param spectrum cvec norm/phas output array
-
-*/
-void aubio_fft_get_norm(fvec_t * compspec, cvec_t * spectrum);
-/** compute real part from norm/phas components
-
- \param spectrum norm/phas input array
- \param compspec real/imag output fft array
-
-*/
-void aubio_fft_get_real(cvec_t * spectrum, fvec_t * compspec);
-
-#ifdef __cplusplus
-}
-#endif
-
-#endif // FFT_H_
--- a/src/filter.c
+++ /dev/null
@@ -1,225 +1,0 @@
-/*
- Copyright (C) 2003 Paul Brossier
-
- This program is free software; you can redistribute it and/or modify
- it under the terms of the GNU General Public License as published by
- the Free Software Foundation; either version 2 of the License, or
- (at your option) any later version.
-
- This program is distributed in the hope that it will be useful,
- but WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- GNU General Public License for more details.
-
- You should have received a copy of the GNU General Public License
- along with this program; if not, write to the Free Software
- Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
-
-*/
-
-
-/* Requires lsmp_t to be long or double. float will NOT give reliable
- * results */
-
-#include "aubio_priv.h"
-#include "sample.h"
-#include "mathutils.h"
-#include "filter.h"
-
-struct _aubio_filter_t {
- uint_t order;
- lsmp_t * a;
- lsmp_t * b;
- lsmp_t * y;
- lsmp_t * x;
-};
-
-/* bug: mono only */
-void aubio_filter_do(aubio_filter_t * f, fvec_t * in) {
- uint_t i,j,l, order = f->order;
- lsmp_t *x = f->x;
- lsmp_t *y = f->y;
- lsmp_t *a = f->a;
- lsmp_t *b = f->b;
- i=0;//for (i=0;i<in->channels;i++) {
- for (j = 0; j < in->length; j++) {
- /* new input */
- //AUBIO_DBG("befor %f\t", in->data[i][j]);
- x[0] = in->data[i][j];
- y[0] = b[0] * x[0];
- for (l=1;l<order; l++) {
- y[0] += b[l] * x[l];
- y[0] -= a[l] * y[l];
- } /* + 1e-37; for denormal ? */
- /* new output */
- in->data[i][j] = y[0];
- //AUBIO_DBG("after %f\n", in->data[i][j]);
- /* store states for next sample */
- for (l=order-1; l>0; l--){
- x[l] = x[l-1];
- y[l] = y[l-1];
- }
- }
- /* store states for next buffer */
- f->x = x;
- f->y = y;
- //}
-}
-
-void aubio_filter_do_outplace(aubio_filter_t * f, fvec_t * in, fvec_t * out) {
- uint_t i,j,l, order = f->order;
- lsmp_t *x = f->x;
- lsmp_t *y = f->y;
- lsmp_t *a = f->a;
- lsmp_t *b = f->b;
-
- i=0; // works in mono only !!!
- //for (i=0;i<in->channels;i++) {
- for (j = 0; j < in->length; j++) {
- /* new input */
- x[0] = in->data[i][j];
- y[0] = b[0] * x[0];
- for (l=1;l<order; l++) {
- y[0] += b[l] * x[l];
- y[0] -= a[l] * y[l];
- }
- // + 1e-37;
- /* new output */
- out->data[i][j] = y[0];
- /* store for next sample */
- for (l=order-1; l>0; l--){
- x[l] = x[l-1];
- y[l] = y[l-1];
- }
- }
- /* store for next run */
- f->x = x;
- f->y = y;
- //}
-}
-
-/*
- *
- * despite mirroring, end effects destroy both phse and amplitude. the longer
- * the buffer, the less affected they are.
- *
- * replacing with zeros clicks.
- *
- * seems broken for order > 4 (see biquad_do_filtfilt for audible one)
- */
-void aubio_filter_do_filtfilt(aubio_filter_t * f, fvec_t * in, fvec_t * tmp) {
- uint_t j,i=0;
- uint_t length = in->length;
- //uint_t order = f->order;
- //lsmp_t mir;
- /* mirroring */
- //mir = 2*in->data[i][0];
- //for (j=1;j<order;j++)
- //f->x[j] = 0.;//mir - in->data[i][order-j];
- /* apply filtering */
- aubio_filter_do(f,in);
- /* invert */
- for (j = 0; j < length; j++)
- tmp->data[i][length-j-1] = in->data[i][j];
- /* mirror inverted */
- //mir = 2*tmp->data[i][0];
- //for (j=1;j<order;j++)
- //f->x[j] = 0.;//mir - tmp->data[i][order-j];
- /* apply filtering on inverted */
- aubio_filter_do(f,tmp);
- /* invert back */
- for (j = 0; j < length; j++)
- in->data[i][j] = tmp->data[i][length-j-1];
-}
-
-
-aubio_filter_t * new_aubio_adsgn_filter(uint_t samplerate) {
- aubio_filter_t * f = new_aubio_filter(samplerate, 7);
- lsmp_t * a = f->a;
- lsmp_t * b = f->b;
- /* uint_t l; */
- /* for now, 44100, adsgn */
- a[0] = 1.00000000000000000000000000000000000000000000000000000;
- a[1] = -4.01957618111583236952810693765059113502502441406250000;
- a[2] = 6.18940644292069386267485242569819092750549316406250000;
- a[3] = -4.45319890354411640487342083360999822616577148437500000;
- a[4] = 1.42084294962187751565352300531230866909027099609375000;
- a[5] = -0.14182547383030480458998567883099894970655441284179688;
- a[6] = 0.00435117723349511334451911181986361043527722358703613;
- b[0] = 0.25574112520425740235907596797915175557136535644531250;
- b[1] = -0.51148225040851391653973223583307117223739624023437500;
- b[2] = -0.25574112520426162120656954357400536537170410156250000;
- b[3] = 1.02296450081703405032840237254276871681213378906250000;
- b[4] = -0.25574112520426051098354491841746494174003601074218750;
- b[5] = -0.51148225040851369449512731080176308751106262207031250;
- b[6] = 0.25574112520425729133677350546349771320819854736328125;
- /* DBG: filter coeffs at creation time */
- /*
- for (l=0; l<f->order; l++){
- AUBIO_DBG("a[%d]=\t%1.16f\tb[%d]=\t%1.16f\n",l,a[l],l,b[l]);
- }
- */
- f->a = a;
- f->b = b;
- return f;
-}
-
-aubio_filter_t * new_aubio_cdsgn_filter(uint_t samplerate) {
- aubio_filter_t * f = new_aubio_filter(samplerate, 5);
- lsmp_t * a = f->a;
- lsmp_t * b = f->b;
- /* uint_t l; */
- /* for now, 44100, cdsgn */
- a[0] = 1.000000000000000000000000000000000000000000000000000000000000;
- a[1] = -2.134674963687040794013682898366823792457580566406250000000000;
- a[2] = 1.279333533236063358273781886964570730924606323242187500000000;
- a[3] = -0.149559846089396208945743182994192466139793395996093750000000;
- a[4] = 0.004908700174624848651394604104325480875559151172637939453125;
- b[0] = 0.217008561949218803377448239189106971025466918945312500000000;
- b[1] = -0.000000000000000222044604925031308084726333618164062500000000;
- b[2] = -0.434017123898438272888711253472138196229934692382812500000000;
- b[3] = 0.000000000000000402455846426619245903566479682922363281250000;
- b[4] = 0.217008561949218969910901932962588034570217132568359375000000;
- /* DBG: filter coeffs at creation time */
- /*
- for (l=0; l<f->order; l++){
- AUBIO_DBG("a[%d]=\t%1.16f\tb[%d]=\t%1.16f\n",l,a[l],l,b[l]);
- }
- */
- f->a = a;
- f->b = b;
- return f;
-}
-
-aubio_filter_t * new_aubio_filter(uint_t samplerate UNUSED, uint_t order) {
- aubio_filter_t * f = AUBIO_NEW(aubio_filter_t);
- lsmp_t * x = f->x;
- lsmp_t * y = f->y;
- lsmp_t * a = f->a;
- lsmp_t * b = f->b;
- uint_t l;
- f->order = order;
- a = AUBIO_ARRAY(lsmp_t,f->order);
- b = AUBIO_ARRAY(lsmp_t,f->order);
- x = AUBIO_ARRAY(lsmp_t,f->order);
- y = AUBIO_ARRAY(lsmp_t,f->order);
- /* initial states to zeros */
- for (l=0; l<f->order; l++){
- x[l] = 0.;
- y[l] = 0.;
- }
- f->x = x;
- f->y = y;
- f->a = a;
- f->b = b;
- return f;
-}
-
-void del_aubio_filter(aubio_filter_t * f) {
- AUBIO_FREE(f->a);
- AUBIO_FREE(f->b);
- AUBIO_FREE(f->x);
- AUBIO_FREE(f->y);
- AUBIO_FREE(f);
- return;
-}
--- a/src/filter.h
+++ /dev/null
@@ -1,97 +1,0 @@
-/*
- Copyright (C) 2003 Paul Brossier
-
- This program is free software; you can redistribute it and/or modify
- it under the terms of the GNU General Public License as published by
- the Free Software Foundation; either version 2 of the License, or
- (at your option) any later version.
-
- This program is distributed in the hope that it will be useful,
- but WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- GNU General Public License for more details.
-
- You should have received a copy of the GNU General Public License
- along with this program; if not, write to the Free Software
- Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
-
-*/
-
-#ifndef FILTER_H
-#define FILTER_H
-
-/** \file
-
- Infinite Impulse Response filter
-
- This file implements IIR filters of any order:
-
- \f$ y[n] = b_1 x[n] + ... + b_{order} x[n-order] -
- a_2 y[n-1] - ... - a_{order} y[n-order]\f$
-
- The filtfilt version runs the filter twice, forward and backward, to
- compensate the phase shifting of the forward operation.
-
-*/
-
-#ifdef __cplusplus
-extern "C" {
-#endif
-
-/** IIR filter object */
-typedef struct _aubio_filter_t aubio_filter_t;
-
-/** filter input vector (in-place)
-
- \param b biquad object as returned by new_aubio_biquad
- \param in input vector to filter
-
-*/
-void aubio_filter_do(aubio_filter_t * b, fvec_t * in);
-/** filter input vector (out-of-place)
-
- \param b biquad object as returned by new_aubio_biquad
- \param in input vector to filter
- \param out output vector to store filtered input
-
-*/
-void aubio_filter_do_outplace(aubio_filter_t * b, fvec_t * in, fvec_t * out);
-/** filter input vector forward and backward
-
- \param b biquad object as returned by new_aubio_biquad
- \param in input vector to filter
- \param tmp memory space to use for computation
-
-*/
-void aubio_filter_do_filtfilt(aubio_filter_t * b, fvec_t * in, fvec_t * tmp);
-/** create new IIR filter
-
- \param samplerate signal sampling rate
- \param order order of the filter (number of coefficients)
-
-*/
-aubio_filter_t * new_aubio_filter(uint_t samplerate, uint_t order);
-/** create a new A-design filter
-
- \param samplerate sampling-rate of the signal to filter
-
-*/
-aubio_filter_t * new_aubio_adsgn_filter(uint_t samplerate);
-/** create a new C-design filter
-
- \param samplerate sampling-rate of the signal to filter
-
-*/
-aubio_filter_t * new_aubio_cdsgn_filter(uint_t samplerate);
-/** delete a filter object
-
- \param f filter object to delete
-
-*/
-void del_aubio_filter(aubio_filter_t * f);
-
-#ifdef __cplusplus
-}
-#endif
-
-#endif /*FILTER_H*/
--- a/src/filterbank.c
+++ /dev/null
@@ -1,218 +1,0 @@
-/*
- Copyright (C) 2007 Amaury Hazan <ahazan@iua.upf.edu>
- and Paul Brossier <piem@piem.org>
-
- This program is free software; you can redistribute it and/or modify
- it under the terms of the GNU General Public License as published by
- the Free Software Foundation; either version 2 of the License, or
- (at your option) any later version.
-
- This program is distributed in the hope that it will be useful,
- but WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- GNU General Public License for more details.
-
- You should have received a copy of the GNU General Public License
- along with this program; if not, write to the Free Software
- Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
-
-*/
-
-
-#include "aubio_priv.h"
-#include "sample.h"
-#include "filterbank.h"
-#include "mathutils.h"
-
-#define VERY_SMALL_NUMBER 2e-42
-
-/** \brief A structure to store a set of n_filters filters of lenghts win_s */
-struct aubio_filterbank_t_ {
- uint_t win_s;
- uint_t n_filters;
- fvec_t **filters;
-};
-
-aubio_filterbank_t * new_aubio_filterbank(uint_t n_filters, uint_t win_s){
- /** allocating space for filterbank object */
- aubio_filterbank_t * fb = AUBIO_NEW(aubio_filterbank_t);
- uint_t filter_cnt;
- fb->win_s=win_s;
- fb->n_filters=n_filters;
-
- /** allocating filter tables */
- fb->filters=AUBIO_ARRAY(fvec_t*,n_filters);
- for (filter_cnt=0; filter_cnt<n_filters; filter_cnt++)
- /* considering one-channel filters */
- fb->filters[filter_cnt]=new_fvec(win_s, 1);
-
- return fb;
-}
-
-/*
-FB initialization based on Slaney's auditory toolbox
-TODO:
- *solve memory leak problems while
- *solve quantization issues when constructing signal:
- *bug for win_s=512
- *corrections for win_s=1024 -> why even filters with smaller amplitude
-
-*/
-
-aubio_filterbank_t * new_aubio_filterbank_mfcc(uint_t n_filters, uint_t win_s, uint_t samplerate, smpl_t freq_min, smpl_t freq_max){
-
- aubio_filterbank_t * fb = new_aubio_filterbank(n_filters, win_s);
-
-
- //slaney params
- smpl_t lowestFrequency = 133.3333;
- smpl_t linearSpacing = 66.66666666;
- smpl_t logSpacing = 1.0711703;
-
- uint_t linearFilters = 13;
- uint_t logFilters = 27;
- uint_t allFilters = linearFilters + logFilters;
-
- //buffers for computing filter frequencies
- fvec_t * freqs=new_fvec(allFilters+2 , 1);
-
- fvec_t * lower_freqs=new_fvec( allFilters, 1);
- fvec_t * upper_freqs=new_fvec( allFilters, 1);
- fvec_t * center_freqs=new_fvec( allFilters, 1);
-
- fvec_t * triangle_heights=new_fvec( allFilters, 1);
- //lookup table of each bin frequency in hz
- fvec_t * fft_freqs=new_fvec(win_s, 1);
-
- uint_t filter_cnt, bin_cnt;
-
- //first step: filling all the linear filter frequencies
- for(filter_cnt=0; filter_cnt<linearFilters; filter_cnt++){
- freqs->data[0][filter_cnt]=lowestFrequency+ filter_cnt*linearSpacing;
- }
- smpl_t lastlinearCF=freqs->data[0][filter_cnt-1];
-
- //second step: filling all the log filter frequencies
- for(filter_cnt=0; filter_cnt<logFilters+2; filter_cnt++){
- freqs->data[0][filter_cnt+linearFilters] =
- lastlinearCF*(pow(logSpacing,filter_cnt+1));
- }
-
- //Option 1. copying interesting values to lower_freqs, center_freqs and upper freqs arrays
- //TODO: would be nicer to have a reference to freqs->data, anyway we do not care in this init step
-
- for(filter_cnt=0; filter_cnt<allFilters; filter_cnt++){
- lower_freqs->data[0][filter_cnt]=freqs->data[0][filter_cnt];
- center_freqs->data[0][filter_cnt]=freqs->data[0][filter_cnt+1];
- upper_freqs->data[0][filter_cnt]=freqs->data[0][filter_cnt+2];
- }
-
- //computing triangle heights so that each triangle has unit area
- for(filter_cnt=0; filter_cnt<allFilters; filter_cnt++){
- triangle_heights->data[0][filter_cnt] = 2./(upper_freqs->data[0][filter_cnt]
- - lower_freqs->data[0][filter_cnt]);
- }
-
- //AUBIO_DBG("filter tables frequencies\n");
- //for(filter_cnt=0; filter_cnt<allFilters; filter_cnt++)
- // AUBIO_DBG("filter n. %d %f %f %f %f\n",
- // filter_cnt, lower_freqs->data[0][filter_cnt],
- // center_freqs->data[0][filter_cnt], upper_freqs->data[0][filter_cnt],
- // triangle_heights->data[0][filter_cnt]);
-
- //filling the fft_freqs lookup table, which assigns the frequency in hz to each bin
- for(bin_cnt=0; bin_cnt<win_s; bin_cnt++){
- fft_freqs->data[0][bin_cnt]= aubio_bintofreq(bin_cnt, samplerate, win_s);
- }
-
- //building each filter table
- for(filter_cnt=0; filter_cnt<allFilters; filter_cnt++){
-
- //TODO:check special case : lower freq =0
- //calculating rise increment in mag/Hz
- smpl_t riseInc= triangle_heights->data[0][filter_cnt]/(center_freqs->data[0][filter_cnt]-lower_freqs->data[0][filter_cnt]);
-
- //zeroing begining of filter
- for(bin_cnt=0; bin_cnt<win_s-1; bin_cnt++){
- fb->filters[filter_cnt]->data[0][bin_cnt]=0.f;
- if( fft_freqs->data[0][bin_cnt] <= lower_freqs->data[0][filter_cnt] &&
- fft_freqs->data[0][bin_cnt+1] > lower_freqs->data[0][filter_cnt]) {
- break;
- }
- }
- bin_cnt++;
-
- //positive slope
- for(; bin_cnt<win_s-1; bin_cnt++){
- fb->filters[filter_cnt]->data[0][bin_cnt]=(fft_freqs->data[0][bin_cnt]-lower_freqs->data[0][filter_cnt])*riseInc;
- //if(fft_freqs->data[0][bin_cnt]<= center_freqs->data[0][filter_cnt] && fft_freqs->data[0][bin_cnt+1]> center_freqs->data[0][filter_cnt])
- if(fft_freqs->data[0][bin_cnt+1]> center_freqs->data[0][filter_cnt])
- break;
- }
- //bin_cnt++;
-
- //negative slope
- for(; bin_cnt<win_s-1; bin_cnt++){
-
- //checking whether last value is less than 0...
- smpl_t val=triangle_heights->data[0][filter_cnt]-(fft_freqs->data[0][bin_cnt]-center_freqs->data[0][filter_cnt])*riseInc;
- if(val>=0)
- fb->filters[filter_cnt]->data[0][bin_cnt]=val;
- else fb->filters[filter_cnt]->data[0][bin_cnt]=0.f;
-
- //if(fft_freqs->data[0][bin_cnt]<= upper_freqs->data[0][bin_cnt] && fft_freqs->data[0][bin_cnt+1]> upper_freqs->data[0][filter_cnt])
- //TODO: CHECK whether bugfix correct
- if(fft_freqs->data[0][bin_cnt+1]> upper_freqs->data[0][filter_cnt])
- break;
- }
- //bin_cnt++;
-
- //zeroing tail
- for(; bin_cnt<win_s; bin_cnt++)
- fb->filters[filter_cnt]->data[0][bin_cnt]=0.f;
-
- }
-
-
- del_fvec(freqs);
- del_fvec(lower_freqs);
- del_fvec(upper_freqs);
- del_fvec(center_freqs);
-
- del_fvec(triangle_heights);
- del_fvec(fft_freqs);
-
- return fb;
-
-}
-
-void del_aubio_filterbank(aubio_filterbank_t * fb){
- uint_t filter_cnt;
- /** deleting filter tables first */
- for (filter_cnt=0; filter_cnt<fb->n_filters; filter_cnt++)
- del_fvec(fb->filters[filter_cnt]);
- AUBIO_FREE(fb->filters);
- AUBIO_FREE(fb);
-}
-
-void aubio_filterbank_do(aubio_filterbank_t * f, cvec_t * in, fvec_t *out) {
- uint_t n, filter_cnt;
- for(filter_cnt = 0; (filter_cnt < f->n_filters)
- && (filter_cnt < out->length); filter_cnt++){
- out->data[0][filter_cnt] = 0.f;
- for(n = 0; n < in->length; n++){
- out->data[0][filter_cnt] += in->norm[0][n]
- * f->filters[filter_cnt]->data[0][n];
- }
- out->data[0][filter_cnt] =
- LOG(out->data[0][filter_cnt] < VERY_SMALL_NUMBER ?
- VERY_SMALL_NUMBER : out->data[0][filter_cnt]);
- }
-
- return;
-}
-
-fvec_t * aubio_filterbank_getchannel(aubio_filterbank_t * f, uint_t channel) {
- if ( (channel < f->n_filters) ) { return f->filters[channel]; }
- else { return NULL; }
-}
--- a/src/filterbank.h
+++ /dev/null
@@ -1,80 +1,0 @@
-/*
- Copyright (C) 2007 Amaury Hazan <ahazan@iua.upf.edu>
- and Paul Brossier <piem@piem.org>
-
- This program is free software; you can redistribute it and/or modify
- it under the terms of the GNU General Public License as published by
- the Free Software Foundation; either version 2 of the License, or
- (at your option) any later version.
-
- This program is distributed in the hope that it will be useful,
- but WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- GNU General Public License for more details.
-
- You should have received a copy of the GNU General Public License
- along with this program; if not, write to the Free Software
- Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
-*/
-
-/** \file
-
- Filterbank object
-
- General-purpose spectral filterbank object. Comes with mel-filter initialization function.
-
-*/
-
-#ifndef FILTERBANK_H
-#define FILTERBANK_H
-
-#ifdef __cplusplus
-extern "C" {
-#endif
-
-/** filterbank object */
-typedef struct aubio_filterbank_t_ aubio_filterbank_t;
-
-/** create filterbank object
-
- \param win_s size of analysis buffer (and length the FFT transform)
- \param n_filters number of filters to create
-
-*/
-
-aubio_filterbank_t * new_aubio_filterbank(uint_t n_filters, uint_t win_s);
-
-/** filterbank initialization for mel filters
-
-
- \param n_filters number of filters
- \param win_s window size
- \param samplerate
- \param freq_min lowest filter frequency
- \param freq_max highest filter frequency
-
-*/
-aubio_filterbank_t * new_aubio_filterbank_mfcc(uint_t n_filters, uint_t win_s, uint_t samplerate, smpl_t freq_min, smpl_t freq_max);
-
-/** destroy filterbank object
-
- \param fb filterbank, as returned by new_aubio_filterbank method
-
-*/
-void del_aubio_filterbank(aubio_filterbank_t * fb);
-
-/** compute filterbank
-
-*/
-void aubio_filterbank_do(aubio_filterbank_t * fb, cvec_t * in, fvec_t *out);
-
-/** return the vector containing the filter coefficients of one channel
-
- */
-fvec_t * aubio_filterbank_getchannel(aubio_filterbank_t * f, uint_t channel);
-
-#ifdef __cplusplus
-}
-#endif
-
-#endif // FILTERBANK_H
--- a/src/hist.c
+++ /dev/null
@@ -1,157 +1,0 @@
-/*
- Copyright (C) 2003 Paul Brossier
-
- This program is free software; you can redistribute it and/or modify
- it under the terms of the GNU General Public License as published by
- the Free Software Foundation; either version 2 of the License, or
- (at your option) any later version.
-
- This program is distributed in the hope that it will be useful,
- but WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- GNU General Public License for more details.
-
- You should have received a copy of the GNU General Public License
- along with this program; if not, write to the Free Software
- Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
-*/
-
-#include "aubio_priv.h"
-#include "sample.h"
-#include "scale.h"
-#include "mathutils.h" //vec_min vec_max
-#include "hist.h"
-
-/********
- * Object Structure
- */
-
-struct _aubio_hist_t {
- fvec_t * hist;
- uint_t nelems;
- uint_t channels;
- fvec_t * cent;
- aubio_scale_t *scaler;
-};
-
-/**
- * Object creation/deletion calls
- */
-aubio_hist_t * new_aubio_hist (smpl_t ilow, smpl_t ihig, uint_t nelems, uint_t channels){
- aubio_hist_t * s = AUBIO_NEW(aubio_hist_t);
- smpl_t step = (ihig-ilow)/(smpl_t)(nelems);
- smpl_t accum = step;
- uint_t i;
- s->channels = channels;
- s->nelems = nelems;
- s->hist = new_fvec(nelems, channels);
- s->cent = new_fvec(nelems, 1);
-
- /* use scale to map ilow/ihig -> 0/nelems */
- s->scaler = new_aubio_scale(ilow,ihig,0,nelems);
- /* calculate centers now once */
- s->cent->data[0][0] = ilow + 0.5 * step;
- for (i=1; i < s->nelems; i++, accum+=step )
- s->cent->data[0][i] = s->cent->data[0][0] + accum;
-
- return s;
-}
-
-void del_aubio_hist(aubio_hist_t *s) {
- del_fvec(s->hist);
- del_fvec(s->cent);
- del_aubio_scale(s->scaler);
- AUBIO_FREE(s);
-}
-
-/***
- * do it
- */
-void aubio_hist_do (aubio_hist_t *s, fvec_t *input) {
- uint_t i,j;
- sint_t tmp = 0;
- aubio_scale_do(s->scaler, input);
- /* reset data */
- for (i=0; i < s->channels; i++)
- for (j=0; j < s->nelems; j++)
- s->hist->data[i][j] = 0;
- /* run accum */
- for (i=0; i < input->channels; i++)
- for (j=0; j < input->length; j++)
- {
- tmp = (sint_t)FLOOR(input->data[i][j]);
- if ((tmp >= 0) && (tmp < (sint_t)s->nelems))
- s->hist->data[i][tmp] += 1;
- }
-}
-
-void aubio_hist_do_notnull (aubio_hist_t *s, fvec_t *input) {
- uint_t i,j;
- sint_t tmp = 0;
- aubio_scale_do(s->scaler, input);
- /* reset data */
- for (i=0; i < s->channels; i++)
- for (j=0; j < s->nelems; j++)
- s->hist->data[i][j] = 0;
- /* run accum */
- for (i=0; i < input->channels; i++)
- for (j=0; j < input->length; j++) {
- if (input->data[i][j] != 0) {
- tmp = (sint_t)FLOOR(input->data[i][j]);
- if ((tmp >= 0) && (tmp < (sint_t)s->nelems))
- s->hist->data[i][tmp] += 1;
- }
- }
-}
-
-
-void aubio_hist_dyn_notnull (aubio_hist_t *s, fvec_t *input) {
- uint_t i,j;
- sint_t tmp = 0;
- smpl_t ilow = vec_min(input);
- smpl_t ihig = vec_max(input);
- smpl_t step = (ihig-ilow)/(smpl_t)(s->nelems);
-
- /* readapt */
- aubio_scale_set(s->scaler, ilow, ihig, 0, s->nelems);
-
- /* recalculate centers */
- s->cent->data[0][0] = ilow + 0.5f * step;
- for (i=1; i < s->nelems; i++)
- s->cent->data[0][i] = s->cent->data[0][0] + i * step;
-
- /* scale */
- aubio_scale_do(s->scaler, input);
-
- /* reset data */
- for (i=0; i < s->channels; i++)
- for (j=0; j < s->nelems; j++)
- s->hist->data[i][j] = 0;
- /* run accum */
- for (i=0; i < input->channels; i++)
- for (j=0; j < input->length; j++) {
- if (input->data[i][j] != 0) {
- tmp = (sint_t)FLOOR(input->data[i][j]);
- if ((tmp >= 0) && (tmp < (sint_t)s->nelems))
- s->hist->data[i][tmp] += 1;
- }
- }
-}
-
-void aubio_hist_weight (aubio_hist_t *s) {
- uint_t i,j;
- for (i=0; i < s->channels; i++)
- for (j=0; j < s->nelems; j++) {
- s->hist->data[i][j] *= s->cent->data[0][j];
- }
-}
-
-smpl_t aubio_hist_mean (aubio_hist_t *s) {
- uint_t i,j;
- smpl_t tmp = 0.0f;
- for (i=0; i < s->channels; i++)
- for (j=0; j < s->nelems; j++)
- tmp += s->hist->data[i][j];
- return tmp/(smpl_t)(s->nelems);
-}
-
--- a/src/hist.h
+++ /dev/null
@@ -1,61 +1,0 @@
-/*
- Copyright (C) 2003 Paul Brossier
-
- This program is free software; you can redistribute it and/or modify
- it under the terms of the GNU General Public License as published by
- the Free Software Foundation; either version 2 of the License, or
- (at your option) any later version.
-
- This program is distributed in the hope that it will be useful,
- but WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- GNU General Public License for more details.
-
- You should have received a copy of the GNU General Public License
- along with this program; if not, write to the Free Software
- Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
-
-*/
-
-/** @file
- *
- * Histogram function
- *
- * Big hacks to implement an histogram
- */
-
-#ifndef HIST_H
-#define HIST_H
-
-#ifdef __cplusplus
-extern "C" {
-#endif
-
-/** histogram object */
-typedef struct _aubio_hist_t aubio_hist_t;
-
-/** histogram creation
- * \param flow minimum input
- * \param fhig maximum input
- * \param nelems number of histogram columns
- * \param channels number of channels
- */
-aubio_hist_t * new_aubio_hist(smpl_t flow, smpl_t fhig, uint_t nelems, uint_t channels);
-/** histogram deletion */
-void del_aubio_hist(aubio_hist_t *s);
-/** compute the histogram */
-void aubio_hist_do(aubio_hist_t *s, fvec_t * input);
-/** compute the histogram ignoring null elements */
-void aubio_hist_do_notnull(aubio_hist_t *s, fvec_t * input);
-/** compute the mean of the histogram */
-smpl_t aubio_hist_mean(aubio_hist_t *s);
-/** weight the histogram */
-void aubio_hist_weight(aubio_hist_t *s);
-/** compute dynamic histogram for non-null elements */
-void aubio_hist_dyn_notnull (aubio_hist_t *s, fvec_t *input);
-
-#ifdef __cplusplus
-}
-#endif
-
-#endif
--- a/src/mfcc.c
+++ /dev/null
@@ -1,124 +1,0 @@
-/*
- Copyright (C) 2006 Amaury Hazan
- Ported to aubio from LibXtract
- http://libxtract.sourceforge.net/
-
-
- This program is free software; you can redistribute it and/or modify
- it under the terms of the GNU General Public License as published by
- the Free Software Foundation; either version 2 of the License, or
- (at your option) any later version.
-
- This program is distributed in the hope that it will be useful,
- but WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- GNU General Public License for more details.
-
- You should have received a copy of the GNU General Public License
- along with this program; if not, write to the Free Software
- Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
-
-*/
-
-#include "aubio_priv.h"
-#include "sample.h"
-#include "fft.h"
-#include "filterbank.h"
-#include "mfcc.h"
-#include "math.h"
-
-/** Internal structure for mfcc object **/
-
-struct aubio_mfcc_t_{
- uint_t win_s; /** grain length */
- uint_t samplerate; /** sample rate (needed?) */
- uint_t channels; /** number of channels */
- uint_t n_filters; /** number of *filters */
- uint_t n_coefs; /** number of coefficients (<= n_filters/2 +1) */
- smpl_t lowfreq; /** lowest frequency for filters */
- smpl_t highfreq; /** highest frequency for filters */
- aubio_filterbank_t * fb; /** filter bank */
- fvec_t * in_dct; /** input buffer for dct * [fb->n_filters] */
- aubio_fft_t * fft_dct; /** fft object for dct */
- cvec_t * fftgrain_dct; /** output buffer for dct */
-};
-
-
-aubio_mfcc_t * new_aubio_mfcc (uint_t win_s, uint_t samplerate, uint_t n_filters, uint_t n_coefs, smpl_t lowfreq, smpl_t highfreq, uint_t channels){
- /** allocating space for mfcc object */
- aubio_mfcc_t * mfcc = AUBIO_NEW(aubio_mfcc_t);
-
- //we need (n_coefs-1)*2 filters to obtain n_coefs coefficients after dct
- //uint_t n_filters = (n_coefs-1)*2;
-
- mfcc->win_s=win_s;
- mfcc->samplerate=samplerate;
- mfcc->channels=channels;
- mfcc->n_filters=n_filters;
- mfcc->n_coefs=n_coefs;
- mfcc->lowfreq=lowfreq;
- mfcc->highfreq=highfreq;
-
-
- /** filterbank allocation */
- mfcc->fb = new_aubio_filterbank_mfcc(n_filters, mfcc->win_s, samplerate, lowfreq, highfreq);
-
- /** allocating space for fft object (used for dct) */
- mfcc->fft_dct=new_aubio_fft(n_filters, 1);
-
- /** allocating buffers */
- mfcc->in_dct=new_fvec(mfcc->win_s, 1);
-
- mfcc->fftgrain_dct=new_cvec(n_filters, 1);
-
- return mfcc;
-};
-
-void del_aubio_mfcc(aubio_mfcc_t *mf){
- /** deleting filterbank */
- del_aubio_filterbank(mf->fb);
- /** deleting fft object */
- del_aubio_fft(mf->fft_dct);
- /** deleting buffers */
- del_fvec(mf->in_dct);
- del_cvec(mf->fftgrain_dct);
-
- /** deleting mfcc object */
- AUBIO_FREE(mf);
-}
-
-
-/** intermediate dct involved in aubio_mfcc_do
-
- \param mf mfcc object as returned by new_aubio_mfcc
- \param in input spectrum (n_filters long)
- \param out output mel coefficients buffer (n_filters/2 +1 long)
-
-*/
-void aubio_dct_do(aubio_mfcc_t * mf, fvec_t *in, fvec_t *out);
-
-void aubio_mfcc_do(aubio_mfcc_t * mf, cvec_t *in, fvec_t *out){
- // compute filterbank
- aubio_filterbank_do(mf->fb, in, mf->in_dct);
- //TODO: check that zero padding
- // the following line seems useless since the in_dct buffer has the correct size
- //for(n = filter + 1; n < N; n++) result[n] = 0;
-
- aubio_dct_do(mf, mf->in_dct, out);
-
- return;
-}
-
-void aubio_dct_do(aubio_mfcc_t * mf, fvec_t *in, fvec_t *out){
- uint_t i;
- //compute mag spectrum
- aubio_fft_do (mf->fft_dct, in, mf->fftgrain_dct);
- //extract real part of fft grain
- for(i=0; i<mf->n_coefs ;i++){
- //for(i=0; i<out->length;i++){
- out->data[0][i]= mf->fftgrain_dct->norm[0][i]
- *COS(mf->fftgrain_dct->phas[0][i]);
- }
- return;
-}
-
--- a/src/mfcc.h
+++ /dev/null
@@ -1,67 +1,0 @@
-/*
- Copyright (C) 2007 Amaury Hazan <ahazan@iua.upf.edu>
- and Paul Brossier <piem@piem.org>
-
- This program is free software; you can redistribute it and/or modify
- it under the terms of the GNU General Public License as published by
- the Free Software Foundation; either version 2 of the License, or
- (at your option) any later version.
-
- This program is distributed in the hope that it will be useful,
- but WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- GNU General Public License for more details.
-
- You should have received a copy of the GNU General Public License
- along with this program; if not, write to the Free Software
- Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
-
-*/
-
-/* part of this mfcc implementation were inspired from LibXtract
- http://libxtract.sourceforge.net/
-*/
-
-#ifndef MFCC_H
-#define MFCC_H
-
-#ifdef __cplusplus
-extern "C" {
-#endif
-
-#include "sample.h"
-#include "filterbank.h"
-
-typedef struct aubio_mfcc_t_ aubio_mfcc_t;
-
-/** create mfcc object
-
- \param win_s size of analysis buffer (and length the FFT transform)
- \param samplerate
- \param n_coefs: number of desired coefs
- \param lowfreq: lowest frequency to use in filterbank
- \param highfreq highest frequency to use in filterbank
- \param channels number of channels
-
-*/
-aubio_mfcc_t * new_aubio_mfcc (uint_t win_s, uint_t samplerate, uint_t n_filters, uint_t n_coefs, smpl_t lowfreq, smpl_t highfreq, uint_t channels);
-/** delete mfcc object
-
- \param mf mfcc object as returned by new_aubio_mfcc
-
-*/
-void del_aubio_mfcc(aubio_mfcc_t *mf);
-/** mfcc object processing
-
- \param mf mfcc object as returned by new_aubio_mfcc
- \param in input spectrum (win_s long)
- \param out output mel coefficients buffer (n_filters/2 +1 long)
-
-*/
-void aubio_mfcc_do(aubio_mfcc_t * mf, cvec_t *in, fvec_t *out);
-
-#ifdef __cplusplus
-}
-#endif
-
-#endif // MFCC_H
--- a/src/onset/onset.c
+++ b/src/onset/onset.c
@@ -20,10 +20,10 @@
#include "aubio_priv.h"
#include "sample.h"
#include "onset/onsetdetection.h"
-#include "phasevoc.h"
-#include "peakpick.h"
+#include "spectral/phasevoc.h"
+#include "onset/peakpick.h"
#include "mathutils.h"
-#include "onset.h"
+#include "onset/onset.h"
/** structure to store object state */
struct _aubio_onset_t {
--- a/src/onset/onsetdetection.c
+++ b/src/onset/onsetdetection.c
@@ -19,9 +19,9 @@
#include "aubio_priv.h"
#include "sample.h"
-#include "fft.h"
+#include "spectral/fft.h"
#include "mathutils.h"
-#include "hist.h"
+#include "utils/hist.h"
#include "onset/onsetdetection.h"
--- a/src/onset/peakpick.c
+++ b/src/onset/peakpick.c
@@ -20,8 +20,8 @@
#include "aubio_priv.h"
#include "sample.h"
#include "mathutils.h"
-#include "biquad.h"
-#include "peakpick.h"
+#include "temporal/biquad.h"
+#include "onset/peakpick.h"
/* peak picking parameters, default values in brackets
*
--- a/src/phasevoc.c
+++ /dev/null
@@ -1,150 +1,0 @@
-/*
- Copyright (C) 2003 Paul Brossier
-
- This program is free software; you can redistribute it and/or modify
- it under the terms of the GNU General Public License as published by
- the Free Software Foundation; either version 2 of the License, or
- (at your option) any later version.
-
- This program is distributed in the hope that it will be useful,
- but WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- GNU General Public License for more details.
-
- You should have received a copy of the GNU General Public License
- along with this program; if not, write to the Free Software
- Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
-
-*/
-
-#include "aubio_priv.h"
-#include "fvec.h"
-#include "cvec.h"
-#include "fft.h"
-#include "mathutils.h"
-#include "phasevoc.h"
-
-/** phasevocoder internal object */
-struct _aubio_pvoc_t {
- uint_t win_s; /** grain length */
- uint_t hop_s; /** overlap step */
- uint_t channels; /** number of channels */
- aubio_fft_t * fft; /** fft object */
- fvec_t * synth; /** cur output grain [win_s] */
- fvec_t * synthold; /** last input frame [win_s-hop_s] */
- fvec_t * data; /** current input grain [win_s] */
- fvec_t * dataold; /** last input frame [win_s-hop_s] */
- smpl_t * w; /** grain window [win_s] */
-};
-
-
-/** returns data and dataold slided by hop_s */
-static void aubio_pvoc_swapbuffers(smpl_t * data, smpl_t * dataold, const
- smpl_t * datanew, uint_t win_s, uint_t hop_s);
-
-/** do additive synthesis from 'old' and 'cur' */
-static void aubio_pvoc_addsynth(const smpl_t * synth, smpl_t * synthold,
- smpl_t * synthnew, uint_t win_s, uint_t hop_s);
-
-void aubio_pvoc_do(aubio_pvoc_t *pv, fvec_t * datanew, cvec_t *fftgrain) {
- uint_t i,j;
- for (i=0; i<pv->channels; i++) {
- /* slide */
- aubio_pvoc_swapbuffers(pv->data->data[i],pv->dataold->data[i],
- datanew->data[i],pv->win_s,pv->hop_s);
- /* windowing */
- for (j=0; j<pv->win_s; j++) pv->data->data[i][j] *= pv->w[j];
- }
- /* shift */
- vec_shift(pv->data);
- /* calculate fft */
- aubio_fft_do (pv->fft,pv->data,fftgrain);
-}
-
-void aubio_pvoc_rdo(aubio_pvoc_t *pv,cvec_t * fftgrain, fvec_t * synthnew) {
- uint_t i;
- /* calculate rfft */
- aubio_fft_rdo(pv->fft,fftgrain,pv->synth);
- /* unshift */
- vec_shift(pv->synth);
- for (i=0; i<pv->channels; i++) {
- aubio_pvoc_addsynth(pv->synth->data[i],pv->synthold->data[i],
- synthnew->data[i],pv->win_s,pv->hop_s);
- }
-}
-
-aubio_pvoc_t * new_aubio_pvoc (uint_t win_s, uint_t hop_s, uint_t channels) {
- aubio_pvoc_t * pv = AUBIO_NEW(aubio_pvoc_t);
-
- if (win_s < 2*hop_s) {
- AUBIO_ERR("Hop size bigger than half the window size!\n");
- AUBIO_ERR("Resetting hop size to half the window size.\n");
- hop_s = win_s / 2;
- }
-
- if (hop_s < 1) {
- AUBIO_ERR("Hop size is smaller than 1!\n");
- AUBIO_ERR("Resetting hop size to half the window size.\n");
- hop_s = win_s / 2;
- }
-
- pv->fft = new_aubio_fft(win_s,channels);
-
- /* remember old */
- pv->data = new_fvec (win_s, channels);
- pv->synth = new_fvec (win_s, channels);
-
- /* new input output */
- pv->dataold = new_fvec (win_s-hop_s, channels);
- pv->synthold = new_fvec (win_s-hop_s, channels);
- pv->w = AUBIO_ARRAY(smpl_t,win_s);
- aubio_window(pv->w,win_s,aubio_win_hanningz);
-
- pv->channels = channels;
- pv->hop_s = hop_s;
- pv->win_s = win_s;
-
- return pv;
-}
-
-void del_aubio_pvoc(aubio_pvoc_t *pv) {
- del_fvec(pv->data);
- del_fvec(pv->synth);
- del_fvec(pv->dataold);
- del_fvec(pv->synthold);
- del_aubio_fft(pv->fft);
- AUBIO_FREE(pv->w);
- AUBIO_FREE(pv);
-}
-
-static void aubio_pvoc_swapbuffers(smpl_t * data, smpl_t * dataold,
- const smpl_t * datanew, uint_t win_s, uint_t hop_s)
-{
- uint_t i;
- for (i=0;i<win_s-hop_s;i++)
- data[i] = dataold[i];
- for (i=0;i<hop_s;i++)
- data[win_s-hop_s+i] = datanew[i];
- for (i=0;i<win_s-hop_s;i++)
- dataold[i] = data[i+hop_s];
-}
-
-static void aubio_pvoc_addsynth(const smpl_t * synth, smpl_t * synthold,
- smpl_t * synthnew, uint_t win_s, uint_t hop_s)
-{
- uint_t i;
- smpl_t scale = 2*hop_s/(win_s+.0);
- /* add new synth to old one and put result in synthnew */
- for (i=0;i<hop_s;i++)
- synthnew[i] = synthold[i]+synth[i]*scale;
- /* shift synthold */
- for (i=0;i<win_s-2*hop_s;i++)
- synthold[i] = synthold[i+hop_s];
- /* erase last frame in synthold */
- for (i=win_s-hop_s;i<win_s;i++)
- synthold[i-hop_s]=0.;
- /* additive synth */
- for (i=0;i<win_s-hop_s;i++)
- synthold[i] += synth[i+hop_s]*scale;
-}
-
--- a/src/phasevoc.h
+++ /dev/null
@@ -1,106 +1,0 @@
-/*
- Copyright (C) 2003 Paul Brossier
-
- This program is free software; you can redistribute it and/or modify
- it under the terms of the GNU General Public License as published by
- the Free Software Foundation; either version 2 of the License, or
- (at your option) any later version.
-
- This program is distributed in the hope that it will be useful,
- but WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- GNU General Public License for more details.
-
- You should have received a copy of the GNU General Public License
- along with this program; if not, write to the Free Software
- Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
-
-*/
-
-/** \file
-
- Phase vocoder object
-
- This object implements a phase vocoder. The spectral frames are computed
- using a HanningZ window and a swapped version of the signal to simplify the
- phase relationships across frames. The window sizes and overlap are specified
- at creation time. Multiple channels are fully supported.
-
-*/
-
-#ifndef _PHASEVOC_H
-#define _PHASEVOC_H
-
-#ifdef __cplusplus
-extern "C" {
-#endif
-
-/** phasevocoder object */
-typedef struct _aubio_pvoc_t aubio_pvoc_t;
-
-/** create phase vocoder object
-
- \param win_s size of analysis buffer (and length the FFT transform)
- \param hop_s step size between two consecutive analysis
- \param channels number of channels
-
-*/
-aubio_pvoc_t * new_aubio_pvoc (uint_t win_s, uint_t hop_s, uint_t channels);
-/** delete phase vocoder object
-
- \param pv phase vocoder object as returned by new_aubio_pvoc
-
-*/
-void del_aubio_pvoc(aubio_pvoc_t *pv);
-
-/** compute spectral frame
-
- This function accepts an input vector of size [channels]x[hop_s]. The
- analysis buffer is rotated and filled with the new data. After windowing of
- this signal window, the Fourier transform is computed and returned in
- fftgrain as two vectors, magnitude and phase.
-
- \param pv phase vocoder object as returned by new_aubio_pvoc
- \param in new input signal (hop_s long)
- \param fftgrain output spectral frame
-
-*/
-void aubio_pvoc_do(aubio_pvoc_t *pv, fvec_t *in, cvec_t * fftgrain);
-/** compute signal from spectral frame
-
- This function takes an input spectral frame fftgrain of size
- [channels]x[buf_s] and computes its inverse Fourier transform. Overlap-add
- synthesis is then computed using the previously synthetised frames, and the
- output stored in out.
-
- \param pv phase vocoder object as returned by new_aubio_pvoc
- \param fftgrain input spectral frame
- \param out output signal (hop_s long)
-
-*/
-void aubio_pvoc_rdo(aubio_pvoc_t *pv, cvec_t * fftgrain, fvec_t *out);
-
-/** get window size
-
- \param pv phase vocoder to get the window size from
-
-*/
-uint_t aubio_pvoc_get_win(aubio_pvoc_t* pv);
-/** get hop size
-
- \param pv phase vocoder to get the hop size from
-
-*/
-uint_t aubio_pvoc_get_hop(aubio_pvoc_t* pv);
-/** get channel number
-
- \param pv phase vocoder to get the number of channels from
-
-*/
-uint_t aubio_pvoc_get_channels(aubio_pvoc_t* pv);
-
-#ifdef __cplusplus
-}
-#endif
-
-#endif
--- a/src/pitch/pitchdetection.c
+++ b/src/pitch/pitchdetection.c
@@ -18,15 +18,15 @@
#include "aubio_priv.h"
#include "sample.h"
-#include "phasevoc.h"
+#include "spectral/phasevoc.h"
#include "mathutils.h"
-#include "filter.h"
+#include "temporal/filter.h"
#include "pitch/pitchmcomb.h"
#include "pitch/pitchyin.h"
#include "pitch/pitchfcomb.h"
#include "pitch/pitchschmitt.h"
#include "pitch/pitchyinfft.h"
-#include "pitchdetection.h"
+#include "pitch/pitchdetection.h"
typedef smpl_t (*aubio_pitchdetection_func_t)
(aubio_pitchdetection_t *p, fvec_t * ibuf);
--- a/src/pitch/pitchfcomb.c
+++ b/src/pitch/pitchfcomb.c
@@ -20,7 +20,7 @@
#include "aubio_priv.h"
#include "sample.h"
#include "mathutils.h"
-#include "fft.h"
+#include "spectral/fft.h"
#include "pitch/pitchfcomb.h"
#define MAX_PEAKS 8
--- a/src/pitch/pitchyinfft.c
+++ b/src/pitch/pitchyinfft.c
@@ -19,7 +19,7 @@
#include "aubio_priv.h"
#include "sample.h"
#include "mathutils.h"
-#include "fft.h"
+#include "spectral/fft.h"
#include "pitch/pitchyinfft.h"
/** pitch yinfft structure */
--- a/src/resample.c
+++ /dev/null
@@ -1,65 +1,0 @@
-/*
- Copyright (C) 2003 Paul Brossier
-
- This program is free software; you can redistribute it and/or modify
- it under the terms of the GNU General Public License as published by
- the Free Software Foundation; either version 2 of the License, or
- (at your option) any later version.
-
- This program is distributed in the hope that it will be useful,
- but WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- GNU General Public License for more details.
-
- You should have received a copy of the GNU General Public License
- along with this program; if not, write to the Free Software
- Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
-
-*/
-
-
-#include <samplerate.h> /* from libsamplerate */
-
-#include "aubio_priv.h"
-#include "sample.h"
-#include "resample.h"
-
-struct _aubio_resampler_t {
- SRC_DATA *proc;
- SRC_STATE *stat;
- float ratio;
- uint_t type;
-};
-
-aubio_resampler_t * new_aubio_resampler(float ratio, uint_t type) {
- aubio_resampler_t * s = AUBIO_NEW(aubio_resampler_t);
- int error = 0;
- s->stat = src_new (type, 1, &error) ; /* only one channel */
- s->proc = AUBIO_NEW(SRC_DATA);
- if (error) AUBIO_ERR("%s\n",src_strerror(error));
- s->ratio = ratio;
- return s;
-}
-
-void del_aubio_resampler(aubio_resampler_t *s) {
- src_delete(s->stat);
- AUBIO_FREE(s->proc);
- AUBIO_FREE(s);
-}
-
-uint_t aubio_resampler_process(aubio_resampler_t *s,
- fvec_t * input, fvec_t * output) {
- uint_t i ;
- s->proc->input_frames = input->length;
- s->proc->output_frames = output->length;
- s->proc->src_ratio = s->ratio;
- for (i = 0 ; i< input->channels; i++)
- {
- /* make SRC_PROC data point to input outputs */
- s->proc->data_in = input->data[i];
- s->proc->data_out= output->data[i];
- /* do resampling */
- src_process (s->stat, s->proc) ;
- }
- return AUBIO_OK;
-}
--- a/src/resample.h
+++ /dev/null
@@ -1,60 +1,0 @@
-/*
- Copyright (C) 2003 Paul Brossier
-
- This program is free software; you can redistribute it and/or modify
- it under the terms of the GNU General Public License as published by
- the Free Software Foundation; either version 2 of the License, or
- (at your option) any later version.
-
- This program is distributed in the hope that it will be useful,
- but WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- GNU General Public License for more details.
-
- You should have received a copy of the GNU General Public License
- along with this program; if not, write to the Free Software
- Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
-
-*/
-
-#ifndef _RESAMPLE_H
-#define _RESAMPLE_H
-
-/** \file
-
- Resampling object
-
- This object resamples an input vector into an output vector using
- libsamplerate. See http://www.mega-nerd.com/SRC/
-
-*/
-
-#ifdef __cplusplus
-extern "C" {
-#endif
-
-/** resampler object */
-typedef struct _aubio_resampler_t aubio_resampler_t;
-/** create resampler object
-
- \param ratio output_sample_rate / input_sample_rate
- \param type libsamplerate resampling type
-
-*/
-aubio_resampler_t * new_aubio_resampler(float ratio, uint_t type);
-/** delete resampler object */
-void del_aubio_resampler(aubio_resampler_t *s);
-/** resample input in output
-
- \param s resampler object
- \param input input buffer of size N
- \param output output buffer of size N*ratio
-
-*/
-uint_t aubio_resampler_process(aubio_resampler_t *s, fvec_t * input, fvec_t * output);
-
-#ifdef __cplusplus
-}
-#endif
-
-#endif /* _RESAMPLE_H */
--- a/src/scale.c
+++ /dev/null
@@ -1,79 +1,0 @@
-/*
- Copyright (C) 2003 Paul Brossier
-
- This program is free software; you can redistribute it and/or modify
- it under the terms of the GNU General Public License as published by
- the Free Software Foundation; either version 2 of the License, or
- (at your option) any later version.
-
- This program is distributed in the hope that it will be useful,
- but WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- GNU General Public License for more details.
-
- You should have received a copy of the GNU General Public License
- along with this program; if not, write to the Free Software
- Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
-
-*/
-
-#include "aubio_priv.h"
-#include "sample.h"
-#include "scale.h"
-
-struct _aubio_scale_t {
- smpl_t ilow;
- smpl_t ihig;
- smpl_t olow;
- smpl_t ohig;
-
- smpl_t scaler;
- smpl_t irange;
-
- /* not implemented yet : type in/out data
- bool inint;
- bool outint;
- */
-};
-
-aubio_scale_t * new_aubio_scale (smpl_t ilow, smpl_t ihig,
- smpl_t olow, smpl_t ohig) {
- aubio_scale_t * s = AUBIO_NEW(aubio_scale_t);
- aubio_scale_set (s, ilow, ihig, olow, ohig);
- return s;
-}
-
-void del_aubio_scale(aubio_scale_t *s) {
- AUBIO_FREE(s);
-}
-
-void aubio_scale_set (aubio_scale_t *s, smpl_t ilow, smpl_t ihig,
- smpl_t olow, smpl_t ohig) {
- smpl_t inputrange = ihig - ilow;
- smpl_t outputrange= ohig - olow;
- s->ilow = ilow;
- s->ihig = ihig;
- s->olow = olow;
- s->ohig = ohig;
- if (inputrange == 0) {
- s->scaler = 0.0f;
- } else {
- s->scaler = outputrange/inputrange;
- if (inputrange < 0) {
- inputrange = inputrange * -1.0f;
- }
- }
-}
-
-void aubio_scale_do (aubio_scale_t *s, fvec_t *input)
-{
- uint_t i, j;
- for (i=0; i < input->channels; i++){
- for (j=0; j < input->length; j++){
- input->data[i][j] -= s->ilow;
- input->data[i][j] *= s->scaler;
- input->data[i][j] += s->olow;
- }
- }
-}
-
--- a/src/scale.h
+++ /dev/null
@@ -1,78 +1,0 @@
-/*
- Copyright (C) 2003 Paul Brossier
-
- This program is free software; you can redistribute it and/or modify
- it under the terms of the GNU General Public License as published by
- the Free Software Foundation; either version 2 of the License, or
- (at your option) any later version.
-
- This program is distributed in the hope that it will be useful,
- but WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- GNU General Public License for more details.
-
- You should have received a copy of the GNU General Public License
- along with this program; if not, write to the Free Software
- Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
-*/
-
-/** \file
-
- Vector scaling function
-
- This object, inspired from the scale object in FTS, the jMax engine, scales
- the values of a vector according to an affine function defined as follow:
-
- \f$ y = (x - ilow)*(ohig-olow)/(ihig-ilow) + olow \f$
-
-*/
-#ifndef SCALE_H
-#define SCALE_H
-
-#ifdef __cplusplus
-extern "C" {
-#endif
-
-/** scale object */
-typedef struct _aubio_scale_t aubio_scale_t;
-
-/** create a scale object
-
- \param flow lower value of output function
- \param fhig higher value of output function
- \param ilow lower value of input function
- \param ihig higher value of output function
-
-*/
-aubio_scale_t * new_aubio_scale(smpl_t flow, smpl_t fhig,
- smpl_t ilow, smpl_t ihig);
-/** delete a scale object
-
- \param s scale object as returned by new_aubio_scale
-
-*/
-void del_aubio_scale(aubio_scale_t *s);
-/** scale input vector
-
- \param s scale object as returned by new_aubio_scale
- \param input vector to scale
-
-*/
-void aubio_scale_do(aubio_scale_t *s, fvec_t * input);
-/** modify scale parameters after object creation
-
- \param s scale object as returned by new_aubio_scale
- \param olow lower value of output function
- \param ohig higher value of output function
- \param ilow lower value of input function
- \param ihig higher value of output function
-
-*/
-void aubio_scale_set (aubio_scale_t *s, smpl_t ilow, smpl_t ihig,
- smpl_t olow, smpl_t ohig);
-
-#ifdef __cplusplus
-}
-#endif
-
-#endif
--- /dev/null
+++ b/src/spectral/fft.c
@@ -1,0 +1,194 @@
+/*
+ Copyright (C) 2003 Paul Brossier
+
+ This program is free software; you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 2 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program; if not, write to the Free Software
+ Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+
+*/
+
+#include "aubio_priv.h"
+#include "fvec.h"
+#include "cvec.h"
+#include "mathutils.h"
+#include "spectral/fft.h"
+
+#if FFTW3F_SUPPORT
+#define fftw_malloc fftwf_malloc
+#define fftw_free fftwf_free
+#define fftw_execute fftwf_execute
+#define fftw_plan_dft_r2c_1d fftwf_plan_dft_r2c_1d
+#define fftw_plan_dft_c2r_1d fftwf_plan_dft_c2r_1d
+#define fftw_plan_r2r_1d fftwf_plan_r2r_1d
+#define fftw_plan fftwf_plan
+#define fftw_destroy_plan fftwf_destroy_plan
+#endif
+
+#if FFTW3F_SUPPORT
+#define real_t smpl_t
+#else
+#define real_t lsmp_t
+#endif
+
+struct _aubio_fft_t {
+ uint_t winsize;
+ uint_t channels;
+ uint_t fft_size;
+ real_t *in, *out;
+ fftw_plan pfw, pbw;
+ fft_data_t * specdata; /* complex spectral data */
+ fvec_t * compspec;
+};
+
+aubio_fft_t * new_aubio_fft(uint_t winsize, uint_t channels) {
+ aubio_fft_t * s = AUBIO_NEW(aubio_fft_t);
+ s->winsize = winsize;
+ s->channels = channels;
+ /* allocate memory */
+ s->in = AUBIO_ARRAY(real_t,winsize);
+ s->out = AUBIO_ARRAY(real_t,winsize);
+ s->compspec = new_fvec(winsize,channels);
+ /* create plans */
+#ifdef HAVE_COMPLEX_H
+ s->fft_size = winsize/2 + 1;
+ s->specdata = (fft_data_t*)fftw_malloc(sizeof(fft_data_t)*s->fft_size);
+ s->pfw = fftw_plan_dft_r2c_1d(winsize, s->in, s->specdata, FFTW_ESTIMATE);
+ s->pbw = fftw_plan_dft_c2r_1d(winsize, s->specdata, s->out, FFTW_ESTIMATE);
+#else
+ s->fft_size = winsize;
+ s->specdata = (fft_data_t*)fftw_malloc(sizeof(fft_data_t)*s->fft_size);
+ s->pfw = fftw_plan_r2r_1d(winsize, s->in, s->specdata, FFTW_R2HC, FFTW_ESTIMATE);
+ s->pbw = fftw_plan_r2r_1d(winsize, s->specdata, s->out, FFTW_HC2R, FFTW_ESTIMATE);
+#endif
+ return s;
+}
+
+void del_aubio_fft(aubio_fft_t * s) {
+ /* destroy data */
+ del_fvec(s->compspec);
+ fftw_destroy_plan(s->pfw);
+ fftw_destroy_plan(s->pbw);
+ fftw_free(s->specdata);
+ AUBIO_FREE(s->out);
+ AUBIO_FREE(s->in );
+ AUBIO_FREE(s);
+}
+
+void aubio_fft_do(aubio_fft_t * s, fvec_t * input, cvec_t * spectrum) {
+ aubio_fft_do_complex(s, input, s->compspec);
+ aubio_fft_get_spectrum(s->compspec, spectrum);
+}
+
+void aubio_fft_rdo(aubio_fft_t * s, cvec_t * spectrum, fvec_t * output) {
+ aubio_fft_get_realimag(spectrum, s->compspec);
+ aubio_fft_rdo_complex(s, s->compspec, output);
+}
+
+void aubio_fft_do_complex(aubio_fft_t * s, fvec_t * input, fvec_t * compspec) {
+ uint_t i, j;
+ for (i = 0; i < s->channels; i++) {
+ for (j=0; j < s->winsize; j++) {
+ s->in[j] = input->data[i][j];
+ }
+ fftw_execute(s->pfw);
+#ifdef HAVE_COMPLEX_H
+ compspec->data[i][0] = REAL(s->specdata[0]);
+ for (j = 1; j < s->fft_size -1 ; j++) {
+ compspec->data[i][j] = REAL(s->specdata[j]);
+ compspec->data[i][compspec->length - j] = IMAG(s->specdata[j]);
+ }
+ compspec->data[i][s->fft_size-1] = REAL(s->specdata[s->fft_size-1]);
+#else
+ for (j = 0; j < s->fft_size; j++) {
+ compspec->data[i][j] = s->specdata[j];
+ }
+#endif
+ }
+}
+
+void aubio_fft_rdo_complex(aubio_fft_t * s, fvec_t * compspec, fvec_t * output) {
+ uint_t i, j;
+ const smpl_t renorm = 1./(smpl_t)s->winsize;
+ for (i = 0; i < compspec->channels; i++) {
+#ifdef HAVE_COMPLEX_H
+ s->specdata[0] = compspec->data[i][0];
+ for (j=1; j < s->fft_size - 1; j++) {
+ s->specdata[j] = compspec->data[i][j] +
+ I * compspec->data[i][compspec->length - j];
+ }
+ s->specdata[s->fft_size - 1] = compspec->data[i][s->fft_size - 1];
+#else
+ for (j=0; j < s->fft_size; j++) {
+ s->specdata[j] = compspec->data[i][j];
+ }
+#endif
+ fftw_execute(s->pbw);
+ for (j = 0; j < output->length; j++) {
+ output->data[i][j] = s->out[j]*renorm;
+ }
+ }
+}
+
+void aubio_fft_get_spectrum(fvec_t * compspec, cvec_t * spectrum) {
+ aubio_fft_get_phas(compspec, spectrum);
+ aubio_fft_get_norm(compspec, spectrum);
+}
+
+void aubio_fft_get_realimag(cvec_t * spectrum, fvec_t * compspec) {
+ aubio_fft_get_imag(spectrum, compspec);
+ aubio_fft_get_real(spectrum, compspec);
+}
+
+void aubio_fft_get_phas(fvec_t * compspec, cvec_t * spectrum) {
+ uint_t i, j;
+ for (i = 0; i < spectrum->channels; i++) {
+ spectrum->phas[i][0] = 0.;
+ for (j=1; j < spectrum->length - 1; j++) {
+ spectrum->phas[i][j] = atan2f(compspec->data[i][compspec->length-j],
+ compspec->data[i][j]);
+ }
+ spectrum->phas[i][spectrum->length-1] = 0.;
+ }
+}
+
+void aubio_fft_get_norm(fvec_t * compspec, cvec_t * spectrum) {
+ uint_t i, j = 0;
+ for (i = 0; i < spectrum->channels; i++) {
+ spectrum->norm[i][0] = compspec->data[i][0];
+ for (j=1; j < spectrum->length - 1; j++) {
+ spectrum->norm[i][j] = SQRT(SQR(compspec->data[i][j])
+ + SQR(compspec->data[i][compspec->length - j]) );
+ }
+ spectrum->norm[i][spectrum->length-1] = compspec->data[i][compspec->length/2];
+ }
+}
+
+void aubio_fft_get_imag(cvec_t * spectrum, fvec_t * compspec) {
+ uint_t i, j;
+ for (i = 0; i < compspec->channels; i++) {
+ for (j = 1; j < compspec->length / 2 + 1; j++) {
+ compspec->data[i][compspec->length - j] =
+ spectrum->norm[i][j]*SIN(spectrum->phas[i][j]);
+ }
+ }
+}
+
+void aubio_fft_get_real(cvec_t * spectrum, fvec_t * compspec) {
+ uint_t i, j;
+ for (i = 0; i < compspec->channels; i++) {
+ for (j = 0; j< compspec->length / 2 + 1; j++) {
+ compspec->data[i][j] =
+ spectrum->norm[i][j]*COS(spectrum->phas[i][j]);
+ }
+ }
+}
--- /dev/null
+++ b/src/spectral/fft.h
@@ -1,0 +1,163 @@
+/*
+ Copyright (C) 2003 Paul Brossier
+
+ This program is free software; you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 2 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program; if not, write to the Free Software
+ Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+
+*/
+
+/** \file
+
+ Fast Fourier Transform object
+
+*/
+
+#ifndef FFT_H_
+#define FFT_H_
+
+/* note that <complex.h> is not included here but only in aubio_priv.h, so that
+ * c++ projects can still use their own complex definition. */
+#include <fftw3.h>
+
+#ifdef HAVE_COMPLEX_H
+#if FFTW3F_SUPPORT
+#define FFTW_TYPE fftwf_complex
+#else
+#define FFTW_TYPE fftw_complex
+#endif
+#else
+#if FFTW3F_SUPPORT
+/** fft data type */
+#define FFTW_TYPE float
+#else
+/** fft data type */
+#define FFTW_TYPE double
+#endif
+#endif
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/** fft data type */
+typedef FFTW_TYPE fft_data_t;
+
+/** FFT object
+
+ This object computes forward and backward FFTs, using the complex type to
+ store the results. The phase vocoder or aubio_mfft_t objects should be
+ preferred to using directly aubio_fft_t. The FFT are computed using FFTW3
+ (although support for another library could be added).
+
+*/
+typedef struct _aubio_fft_t aubio_fft_t;
+
+/** create new FFT computation object
+
+ \param size length of the FFT
+ \param channels number of channels
+
+*/
+aubio_fft_t * new_aubio_fft(uint_t size, uint_t channels);
+/** delete FFT object
+
+ \param s fft object as returned by new_aubio_fft
+
+*/
+void del_aubio_fft(aubio_fft_t * s);
+
+/** compute forward FFT
+
+ \param s fft object as returned by new_aubio_fft
+ \param input input signal
+ \param spectrum output spectrum
+
+*/
+void aubio_fft_do (aubio_fft_t *s, fvec_t * input, cvec_t * spectrum);
+/** compute backward (inverse) FFT
+
+ \param s fft object as returned by new_aubio_fft
+ \param spectrum input spectrum
+ \param output output signal
+
+*/
+void aubio_fft_rdo (aubio_fft_t *s, cvec_t * spectrum, fvec_t * output);
+
+/** compute forward FFT
+
+ \param s fft object as returned by new_aubio_fft
+ \param input real input signal
+ \param compspec complex output fft real/imag
+
+*/
+void aubio_fft_do_complex (aubio_fft_t *s, fvec_t * input, fvec_t * compspec);
+/** compute backward (inverse) FFT from real/imag
+
+ \param s fft object as returned by new_aubio_fft
+ \param compspec real/imag input fft array
+ \param output real output array
+
+*/
+void aubio_fft_rdo_complex (aubio_fft_t *s, fvec_t * compspec, fvec_t * output);
+
+/** convert real/imag spectrum to norm/phas spectrum
+
+ \param compspec real/imag input fft array
+ \param spectrum cvec norm/phas output array
+
+*/
+void aubio_fft_get_spectrum(fvec_t * compspec, cvec_t * spectrum);
+/** convert real/imag spectrum to norm/phas spectrum
+
+ \param compspec real/imag input fft array
+ \param spectrum cvec norm/phas output array
+
+*/
+void aubio_fft_get_realimag(cvec_t * spectrum, fvec_t * compspec);
+
+/** compute phas spectrum from real/imag parts
+
+ \param compspec real/imag input fft array
+ \param spectrum cvec norm/phas output array
+
+*/
+void aubio_fft_get_phas(fvec_t * compspec, cvec_t * spectrum);
+/** compute imaginary part from the norm/phas cvec
+
+ \param spectrum norm/phas input array
+ \param compspec real/imag output fft array
+
+*/
+void aubio_fft_get_imag(cvec_t * spectrum, fvec_t * compspec);
+
+/** compute norm component from real/imag parts
+
+ \param compspec real/imag input fft array
+ \param spectrum cvec norm/phas output array
+
+*/
+void aubio_fft_get_norm(fvec_t * compspec, cvec_t * spectrum);
+/** compute real part from norm/phas components
+
+ \param spectrum norm/phas input array
+ \param compspec real/imag output fft array
+
+*/
+void aubio_fft_get_real(cvec_t * spectrum, fvec_t * compspec);
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif // FFT_H_
--- /dev/null
+++ b/src/spectral/filterbank.c
@@ -1,0 +1,218 @@
+/*
+ Copyright (C) 2007 Amaury Hazan <ahazan@iua.upf.edu>
+ and Paul Brossier <piem@piem.org>
+
+ This program is free software; you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 2 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program; if not, write to the Free Software
+ Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+
+*/
+
+
+#include "aubio_priv.h"
+#include "sample.h"
+#include "spectral/filterbank.h"
+#include "mathutils.h"
+
+#define VERY_SMALL_NUMBER 2e-42
+
+/** \brief A structure to store a set of n_filters filters of lenghts win_s */
+struct aubio_filterbank_t_ {
+ uint_t win_s;
+ uint_t n_filters;
+ fvec_t **filters;
+};
+
+aubio_filterbank_t * new_aubio_filterbank(uint_t n_filters, uint_t win_s){
+ /** allocating space for filterbank object */
+ aubio_filterbank_t * fb = AUBIO_NEW(aubio_filterbank_t);
+ uint_t filter_cnt;
+ fb->win_s=win_s;
+ fb->n_filters=n_filters;
+
+ /** allocating filter tables */
+ fb->filters=AUBIO_ARRAY(fvec_t*,n_filters);
+ for (filter_cnt=0; filter_cnt<n_filters; filter_cnt++)
+ /* considering one-channel filters */
+ fb->filters[filter_cnt]=new_fvec(win_s, 1);
+
+ return fb;
+}
+
+/*
+FB initialization based on Slaney's auditory toolbox
+TODO:
+ *solve memory leak problems while
+ *solve quantization issues when constructing signal:
+ *bug for win_s=512
+ *corrections for win_s=1024 -> why even filters with smaller amplitude
+
+*/
+
+aubio_filterbank_t * new_aubio_filterbank_mfcc(uint_t n_filters, uint_t win_s, uint_t samplerate, smpl_t freq_min, smpl_t freq_max){
+
+ aubio_filterbank_t * fb = new_aubio_filterbank(n_filters, win_s);
+
+
+ //slaney params
+ smpl_t lowestFrequency = 133.3333;
+ smpl_t linearSpacing = 66.66666666;
+ smpl_t logSpacing = 1.0711703;
+
+ uint_t linearFilters = 13;
+ uint_t logFilters = 27;
+ uint_t allFilters = linearFilters + logFilters;
+
+ //buffers for computing filter frequencies
+ fvec_t * freqs=new_fvec(allFilters+2 , 1);
+
+ fvec_t * lower_freqs=new_fvec( allFilters, 1);
+ fvec_t * upper_freqs=new_fvec( allFilters, 1);
+ fvec_t * center_freqs=new_fvec( allFilters, 1);
+
+ fvec_t * triangle_heights=new_fvec( allFilters, 1);
+ //lookup table of each bin frequency in hz
+ fvec_t * fft_freqs=new_fvec(win_s, 1);
+
+ uint_t filter_cnt, bin_cnt;
+
+ //first step: filling all the linear filter frequencies
+ for(filter_cnt=0; filter_cnt<linearFilters; filter_cnt++){
+ freqs->data[0][filter_cnt]=lowestFrequency+ filter_cnt*linearSpacing;
+ }
+ smpl_t lastlinearCF=freqs->data[0][filter_cnt-1];
+
+ //second step: filling all the log filter frequencies
+ for(filter_cnt=0; filter_cnt<logFilters+2; filter_cnt++){
+ freqs->data[0][filter_cnt+linearFilters] =
+ lastlinearCF*(pow(logSpacing,filter_cnt+1));
+ }
+
+ //Option 1. copying interesting values to lower_freqs, center_freqs and upper freqs arrays
+ //TODO: would be nicer to have a reference to freqs->data, anyway we do not care in this init step
+
+ for(filter_cnt=0; filter_cnt<allFilters; filter_cnt++){
+ lower_freqs->data[0][filter_cnt]=freqs->data[0][filter_cnt];
+ center_freqs->data[0][filter_cnt]=freqs->data[0][filter_cnt+1];
+ upper_freqs->data[0][filter_cnt]=freqs->data[0][filter_cnt+2];
+ }
+
+ //computing triangle heights so that each triangle has unit area
+ for(filter_cnt=0; filter_cnt<allFilters; filter_cnt++){
+ triangle_heights->data[0][filter_cnt] = 2./(upper_freqs->data[0][filter_cnt]
+ - lower_freqs->data[0][filter_cnt]);
+ }
+
+ //AUBIO_DBG("filter tables frequencies\n");
+ //for(filter_cnt=0; filter_cnt<allFilters; filter_cnt++)
+ // AUBIO_DBG("filter n. %d %f %f %f %f\n",
+ // filter_cnt, lower_freqs->data[0][filter_cnt],
+ // center_freqs->data[0][filter_cnt], upper_freqs->data[0][filter_cnt],
+ // triangle_heights->data[0][filter_cnt]);
+
+ //filling the fft_freqs lookup table, which assigns the frequency in hz to each bin
+ for(bin_cnt=0; bin_cnt<win_s; bin_cnt++){
+ fft_freqs->data[0][bin_cnt]= aubio_bintofreq(bin_cnt, samplerate, win_s);
+ }
+
+ //building each filter table
+ for(filter_cnt=0; filter_cnt<allFilters; filter_cnt++){
+
+ //TODO:check special case : lower freq =0
+ //calculating rise increment in mag/Hz
+ smpl_t riseInc= triangle_heights->data[0][filter_cnt]/(center_freqs->data[0][filter_cnt]-lower_freqs->data[0][filter_cnt]);
+
+ //zeroing begining of filter
+ for(bin_cnt=0; bin_cnt<win_s-1; bin_cnt++){
+ fb->filters[filter_cnt]->data[0][bin_cnt]=0.f;
+ if( fft_freqs->data[0][bin_cnt] <= lower_freqs->data[0][filter_cnt] &&
+ fft_freqs->data[0][bin_cnt+1] > lower_freqs->data[0][filter_cnt]) {
+ break;
+ }
+ }
+ bin_cnt++;
+
+ //positive slope
+ for(; bin_cnt<win_s-1; bin_cnt++){
+ fb->filters[filter_cnt]->data[0][bin_cnt]=(fft_freqs->data[0][bin_cnt]-lower_freqs->data[0][filter_cnt])*riseInc;
+ //if(fft_freqs->data[0][bin_cnt]<= center_freqs->data[0][filter_cnt] && fft_freqs->data[0][bin_cnt+1]> center_freqs->data[0][filter_cnt])
+ if(fft_freqs->data[0][bin_cnt+1]> center_freqs->data[0][filter_cnt])
+ break;
+ }
+ //bin_cnt++;
+
+ //negative slope
+ for(; bin_cnt<win_s-1; bin_cnt++){
+
+ //checking whether last value is less than 0...
+ smpl_t val=triangle_heights->data[0][filter_cnt]-(fft_freqs->data[0][bin_cnt]-center_freqs->data[0][filter_cnt])*riseInc;
+ if(val>=0)
+ fb->filters[filter_cnt]->data[0][bin_cnt]=val;
+ else fb->filters[filter_cnt]->data[0][bin_cnt]=0.f;
+
+ //if(fft_freqs->data[0][bin_cnt]<= upper_freqs->data[0][bin_cnt] && fft_freqs->data[0][bin_cnt+1]> upper_freqs->data[0][filter_cnt])
+ //TODO: CHECK whether bugfix correct
+ if(fft_freqs->data[0][bin_cnt+1]> upper_freqs->data[0][filter_cnt])
+ break;
+ }
+ //bin_cnt++;
+
+ //zeroing tail
+ for(; bin_cnt<win_s; bin_cnt++)
+ fb->filters[filter_cnt]->data[0][bin_cnt]=0.f;
+
+ }
+
+
+ del_fvec(freqs);
+ del_fvec(lower_freqs);
+ del_fvec(upper_freqs);
+ del_fvec(center_freqs);
+
+ del_fvec(triangle_heights);
+ del_fvec(fft_freqs);
+
+ return fb;
+
+}
+
+void del_aubio_filterbank(aubio_filterbank_t * fb){
+ uint_t filter_cnt;
+ /** deleting filter tables first */
+ for (filter_cnt=0; filter_cnt<fb->n_filters; filter_cnt++)
+ del_fvec(fb->filters[filter_cnt]);
+ AUBIO_FREE(fb->filters);
+ AUBIO_FREE(fb);
+}
+
+void aubio_filterbank_do(aubio_filterbank_t * f, cvec_t * in, fvec_t *out) {
+ uint_t n, filter_cnt;
+ for(filter_cnt = 0; (filter_cnt < f->n_filters)
+ && (filter_cnt < out->length); filter_cnt++){
+ out->data[0][filter_cnt] = 0.f;
+ for(n = 0; n < in->length; n++){
+ out->data[0][filter_cnt] += in->norm[0][n]
+ * f->filters[filter_cnt]->data[0][n];
+ }
+ out->data[0][filter_cnt] =
+ LOG(out->data[0][filter_cnt] < VERY_SMALL_NUMBER ?
+ VERY_SMALL_NUMBER : out->data[0][filter_cnt]);
+ }
+
+ return;
+}
+
+fvec_t * aubio_filterbank_getchannel(aubio_filterbank_t * f, uint_t channel) {
+ if ( (channel < f->n_filters) ) { return f->filters[channel]; }
+ else { return NULL; }
+}
--- /dev/null
+++ b/src/spectral/filterbank.h
@@ -1,0 +1,80 @@
+/*
+ Copyright (C) 2007 Amaury Hazan <ahazan@iua.upf.edu>
+ and Paul Brossier <piem@piem.org>
+
+ This program is free software; you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 2 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program; if not, write to the Free Software
+ Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+*/
+
+/** \file
+
+ Filterbank object
+
+ General-purpose spectral filterbank object. Comes with mel-filter initialization function.
+
+*/
+
+#ifndef FILTERBANK_H
+#define FILTERBANK_H
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/** filterbank object */
+typedef struct aubio_filterbank_t_ aubio_filterbank_t;
+
+/** create filterbank object
+
+ \param win_s size of analysis buffer (and length the FFT transform)
+ \param n_filters number of filters to create
+
+*/
+
+aubio_filterbank_t * new_aubio_filterbank(uint_t n_filters, uint_t win_s);
+
+/** filterbank initialization for mel filters
+
+
+ \param n_filters number of filters
+ \param win_s window size
+ \param samplerate
+ \param freq_min lowest filter frequency
+ \param freq_max highest filter frequency
+
+*/
+aubio_filterbank_t * new_aubio_filterbank_mfcc(uint_t n_filters, uint_t win_s, uint_t samplerate, smpl_t freq_min, smpl_t freq_max);
+
+/** destroy filterbank object
+
+ \param fb filterbank, as returned by new_aubio_filterbank method
+
+*/
+void del_aubio_filterbank(aubio_filterbank_t * fb);
+
+/** compute filterbank
+
+*/
+void aubio_filterbank_do(aubio_filterbank_t * fb, cvec_t * in, fvec_t *out);
+
+/** return the vector containing the filter coefficients of one channel
+
+ */
+fvec_t * aubio_filterbank_getchannel(aubio_filterbank_t * f, uint_t channel);
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif // FILTERBANK_H
--- /dev/null
+++ b/src/spectral/mfcc.c
@@ -1,0 +1,123 @@
+/*
+ Copyright (C) 2006 Amaury Hazan
+ Ported to aubio from LibXtract
+ http://libxtract.sourceforge.net/
+
+
+ This program is free software; you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 2 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program; if not, write to the Free Software
+ Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+
+*/
+
+#include "aubio_priv.h"
+#include "sample.h"
+#include "spectral/fft.h"
+#include "spectral/filterbank.h"
+#include "spectral/mfcc.h"
+
+/** Internal structure for mfcc object **/
+
+struct aubio_mfcc_t_{
+ uint_t win_s; /** grain length */
+ uint_t samplerate; /** sample rate (needed?) */
+ uint_t channels; /** number of channels */
+ uint_t n_filters; /** number of *filters */
+ uint_t n_coefs; /** number of coefficients (<= n_filters/2 +1) */
+ smpl_t lowfreq; /** lowest frequency for filters */
+ smpl_t highfreq; /** highest frequency for filters */
+ aubio_filterbank_t * fb; /** filter bank */
+ fvec_t * in_dct; /** input buffer for dct * [fb->n_filters] */
+ aubio_fft_t * fft_dct; /** fft object for dct */
+ cvec_t * fftgrain_dct; /** output buffer for dct */
+};
+
+
+aubio_mfcc_t * new_aubio_mfcc (uint_t win_s, uint_t samplerate, uint_t n_filters, uint_t n_coefs, smpl_t lowfreq, smpl_t highfreq, uint_t channels){
+ /** allocating space for mfcc object */
+ aubio_mfcc_t * mfcc = AUBIO_NEW(aubio_mfcc_t);
+
+ //we need (n_coefs-1)*2 filters to obtain n_coefs coefficients after dct
+ //uint_t n_filters = (n_coefs-1)*2;
+
+ mfcc->win_s=win_s;
+ mfcc->samplerate=samplerate;
+ mfcc->channels=channels;
+ mfcc->n_filters=n_filters;
+ mfcc->n_coefs=n_coefs;
+ mfcc->lowfreq=lowfreq;
+ mfcc->highfreq=highfreq;
+
+
+ /** filterbank allocation */
+ mfcc->fb = new_aubio_filterbank_mfcc(n_filters, mfcc->win_s, samplerate, lowfreq, highfreq);
+
+ /** allocating space for fft object (used for dct) */
+ mfcc->fft_dct=new_aubio_fft(n_filters, 1);
+
+ /** allocating buffers */
+ mfcc->in_dct=new_fvec(mfcc->win_s, 1);
+
+ mfcc->fftgrain_dct=new_cvec(n_filters, 1);
+
+ return mfcc;
+};
+
+void del_aubio_mfcc(aubio_mfcc_t *mf){
+ /** deleting filterbank */
+ del_aubio_filterbank(mf->fb);
+ /** deleting fft object */
+ del_aubio_fft(mf->fft_dct);
+ /** deleting buffers */
+ del_fvec(mf->in_dct);
+ del_cvec(mf->fftgrain_dct);
+
+ /** deleting mfcc object */
+ AUBIO_FREE(mf);
+}
+
+
+/** intermediate dct involved in aubio_mfcc_do
+
+ \param mf mfcc object as returned by new_aubio_mfcc
+ \param in input spectrum (n_filters long)
+ \param out output mel coefficients buffer (n_filters/2 +1 long)
+
+*/
+void aubio_dct_do(aubio_mfcc_t * mf, fvec_t *in, fvec_t *out);
+
+void aubio_mfcc_do(aubio_mfcc_t * mf, cvec_t *in, fvec_t *out){
+ // compute filterbank
+ aubio_filterbank_do(mf->fb, in, mf->in_dct);
+ //TODO: check that zero padding
+ // the following line seems useless since the in_dct buffer has the correct size
+ //for(n = filter + 1; n < N; n++) result[n] = 0;
+
+ aubio_dct_do(mf, mf->in_dct, out);
+
+ return;
+}
+
+void aubio_dct_do(aubio_mfcc_t * mf, fvec_t *in, fvec_t *out){
+ uint_t i;
+ //compute mag spectrum
+ aubio_fft_do (mf->fft_dct, in, mf->fftgrain_dct);
+ //extract real part of fft grain
+ for(i=0; i<mf->n_coefs ;i++){
+ //for(i=0; i<out->length;i++){
+ out->data[0][i]= mf->fftgrain_dct->norm[0][i]
+ *COS(mf->fftgrain_dct->phas[0][i]);
+ }
+ return;
+}
+
--- /dev/null
+++ b/src/spectral/mfcc.h
@@ -1,0 +1,64 @@
+/*
+ Copyright (C) 2007 Amaury Hazan <ahazan@iua.upf.edu>
+ and Paul Brossier <piem@piem.org>
+
+ This program is free software; you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 2 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program; if not, write to the Free Software
+ Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+
+*/
+
+/* part of this mfcc implementation were inspired from LibXtract
+ http://libxtract.sourceforge.net/
+*/
+
+#ifndef MFCC_H
+#define MFCC_H
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+typedef struct aubio_mfcc_t_ aubio_mfcc_t;
+
+/** create mfcc object
+
+ \param win_s size of analysis buffer (and length the FFT transform)
+ \param samplerate
+ \param n_coefs: number of desired coefs
+ \param lowfreq: lowest frequency to use in filterbank
+ \param highfreq highest frequency to use in filterbank
+ \param channels number of channels
+
+*/
+aubio_mfcc_t * new_aubio_mfcc (uint_t win_s, uint_t samplerate, uint_t n_filters, uint_t n_coefs, smpl_t lowfreq, smpl_t highfreq, uint_t channels);
+/** delete mfcc object
+
+ \param mf mfcc object as returned by new_aubio_mfcc
+
+*/
+void del_aubio_mfcc(aubio_mfcc_t *mf);
+/** mfcc object processing
+
+ \param mf mfcc object as returned by new_aubio_mfcc
+ \param in input spectrum (win_s long)
+ \param out output mel coefficients buffer (n_filters/2 +1 long)
+
+*/
+void aubio_mfcc_do(aubio_mfcc_t * mf, cvec_t *in, fvec_t *out);
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif // MFCC_H
--- /dev/null
+++ b/src/spectral/phasevoc.c
@@ -1,0 +1,150 @@
+/*
+ Copyright (C) 2003 Paul Brossier
+
+ This program is free software; you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 2 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program; if not, write to the Free Software
+ Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+
+*/
+
+#include "aubio_priv.h"
+#include "fvec.h"
+#include "cvec.h"
+#include "mathutils.h"
+#include "spectral/fft.h"
+#include "spectral/phasevoc.h"
+
+/** phasevocoder internal object */
+struct _aubio_pvoc_t {
+ uint_t win_s; /** grain length */
+ uint_t hop_s; /** overlap step */
+ uint_t channels; /** number of channels */
+ aubio_fft_t * fft; /** fft object */
+ fvec_t * synth; /** cur output grain [win_s] */
+ fvec_t * synthold; /** last input frame [win_s-hop_s] */
+ fvec_t * data; /** current input grain [win_s] */
+ fvec_t * dataold; /** last input frame [win_s-hop_s] */
+ smpl_t * w; /** grain window [win_s] */
+};
+
+
+/** returns data and dataold slided by hop_s */
+static void aubio_pvoc_swapbuffers(smpl_t * data, smpl_t * dataold, const
+ smpl_t * datanew, uint_t win_s, uint_t hop_s);
+
+/** do additive synthesis from 'old' and 'cur' */
+static void aubio_pvoc_addsynth(const smpl_t * synth, smpl_t * synthold,
+ smpl_t * synthnew, uint_t win_s, uint_t hop_s);
+
+void aubio_pvoc_do(aubio_pvoc_t *pv, fvec_t * datanew, cvec_t *fftgrain) {
+ uint_t i,j;
+ for (i=0; i<pv->channels; i++) {
+ /* slide */
+ aubio_pvoc_swapbuffers(pv->data->data[i],pv->dataold->data[i],
+ datanew->data[i],pv->win_s,pv->hop_s);
+ /* windowing */
+ for (j=0; j<pv->win_s; j++) pv->data->data[i][j] *= pv->w[j];
+ }
+ /* shift */
+ vec_shift(pv->data);
+ /* calculate fft */
+ aubio_fft_do (pv->fft,pv->data,fftgrain);
+}
+
+void aubio_pvoc_rdo(aubio_pvoc_t *pv,cvec_t * fftgrain, fvec_t * synthnew) {
+ uint_t i;
+ /* calculate rfft */
+ aubio_fft_rdo(pv->fft,fftgrain,pv->synth);
+ /* unshift */
+ vec_shift(pv->synth);
+ for (i=0; i<pv->channels; i++) {
+ aubio_pvoc_addsynth(pv->synth->data[i],pv->synthold->data[i],
+ synthnew->data[i],pv->win_s,pv->hop_s);
+ }
+}
+
+aubio_pvoc_t * new_aubio_pvoc (uint_t win_s, uint_t hop_s, uint_t channels) {
+ aubio_pvoc_t * pv = AUBIO_NEW(aubio_pvoc_t);
+
+ if (win_s < 2*hop_s) {
+ AUBIO_ERR("Hop size bigger than half the window size!\n");
+ AUBIO_ERR("Resetting hop size to half the window size.\n");
+ hop_s = win_s / 2;
+ }
+
+ if (hop_s < 1) {
+ AUBIO_ERR("Hop size is smaller than 1!\n");
+ AUBIO_ERR("Resetting hop size to half the window size.\n");
+ hop_s = win_s / 2;
+ }
+
+ pv->fft = new_aubio_fft(win_s,channels);
+
+ /* remember old */
+ pv->data = new_fvec (win_s, channels);
+ pv->synth = new_fvec (win_s, channels);
+
+ /* new input output */
+ pv->dataold = new_fvec (win_s-hop_s, channels);
+ pv->synthold = new_fvec (win_s-hop_s, channels);
+ pv->w = AUBIO_ARRAY(smpl_t,win_s);
+ aubio_window(pv->w,win_s,aubio_win_hanningz);
+
+ pv->channels = channels;
+ pv->hop_s = hop_s;
+ pv->win_s = win_s;
+
+ return pv;
+}
+
+void del_aubio_pvoc(aubio_pvoc_t *pv) {
+ del_fvec(pv->data);
+ del_fvec(pv->synth);
+ del_fvec(pv->dataold);
+ del_fvec(pv->synthold);
+ del_aubio_fft(pv->fft);
+ AUBIO_FREE(pv->w);
+ AUBIO_FREE(pv);
+}
+
+static void aubio_pvoc_swapbuffers(smpl_t * data, smpl_t * dataold,
+ const smpl_t * datanew, uint_t win_s, uint_t hop_s)
+{
+ uint_t i;
+ for (i=0;i<win_s-hop_s;i++)
+ data[i] = dataold[i];
+ for (i=0;i<hop_s;i++)
+ data[win_s-hop_s+i] = datanew[i];
+ for (i=0;i<win_s-hop_s;i++)
+ dataold[i] = data[i+hop_s];
+}
+
+static void aubio_pvoc_addsynth(const smpl_t * synth, smpl_t * synthold,
+ smpl_t * synthnew, uint_t win_s, uint_t hop_s)
+{
+ uint_t i;
+ smpl_t scale = 2*hop_s/(win_s+.0);
+ /* add new synth to old one and put result in synthnew */
+ for (i=0;i<hop_s;i++)
+ synthnew[i] = synthold[i]+synth[i]*scale;
+ /* shift synthold */
+ for (i=0;i<win_s-2*hop_s;i++)
+ synthold[i] = synthold[i+hop_s];
+ /* erase last frame in synthold */
+ for (i=win_s-hop_s;i<win_s;i++)
+ synthold[i-hop_s]=0.;
+ /* additive synth */
+ for (i=0;i<win_s-hop_s;i++)
+ synthold[i] += synth[i+hop_s]*scale;
+}
+
--- /dev/null
+++ b/src/spectral/phasevoc.h
@@ -1,0 +1,106 @@
+/*
+ Copyright (C) 2003 Paul Brossier
+
+ This program is free software; you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 2 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program; if not, write to the Free Software
+ Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+
+*/
+
+/** \file
+
+ Phase vocoder object
+
+ This object implements a phase vocoder. The spectral frames are computed
+ using a HanningZ window and a swapped version of the signal to simplify the
+ phase relationships across frames. The window sizes and overlap are specified
+ at creation time. Multiple channels are fully supported.
+
+*/
+
+#ifndef _PHASEVOC_H
+#define _PHASEVOC_H
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/** phasevocoder object */
+typedef struct _aubio_pvoc_t aubio_pvoc_t;
+
+/** create phase vocoder object
+
+ \param win_s size of analysis buffer (and length the FFT transform)
+ \param hop_s step size between two consecutive analysis
+ \param channels number of channels
+
+*/
+aubio_pvoc_t * new_aubio_pvoc (uint_t win_s, uint_t hop_s, uint_t channels);
+/** delete phase vocoder object
+
+ \param pv phase vocoder object as returned by new_aubio_pvoc
+
+*/
+void del_aubio_pvoc(aubio_pvoc_t *pv);
+
+/** compute spectral frame
+
+ This function accepts an input vector of size [channels]x[hop_s]. The
+ analysis buffer is rotated and filled with the new data. After windowing of
+ this signal window, the Fourier transform is computed and returned in
+ fftgrain as two vectors, magnitude and phase.
+
+ \param pv phase vocoder object as returned by new_aubio_pvoc
+ \param in new input signal (hop_s long)
+ \param fftgrain output spectral frame
+
+*/
+void aubio_pvoc_do(aubio_pvoc_t *pv, fvec_t *in, cvec_t * fftgrain);
+/** compute signal from spectral frame
+
+ This function takes an input spectral frame fftgrain of size
+ [channels]x[buf_s] and computes its inverse Fourier transform. Overlap-add
+ synthesis is then computed using the previously synthetised frames, and the
+ output stored in out.
+
+ \param pv phase vocoder object as returned by new_aubio_pvoc
+ \param fftgrain input spectral frame
+ \param out output signal (hop_s long)
+
+*/
+void aubio_pvoc_rdo(aubio_pvoc_t *pv, cvec_t * fftgrain, fvec_t *out);
+
+/** get window size
+
+ \param pv phase vocoder to get the window size from
+
+*/
+uint_t aubio_pvoc_get_win(aubio_pvoc_t* pv);
+/** get hop size
+
+ \param pv phase vocoder to get the hop size from
+
+*/
+uint_t aubio_pvoc_get_hop(aubio_pvoc_t* pv);
+/** get channel number
+
+ \param pv phase vocoder to get the number of channels from
+
+*/
+uint_t aubio_pvoc_get_channels(aubio_pvoc_t* pv);
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif
--- /dev/null
+++ b/src/spectral/tss.c
@@ -1,0 +1,127 @@
+/*
+ Copyright (C) 2003 Paul Brossier
+
+ This program is free software; you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 2 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program; if not, write to the Free Software
+ Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+
+*/
+
+/* default values : alfa=4, beta=3, threshold=0.25 */
+
+#include "aubio_priv.h"
+#include "sample.h"
+#include "mathutils.h"
+#include "spectral/tss.h"
+
+struct _aubio_tss_t
+{
+ smpl_t thrs;
+ smpl_t alfa;
+ smpl_t beta;
+ smpl_t parm;
+ smpl_t thrsfact;
+ fvec_t *theta1;
+ fvec_t *theta2;
+ fvec_t *oft1;
+ fvec_t *oft2;
+ fvec_t *dev;
+};
+
+void aubio_tss_do(aubio_tss_t *o, cvec_t * input,
+ cvec_t * trans, cvec_t * stead)
+{
+ uint_t i,j;
+ uint_t test;
+ uint_t nbins = input->length;
+ uint_t channels = input->channels;
+ smpl_t alfa = o->alfa;
+ smpl_t beta = o->beta;
+ smpl_t parm = o->parm;
+ smpl_t ** dev = (smpl_t **)o->dev->data;
+ smpl_t ** oft1 = (smpl_t **)o->oft1->data;
+ smpl_t ** oft2 = (smpl_t **)o->oft2->data;
+ smpl_t ** theta1 = (smpl_t **)o->theta1->data;
+ smpl_t ** theta2 = (smpl_t **)o->theta2->data;
+ /* second phase derivative */
+ for (i=0;i<channels; i++){
+ for (j=0;j<nbins; j++){
+ dev[i][j] = aubio_unwrap2pi(input->phas[i][j]
+ -2.0*theta1[i][j]+theta2[i][j]);
+ theta2[i][j] = theta1[i][j];
+ theta1[i][j] = input->phas[i][j];
+ }
+
+ for (j=0;j<nbins; j++){
+ /* transient analysis */
+ test = (ABS(dev[i][j]) > parm*oft1[i][j]);
+ trans->norm[i][j] = input->norm[i][j] * test;
+ trans->phas[i][j] = input->phas[i][j] * test;
+ }
+
+ for (j=0;j<nbins; j++){
+ /* steady state analysis */
+ test = (ABS(dev[i][j]) < parm*oft2[i][j]);
+ stead->norm[i][j] = input->norm[i][j] * test;
+ stead->phas[i][j] = input->phas[i][j] * test;
+
+ /*increase sstate probability for sines */
+ test = (trans->norm[i][j]==0.);
+ oft1[i][j] = test;
+ test = (stead->norm[i][j]==0.);
+ oft2[i][j] = test;
+ test = (trans->norm[i][j]>0.);
+ oft1[i][j] += alfa*test;
+ test = (stead->norm[i][j]>0.);
+ oft2[i][j] += alfa*test;
+ test = (oft1[i][j]>1. && trans->norm[i][j]>0.);
+ oft1[i][j] += beta*test;
+ test = (oft2[i][j]>1. && stead->norm[i][j]>0.);
+ oft2[i][j] += beta*test;
+ }
+ }
+}
+
+void aubio_tss_set_thres(aubio_tss_t *o, smpl_t thrs){
+ o->thrs = thrs;
+ o->parm = thrs*o->thrsfact;
+}
+
+aubio_tss_t * new_aubio_tss(smpl_t thrs, smpl_t alfa, smpl_t beta,
+ uint_t size, uint_t overlap,uint_t channels)
+{
+ aubio_tss_t * o = AUBIO_NEW(aubio_tss_t);
+ uint_t rsize = size/2+1;
+ o->thrs = thrs;
+ o->thrsfact = TWO_PI*overlap/rsize;
+ o->alfa = alfa;
+ o->beta = beta;
+ o->parm = thrs*o->thrsfact;
+ o->theta1 = new_fvec(rsize,channels);
+ o->theta2 = new_fvec(rsize,channels);
+ o->oft1 = new_fvec(rsize,channels);
+ o->oft2 = new_fvec(rsize,channels);
+ o->dev = new_fvec(rsize,channels);
+ return o;
+}
+
+void del_aubio_tss(aubio_tss_t *s)
+{
+ free(s->theta1);
+ free(s->theta2);
+ free(s->oft1);
+ free(s->oft2);
+ free(s->dev);
+ free(s);
+}
+
--- /dev/null
+++ b/src/spectral/tss.h
@@ -1,0 +1,84 @@
+/*
+ Copyright (C) 2003 Paul Brossier
+
+ This program is free software; you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 2 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program; if not, write to the Free Software
+ Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+
+*/
+
+/** \file
+
+ Transient / Steady-state Separation (TSS)
+
+ This file implement a Transient / Steady-state Separation (TSS) as described
+ in:
+
+ Christopher Duxbury, Mike E. Davies, and Mark B. Sandler. Separation of
+ transient information in musical audio using multiresolution analysis
+ techniques. In Proceedings of the Digital Audio Effects Conference, DAFx-01,
+ pages 15, Limerick, Ireland, 2001.
+
+*/
+
+#ifndef TSS_H
+#define TSS_H
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/** TSS object */
+typedef struct _aubio_tss_t aubio_tss_t;
+
+/** create tss object
+
+ \param thrs separation threshold
+ \param alfa alfa parameter
+ \param beta beta parameter
+ \param size buffer size
+ \param overlap step size
+ \param channels number of input channels
+
+*/
+aubio_tss_t * new_aubio_tss(smpl_t thrs, smpl_t alfa, smpl_t beta,
+ uint_t size, uint_t overlap,uint_t channels);
+/** delete tss object
+
+ \param s tss object as returned by new_aubio_tss
+
+*/
+void del_aubio_tss(aubio_tss_t *s);
+
+/** set transient / steady state separation threshold
+
+ \param tss tss object as returned by new_aubio_tss
+ \param thrs new threshold value
+
+*/
+void aubio_tss_set_thres(aubio_tss_t *tss, smpl_t thrs);
+/** split input into transient and steady states components
+
+ \param s tss object as returned by new_aubio_tss
+ \param input input spectral frame
+ \param trans output transient components
+ \param stead output steady state components
+
+*/
+void aubio_tss_do(aubio_tss_t *s, cvec_t * input, cvec_t * trans, cvec_t * stead);
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /*TSS_H*/
--- a/src/tempo/beattracking.c
+++ b/src/tempo/beattracking.c
@@ -20,7 +20,7 @@
#include "aubio_priv.h"
#include "sample.h"
#include "mathutils.h"
-#include "beattracking.h"
+#include "tempo/beattracking.h"
uint_t fvec_gettimesig(smpl_t * acf, uint_t acflen, uint_t gp);
void aubio_beattracking_checkstate(aubio_beattracking_t * bt);
--- a/src/tempo/tempo.c
+++ b/src/tempo/tempo.c
@@ -21,10 +21,10 @@
#include "sample.h"
#include "onset/onsetdetection.h"
#include "tempo/beattracking.h"
-#include "phasevoc.h"
+#include "spectral/phasevoc.h"
#include "onset/peakpick.h"
#include "mathutils.h"
-#include "tempo.h"
+#include "tempo/tempo.h"
/* structure to store object state */
struct _aubio_tempo_t {
--- /dev/null
+++ b/src/temporal/biquad.c
@@ -1,0 +1,114 @@
+/*
+ Copyright (C) 2003 Paul Brossier
+
+ This program is free software; you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 2 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program; if not, write to the Free Software
+ Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+
+*/
+
+#include "aubio_priv.h"
+#include "sample.h"
+#include "mathutils.h"
+#include "temporal/biquad.h"
+
+/** \note this file needs to be in double or more less precision would lead to large
+ * errors in the output
+ */
+
+struct _aubio_biquad_t {
+ lsmp_t a2;
+ lsmp_t a3;
+ lsmp_t b1;
+ lsmp_t b2;
+ lsmp_t b3;
+ lsmp_t o1;
+ lsmp_t o2;
+ lsmp_t i1;
+ lsmp_t i2;
+};
+
+void aubio_biquad_do(aubio_biquad_t * b, fvec_t * in) {
+ uint_t i,j;
+ lsmp_t i1 = b->i1;
+ lsmp_t i2 = b->i2;
+ lsmp_t o1 = b->o1;
+ lsmp_t o2 = b->o2;
+ lsmp_t a2 = b->a2;
+ lsmp_t a3 = b->a3;
+ lsmp_t b1 = b->b1;
+ lsmp_t b2 = b->b2;
+ lsmp_t b3 = b->b3;
+
+ i=0; // works in mono only !!!
+ //for (i=0;i<in->channels;i++) {
+ for (j = 0; j < in->length; j++) {
+ lsmp_t i0 = in->data[i][j];
+ lsmp_t o0 = b1 * i0 + b2 * i1 + b3 * i2
+ - a2 * o1 - a3 * o2;// + 1e-37;
+ in->data[i][j] = o0;
+ i2 = i1;
+ i1 = i0;
+ o2 = o1;
+ o1 = o0;
+ }
+ b->i2 = i2;
+ b->i1 = i1;
+ b->o2 = o2;
+ b->o1 = o1;
+ //}
+}
+
+void aubio_biquad_do_filtfilt(aubio_biquad_t * b, fvec_t * in, fvec_t * tmp) {
+ uint_t j,i=0;
+ uint_t length = in->length;
+ lsmp_t mir;
+ /* mirroring */
+ mir = 2*in->data[i][0];
+ b->i1 = mir - in->data[i][2];
+ b->i2 = mir - in->data[i][1];
+ /* apply filtering */
+ aubio_biquad_do(b,in);
+ /* invert */
+ for (j = 0; j < length; j++)
+ tmp->data[i][length-j-1] = in->data[i][j];
+ /* mirror again */
+ mir = 2*tmp->data[i][0];
+ b->i1 = mir - tmp->data[i][2];
+ b->i2 = mir - tmp->data[i][1];
+ /* apply filtering */
+ aubio_biquad_do(b,tmp);
+ /* invert back */
+ for (j = 0; j < length; j++)
+ in->data[i][j] = tmp->data[i][length-j-1];
+}
+
+aubio_biquad_t * new_aubio_biquad(
+ lsmp_t b1, lsmp_t b2, lsmp_t b3,
+ lsmp_t a2, lsmp_t a3) {
+ aubio_biquad_t * b = AUBIO_NEW(aubio_biquad_t);
+ b->a2 = a2;
+ b->a3 = a3;
+ b->b1 = b1;
+ b->b2 = b2;
+ b->b3 = b3;
+ b->i1 = 0.;
+ b->i2 = 0.;
+ b->o1 = 0.;
+ b->o2 = 0.;
+ return b;
+}
+
+void del_aubio_biquad(aubio_biquad_t * b) {
+ AUBIO_FREE(b);
+}
--- /dev/null
+++ b/src/temporal/biquad.h
@@ -1,0 +1,80 @@
+/*
+ Copyright (C) 2003 Paul Brossier
+
+ This program is free software; you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 2 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program; if not, write to the Free Software
+ Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+
+*/
+
+#ifndef BIQUAD_H
+#define BIQUAD_H
+
+/** \file
+
+ Second order Infinite Impulse Response filter
+
+ This file implements a normalised biquad filter (second order IIR):
+
+ \f$ y[n] = b_1 x[n] + b_2 x[n-1] + b_3 x[n-2] - a_2 y[n-1] - a_3 y[n-2] \f$
+
+ The filtfilt version runs the filter twice, forward and backward, to
+ compensate the phase shifting of the forward operation.
+
+*/
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/** biquad filter object */
+typedef struct _aubio_biquad_t aubio_biquad_t;
+
+/** filter input vector
+
+ \param b biquad object as returned by new_aubio_biquad
+ \param in input vector to filter
+
+*/
+void aubio_biquad_do(aubio_biquad_t * b, fvec_t * in);
+/** filter input vector forward and backward
+
+ \param b biquad object as returned by new_aubio_biquad
+ \param in input vector to filter
+ \param tmp memory space to use for computation
+
+*/
+void aubio_biquad_do_filtfilt(aubio_biquad_t * b, fvec_t * in, fvec_t * tmp);
+/** create new biquad filter
+
+ \param b1 forward filter coefficient
+ \param b2 forward filter coefficient
+ \param b3 forward filter coefficient
+ \param a2 feedback filter coefficient
+ \param a3 feedback filter coefficient
+
+*/
+aubio_biquad_t * new_aubio_biquad(lsmp_t b1, lsmp_t b2, lsmp_t b3, lsmp_t a2, lsmp_t a3);
+
+/** delete biquad filter
+
+ \param b biquad object to delete
+
+*/
+void del_aubio_biquad(aubio_biquad_t * b);
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /*BIQUAD_H*/
--- /dev/null
+++ b/src/temporal/filter.c
@@ -1,0 +1,225 @@
+/*
+ Copyright (C) 2003 Paul Brossier
+
+ This program is free software; you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 2 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program; if not, write to the Free Software
+ Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+
+*/
+
+
+/* Requires lsmp_t to be long or double. float will NOT give reliable
+ * results */
+
+#include "aubio_priv.h"
+#include "sample.h"
+#include "mathutils.h"
+#include "temporal/filter.h"
+
+struct _aubio_filter_t {
+ uint_t order;
+ lsmp_t * a;
+ lsmp_t * b;
+ lsmp_t * y;
+ lsmp_t * x;
+};
+
+/* bug: mono only */
+void aubio_filter_do(aubio_filter_t * f, fvec_t * in) {
+ uint_t i,j,l, order = f->order;
+ lsmp_t *x = f->x;
+ lsmp_t *y = f->y;
+ lsmp_t *a = f->a;
+ lsmp_t *b = f->b;
+ i=0;//for (i=0;i<in->channels;i++) {
+ for (j = 0; j < in->length; j++) {
+ /* new input */
+ //AUBIO_DBG("befor %f\t", in->data[i][j]);
+ x[0] = in->data[i][j];
+ y[0] = b[0] * x[0];
+ for (l=1;l<order; l++) {
+ y[0] += b[l] * x[l];
+ y[0] -= a[l] * y[l];
+ } /* + 1e-37; for denormal ? */
+ /* new output */
+ in->data[i][j] = y[0];
+ //AUBIO_DBG("after %f\n", in->data[i][j]);
+ /* store states for next sample */
+ for (l=order-1; l>0; l--){
+ x[l] = x[l-1];
+ y[l] = y[l-1];
+ }
+ }
+ /* store states for next buffer */
+ f->x = x;
+ f->y = y;
+ //}
+}
+
+void aubio_filter_do_outplace(aubio_filter_t * f, fvec_t * in, fvec_t * out) {
+ uint_t i,j,l, order = f->order;
+ lsmp_t *x = f->x;
+ lsmp_t *y = f->y;
+ lsmp_t *a = f->a;
+ lsmp_t *b = f->b;
+
+ i=0; // works in mono only !!!
+ //for (i=0;i<in->channels;i++) {
+ for (j = 0; j < in->length; j++) {
+ /* new input */
+ x[0] = in->data[i][j];
+ y[0] = b[0] * x[0];
+ for (l=1;l<order; l++) {
+ y[0] += b[l] * x[l];
+ y[0] -= a[l] * y[l];
+ }
+ // + 1e-37;
+ /* new output */
+ out->data[i][j] = y[0];
+ /* store for next sample */
+ for (l=order-1; l>0; l--){
+ x[l] = x[l-1];
+ y[l] = y[l-1];
+ }
+ }
+ /* store for next run */
+ f->x = x;
+ f->y = y;
+ //}
+}
+
+/*
+ *
+ * despite mirroring, end effects destroy both phse and amplitude. the longer
+ * the buffer, the less affected they are.
+ *
+ * replacing with zeros clicks.
+ *
+ * seems broken for order > 4 (see biquad_do_filtfilt for audible one)
+ */
+void aubio_filter_do_filtfilt(aubio_filter_t * f, fvec_t * in, fvec_t * tmp) {
+ uint_t j,i=0;
+ uint_t length = in->length;
+ //uint_t order = f->order;
+ //lsmp_t mir;
+ /* mirroring */
+ //mir = 2*in->data[i][0];
+ //for (j=1;j<order;j++)
+ //f->x[j] = 0.;//mir - in->data[i][order-j];
+ /* apply filtering */
+ aubio_filter_do(f,in);
+ /* invert */
+ for (j = 0; j < length; j++)
+ tmp->data[i][length-j-1] = in->data[i][j];
+ /* mirror inverted */
+ //mir = 2*tmp->data[i][0];
+ //for (j=1;j<order;j++)
+ //f->x[j] = 0.;//mir - tmp->data[i][order-j];
+ /* apply filtering on inverted */
+ aubio_filter_do(f,tmp);
+ /* invert back */
+ for (j = 0; j < length; j++)
+ in->data[i][j] = tmp->data[i][length-j-1];
+}
+
+
+aubio_filter_t * new_aubio_adsgn_filter(uint_t samplerate) {
+ aubio_filter_t * f = new_aubio_filter(samplerate, 7);
+ lsmp_t * a = f->a;
+ lsmp_t * b = f->b;
+ /* uint_t l; */
+ /* for now, 44100, adsgn */
+ a[0] = 1.00000000000000000000000000000000000000000000000000000;
+ a[1] = -4.01957618111583236952810693765059113502502441406250000;
+ a[2] = 6.18940644292069386267485242569819092750549316406250000;
+ a[3] = -4.45319890354411640487342083360999822616577148437500000;
+ a[4] = 1.42084294962187751565352300531230866909027099609375000;
+ a[5] = -0.14182547383030480458998567883099894970655441284179688;
+ a[6] = 0.00435117723349511334451911181986361043527722358703613;
+ b[0] = 0.25574112520425740235907596797915175557136535644531250;
+ b[1] = -0.51148225040851391653973223583307117223739624023437500;
+ b[2] = -0.25574112520426162120656954357400536537170410156250000;
+ b[3] = 1.02296450081703405032840237254276871681213378906250000;
+ b[4] = -0.25574112520426051098354491841746494174003601074218750;
+ b[5] = -0.51148225040851369449512731080176308751106262207031250;
+ b[6] = 0.25574112520425729133677350546349771320819854736328125;
+ /* DBG: filter coeffs at creation time */
+ /*
+ for (l=0; l<f->order; l++){
+ AUBIO_DBG("a[%d]=\t%1.16f\tb[%d]=\t%1.16f\n",l,a[l],l,b[l]);
+ }
+ */
+ f->a = a;
+ f->b = b;
+ return f;
+}
+
+aubio_filter_t * new_aubio_cdsgn_filter(uint_t samplerate) {
+ aubio_filter_t * f = new_aubio_filter(samplerate, 5);
+ lsmp_t * a = f->a;
+ lsmp_t * b = f->b;
+ /* uint_t l; */
+ /* for now, 44100, cdsgn */
+ a[0] = 1.000000000000000000000000000000000000000000000000000000000000;
+ a[1] = -2.134674963687040794013682898366823792457580566406250000000000;
+ a[2] = 1.279333533236063358273781886964570730924606323242187500000000;
+ a[3] = -0.149559846089396208945743182994192466139793395996093750000000;
+ a[4] = 0.004908700174624848651394604104325480875559151172637939453125;
+ b[0] = 0.217008561949218803377448239189106971025466918945312500000000;
+ b[1] = -0.000000000000000222044604925031308084726333618164062500000000;
+ b[2] = -0.434017123898438272888711253472138196229934692382812500000000;
+ b[3] = 0.000000000000000402455846426619245903566479682922363281250000;
+ b[4] = 0.217008561949218969910901932962588034570217132568359375000000;
+ /* DBG: filter coeffs at creation time */
+ /*
+ for (l=0; l<f->order; l++){
+ AUBIO_DBG("a[%d]=\t%1.16f\tb[%d]=\t%1.16f\n",l,a[l],l,b[l]);
+ }
+ */
+ f->a = a;
+ f->b = b;
+ return f;
+}
+
+aubio_filter_t * new_aubio_filter(uint_t samplerate UNUSED, uint_t order) {
+ aubio_filter_t * f = AUBIO_NEW(aubio_filter_t);
+ lsmp_t * x = f->x;
+ lsmp_t * y = f->y;
+ lsmp_t * a = f->a;
+ lsmp_t * b = f->b;
+ uint_t l;
+ f->order = order;
+ a = AUBIO_ARRAY(lsmp_t,f->order);
+ b = AUBIO_ARRAY(lsmp_t,f->order);
+ x = AUBIO_ARRAY(lsmp_t,f->order);
+ y = AUBIO_ARRAY(lsmp_t,f->order);
+ /* initial states to zeros */
+ for (l=0; l<f->order; l++){
+ x[l] = 0.;
+ y[l] = 0.;
+ }
+ f->x = x;
+ f->y = y;
+ f->a = a;
+ f->b = b;
+ return f;
+}
+
+void del_aubio_filter(aubio_filter_t * f) {
+ AUBIO_FREE(f->a);
+ AUBIO_FREE(f->b);
+ AUBIO_FREE(f->x);
+ AUBIO_FREE(f->y);
+ AUBIO_FREE(f);
+ return;
+}
--- /dev/null
+++ b/src/temporal/filter.h
@@ -1,0 +1,97 @@
+/*
+ Copyright (C) 2003 Paul Brossier
+
+ This program is free software; you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 2 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program; if not, write to the Free Software
+ Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+
+*/
+
+#ifndef FILTER_H
+#define FILTER_H
+
+/** \file
+
+ Infinite Impulse Response filter
+
+ This file implements IIR filters of any order:
+
+ \f$ y[n] = b_1 x[n] + ... + b_{order} x[n-order] -
+ a_2 y[n-1] - ... - a_{order} y[n-order]\f$
+
+ The filtfilt version runs the filter twice, forward and backward, to
+ compensate the phase shifting of the forward operation.
+
+*/
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/** IIR filter object */
+typedef struct _aubio_filter_t aubio_filter_t;
+
+/** filter input vector (in-place)
+
+ \param b biquad object as returned by new_aubio_biquad
+ \param in input vector to filter
+
+*/
+void aubio_filter_do(aubio_filter_t * b, fvec_t * in);
+/** filter input vector (out-of-place)
+
+ \param b biquad object as returned by new_aubio_biquad
+ \param in input vector to filter
+ \param out output vector to store filtered input
+
+*/
+void aubio_filter_do_outplace(aubio_filter_t * b, fvec_t * in, fvec_t * out);
+/** filter input vector forward and backward
+
+ \param b biquad object as returned by new_aubio_biquad
+ \param in input vector to filter
+ \param tmp memory space to use for computation
+
+*/
+void aubio_filter_do_filtfilt(aubio_filter_t * b, fvec_t * in, fvec_t * tmp);
+/** create new IIR filter
+
+ \param samplerate signal sampling rate
+ \param order order of the filter (number of coefficients)
+
+*/
+aubio_filter_t * new_aubio_filter(uint_t samplerate, uint_t order);
+/** create a new A-design filter
+
+ \param samplerate sampling-rate of the signal to filter
+
+*/
+aubio_filter_t * new_aubio_adsgn_filter(uint_t samplerate);
+/** create a new C-design filter
+
+ \param samplerate sampling-rate of the signal to filter
+
+*/
+aubio_filter_t * new_aubio_cdsgn_filter(uint_t samplerate);
+/** delete a filter object
+
+ \param f filter object to delete
+
+*/
+void del_aubio_filter(aubio_filter_t * f);
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /*FILTER_H*/
--- /dev/null
+++ b/src/temporal/resample.c
@@ -1,0 +1,65 @@
+/*
+ Copyright (C) 2003 Paul Brossier
+
+ This program is free software; you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 2 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program; if not, write to the Free Software
+ Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+
+*/
+
+
+#include <samplerate.h> /* from libsamplerate */
+
+#include "aubio_priv.h"
+#include "sample.h"
+#include "temporal/resample.h"
+
+struct _aubio_resampler_t {
+ SRC_DATA *proc;
+ SRC_STATE *stat;
+ float ratio;
+ uint_t type;
+};
+
+aubio_resampler_t * new_aubio_resampler(float ratio, uint_t type) {
+ aubio_resampler_t * s = AUBIO_NEW(aubio_resampler_t);
+ int error = 0;
+ s->stat = src_new (type, 1, &error) ; /* only one channel */
+ s->proc = AUBIO_NEW(SRC_DATA);
+ if (error) AUBIO_ERR("%s\n",src_strerror(error));
+ s->ratio = ratio;
+ return s;
+}
+
+void del_aubio_resampler(aubio_resampler_t *s) {
+ src_delete(s->stat);
+ AUBIO_FREE(s->proc);
+ AUBIO_FREE(s);
+}
+
+uint_t aubio_resampler_process(aubio_resampler_t *s,
+ fvec_t * input, fvec_t * output) {
+ uint_t i ;
+ s->proc->input_frames = input->length;
+ s->proc->output_frames = output->length;
+ s->proc->src_ratio = s->ratio;
+ for (i = 0 ; i< input->channels; i++)
+ {
+ /* make SRC_PROC data point to input outputs */
+ s->proc->data_in = input->data[i];
+ s->proc->data_out= output->data[i];
+ /* do resampling */
+ src_process (s->stat, s->proc) ;
+ }
+ return AUBIO_OK;
+}
--- /dev/null
+++ b/src/temporal/resample.h
@@ -1,0 +1,60 @@
+/*
+ Copyright (C) 2003 Paul Brossier
+
+ This program is free software; you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 2 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program; if not, write to the Free Software
+ Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+
+*/
+
+#ifndef _RESAMPLE_H
+#define _RESAMPLE_H
+
+/** \file
+
+ Resampling object
+
+ This object resamples an input vector into an output vector using
+ libsamplerate. See http://www.mega-nerd.com/SRC/
+
+*/
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/** resampler object */
+typedef struct _aubio_resampler_t aubio_resampler_t;
+/** create resampler object
+
+ \param ratio output_sample_rate / input_sample_rate
+ \param type libsamplerate resampling type
+
+*/
+aubio_resampler_t * new_aubio_resampler(float ratio, uint_t type);
+/** delete resampler object */
+void del_aubio_resampler(aubio_resampler_t *s);
+/** resample input in output
+
+ \param s resampler object
+ \param input input buffer of size N
+ \param output output buffer of size N*ratio
+
+*/
+uint_t aubio_resampler_process(aubio_resampler_t *s, fvec_t * input, fvec_t * output);
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* _RESAMPLE_H */
--- a/src/tss.c
+++ /dev/null
@@ -1,127 +1,0 @@
-/*
- Copyright (C) 2003 Paul Brossier
-
- This program is free software; you can redistribute it and/or modify
- it under the terms of the GNU General Public License as published by
- the Free Software Foundation; either version 2 of the License, or
- (at your option) any later version.
-
- This program is distributed in the hope that it will be useful,
- but WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- GNU General Public License for more details.
-
- You should have received a copy of the GNU General Public License
- along with this program; if not, write to the Free Software
- Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
-
-*/
-
-/* default values : alfa=4, beta=3, threshold=0.25 */
-
-#include "aubio_priv.h"
-#include "sample.h"
-#include "mathutils.h"
-#include "tss.h"
-
-struct _aubio_tss_t
-{
- smpl_t thrs;
- smpl_t alfa;
- smpl_t beta;
- smpl_t parm;
- smpl_t thrsfact;
- fvec_t *theta1;
- fvec_t *theta2;
- fvec_t *oft1;
- fvec_t *oft2;
- fvec_t *dev;
-};
-
-void aubio_tss_do(aubio_tss_t *o, cvec_t * input,
- cvec_t * trans, cvec_t * stead)
-{
- uint_t i,j;
- uint_t test;
- uint_t nbins = input->length;
- uint_t channels = input->channels;
- smpl_t alfa = o->alfa;
- smpl_t beta = o->beta;
- smpl_t parm = o->parm;
- smpl_t ** dev = (smpl_t **)o->dev->data;
- smpl_t ** oft1 = (smpl_t **)o->oft1->data;
- smpl_t ** oft2 = (smpl_t **)o->oft2->data;
- smpl_t ** theta1 = (smpl_t **)o->theta1->data;
- smpl_t ** theta2 = (smpl_t **)o->theta2->data;
- /* second phase derivative */
- for (i=0;i<channels; i++){
- for (j=0;j<nbins; j++){
- dev[i][j] = aubio_unwrap2pi(input->phas[i][j]
- -2.0*theta1[i][j]+theta2[i][j]);
- theta2[i][j] = theta1[i][j];
- theta1[i][j] = input->phas[i][j];
- }
-
- for (j=0;j<nbins; j++){
- /* transient analysis */
- test = (ABS(dev[i][j]) > parm*oft1[i][j]);
- trans->norm[i][j] = input->norm[i][j] * test;
- trans->phas[i][j] = input->phas[i][j] * test;
- }
-
- for (j=0;j<nbins; j++){
- /* steady state analysis */
- test = (ABS(dev[i][j]) < parm*oft2[i][j]);
- stead->norm[i][j] = input->norm[i][j] * test;
- stead->phas[i][j] = input->phas[i][j] * test;
-
- /*increase sstate probability for sines */
- test = (trans->norm[i][j]==0.);
- oft1[i][j] = test;
- test = (stead->norm[i][j]==0.);
- oft2[i][j] = test;
- test = (trans->norm[i][j]>0.);
- oft1[i][j] += alfa*test;
- test = (stead->norm[i][j]>0.);
- oft2[i][j] += alfa*test;
- test = (oft1[i][j]>1. && trans->norm[i][j]>0.);
- oft1[i][j] += beta*test;
- test = (oft2[i][j]>1. && stead->norm[i][j]>0.);
- oft2[i][j] += beta*test;
- }
- }
-}
-
-void aubio_tss_set_thres(aubio_tss_t *o, smpl_t thrs){
- o->thrs = thrs;
- o->parm = thrs*o->thrsfact;
-}
-
-aubio_tss_t * new_aubio_tss(smpl_t thrs, smpl_t alfa, smpl_t beta,
- uint_t size, uint_t overlap,uint_t channels)
-{
- aubio_tss_t * o = AUBIO_NEW(aubio_tss_t);
- uint_t rsize = size/2+1;
- o->thrs = thrs;
- o->thrsfact = TWO_PI*overlap/rsize;
- o->alfa = alfa;
- o->beta = beta;
- o->parm = thrs*o->thrsfact;
- o->theta1 = new_fvec(rsize,channels);
- o->theta2 = new_fvec(rsize,channels);
- o->oft1 = new_fvec(rsize,channels);
- o->oft2 = new_fvec(rsize,channels);
- o->dev = new_fvec(rsize,channels);
- return o;
-}
-
-void del_aubio_tss(aubio_tss_t *s)
-{
- free(s->theta1);
- free(s->theta2);
- free(s->oft1);
- free(s->oft2);
- free(s->dev);
- free(s);
-}
-
--- a/src/tss.h
+++ /dev/null
@@ -1,84 +1,0 @@
-/*
- Copyright (C) 2003 Paul Brossier
-
- This program is free software; you can redistribute it and/or modify
- it under the terms of the GNU General Public License as published by
- the Free Software Foundation; either version 2 of the License, or
- (at your option) any later version.
-
- This program is distributed in the hope that it will be useful,
- but WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- GNU General Public License for more details.
-
- You should have received a copy of the GNU General Public License
- along with this program; if not, write to the Free Software
- Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
-
-*/
-
-/** \file
-
- Transient / Steady-state Separation (TSS)
-
- This file implement a Transient / Steady-state Separation (TSS) as described
- in:
-
- Christopher Duxbury, Mike E. Davies, and Mark B. Sandler. Separation of
- transient information in musical audio using multiresolution analysis
- techniques. In Proceedings of the Digital Audio Effects Conference, DAFx-01,
- pages 15, Limerick, Ireland, 2001.
-
-*/
-
-#ifndef TSS_H
-#define TSS_H
-
-#ifdef __cplusplus
-extern "C" {
-#endif
-
-/** TSS object */
-typedef struct _aubio_tss_t aubio_tss_t;
-
-/** create tss object
-
- \param thrs separation threshold
- \param alfa alfa parameter
- \param beta beta parameter
- \param size buffer size
- \param overlap step size
- \param channels number of input channels
-
-*/
-aubio_tss_t * new_aubio_tss(smpl_t thrs, smpl_t alfa, smpl_t beta,
- uint_t size, uint_t overlap,uint_t channels);
-/** delete tss object
-
- \param s tss object as returned by new_aubio_tss
-
-*/
-void del_aubio_tss(aubio_tss_t *s);
-
-/** set transient / steady state separation threshold
-
- \param tss tss object as returned by new_aubio_tss
- \param thrs new threshold value
-
-*/
-void aubio_tss_set_thres(aubio_tss_t *tss, smpl_t thrs);
-/** split input into transient and steady states components
-
- \param s tss object as returned by new_aubio_tss
- \param input input spectral frame
- \param trans output transient components
- \param stead output steady state components
-
-*/
-void aubio_tss_do(aubio_tss_t *s, cvec_t * input, cvec_t * trans, cvec_t * stead);
-
-#ifdef __cplusplus
-}
-#endif
-
-#endif /*TSS_H*/
--- /dev/null
+++ b/src/utils/hist.c
@@ -1,0 +1,157 @@
+/*
+ Copyright (C) 2003 Paul Brossier
+
+ This program is free software; you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 2 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program; if not, write to the Free Software
+ Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+*/
+
+#include "aubio_priv.h"
+#include "sample.h"
+#include "utils/scale.h"
+#include "mathutils.h" //vec_min vec_max
+#include "utils/hist.h"
+
+/********
+ * Object Structure
+ */
+
+struct _aubio_hist_t {
+ fvec_t * hist;
+ uint_t nelems;
+ uint_t channels;
+ fvec_t * cent;
+ aubio_scale_t *scaler;
+};
+
+/**
+ * Object creation/deletion calls
+ */
+aubio_hist_t * new_aubio_hist (smpl_t ilow, smpl_t ihig, uint_t nelems, uint_t channels){
+ aubio_hist_t * s = AUBIO_NEW(aubio_hist_t);
+ smpl_t step = (ihig-ilow)/(smpl_t)(nelems);
+ smpl_t accum = step;
+ uint_t i;
+ s->channels = channels;
+ s->nelems = nelems;
+ s->hist = new_fvec(nelems, channels);
+ s->cent = new_fvec(nelems, 1);
+
+ /* use scale to map ilow/ihig -> 0/nelems */
+ s->scaler = new_aubio_scale(ilow,ihig,0,nelems);
+ /* calculate centers now once */
+ s->cent->data[0][0] = ilow + 0.5 * step;
+ for (i=1; i < s->nelems; i++, accum+=step )
+ s->cent->data[0][i] = s->cent->data[0][0] + accum;
+
+ return s;
+}
+
+void del_aubio_hist(aubio_hist_t *s) {
+ del_fvec(s->hist);
+ del_fvec(s->cent);
+ del_aubio_scale(s->scaler);
+ AUBIO_FREE(s);
+}
+
+/***
+ * do it
+ */
+void aubio_hist_do (aubio_hist_t *s, fvec_t *input) {
+ uint_t i,j;
+ sint_t tmp = 0;
+ aubio_scale_do(s->scaler, input);
+ /* reset data */
+ for (i=0; i < s->channels; i++)
+ for (j=0; j < s->nelems; j++)
+ s->hist->data[i][j] = 0;
+ /* run accum */
+ for (i=0; i < input->channels; i++)
+ for (j=0; j < input->length; j++)
+ {
+ tmp = (sint_t)FLOOR(input->data[i][j]);
+ if ((tmp >= 0) && (tmp < (sint_t)s->nelems))
+ s->hist->data[i][tmp] += 1;
+ }
+}
+
+void aubio_hist_do_notnull (aubio_hist_t *s, fvec_t *input) {
+ uint_t i,j;
+ sint_t tmp = 0;
+ aubio_scale_do(s->scaler, input);
+ /* reset data */
+ for (i=0; i < s->channels; i++)
+ for (j=0; j < s->nelems; j++)
+ s->hist->data[i][j] = 0;
+ /* run accum */
+ for (i=0; i < input->channels; i++)
+ for (j=0; j < input->length; j++) {
+ if (input->data[i][j] != 0) {
+ tmp = (sint_t)FLOOR(input->data[i][j]);
+ if ((tmp >= 0) && (tmp < (sint_t)s->nelems))
+ s->hist->data[i][tmp] += 1;
+ }
+ }
+}
+
+
+void aubio_hist_dyn_notnull (aubio_hist_t *s, fvec_t *input) {
+ uint_t i,j;
+ sint_t tmp = 0;
+ smpl_t ilow = vec_min(input);
+ smpl_t ihig = vec_max(input);
+ smpl_t step = (ihig-ilow)/(smpl_t)(s->nelems);
+
+ /* readapt */
+ aubio_scale_set(s->scaler, ilow, ihig, 0, s->nelems);
+
+ /* recalculate centers */
+ s->cent->data[0][0] = ilow + 0.5f * step;
+ for (i=1; i < s->nelems; i++)
+ s->cent->data[0][i] = s->cent->data[0][0] + i * step;
+
+ /* scale */
+ aubio_scale_do(s->scaler, input);
+
+ /* reset data */
+ for (i=0; i < s->channels; i++)
+ for (j=0; j < s->nelems; j++)
+ s->hist->data[i][j] = 0;
+ /* run accum */
+ for (i=0; i < input->channels; i++)
+ for (j=0; j < input->length; j++) {
+ if (input->data[i][j] != 0) {
+ tmp = (sint_t)FLOOR(input->data[i][j]);
+ if ((tmp >= 0) && (tmp < (sint_t)s->nelems))
+ s->hist->data[i][tmp] += 1;
+ }
+ }
+}
+
+void aubio_hist_weight (aubio_hist_t *s) {
+ uint_t i,j;
+ for (i=0; i < s->channels; i++)
+ for (j=0; j < s->nelems; j++) {
+ s->hist->data[i][j] *= s->cent->data[0][j];
+ }
+}
+
+smpl_t aubio_hist_mean (aubio_hist_t *s) {
+ uint_t i,j;
+ smpl_t tmp = 0.0f;
+ for (i=0; i < s->channels; i++)
+ for (j=0; j < s->nelems; j++)
+ tmp += s->hist->data[i][j];
+ return tmp/(smpl_t)(s->nelems);
+}
+
--- /dev/null
+++ b/src/utils/hist.h
@@ -1,0 +1,61 @@
+/*
+ Copyright (C) 2003 Paul Brossier
+
+ This program is free software; you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 2 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program; if not, write to the Free Software
+ Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+
+*/
+
+/** @file
+ *
+ * Histogram function
+ *
+ * Big hacks to implement an histogram
+ */
+
+#ifndef HIST_H
+#define HIST_H
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/** histogram object */
+typedef struct _aubio_hist_t aubio_hist_t;
+
+/** histogram creation
+ * \param flow minimum input
+ * \param fhig maximum input
+ * \param nelems number of histogram columns
+ * \param channels number of channels
+ */
+aubio_hist_t * new_aubio_hist(smpl_t flow, smpl_t fhig, uint_t nelems, uint_t channels);
+/** histogram deletion */
+void del_aubio_hist(aubio_hist_t *s);
+/** compute the histogram */
+void aubio_hist_do(aubio_hist_t *s, fvec_t * input);
+/** compute the histogram ignoring null elements */
+void aubio_hist_do_notnull(aubio_hist_t *s, fvec_t * input);
+/** compute the mean of the histogram */
+smpl_t aubio_hist_mean(aubio_hist_t *s);
+/** weight the histogram */
+void aubio_hist_weight(aubio_hist_t *s);
+/** compute dynamic histogram for non-null elements */
+void aubio_hist_dyn_notnull (aubio_hist_t *s, fvec_t *input);
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif
--- /dev/null
+++ b/src/utils/scale.c
@@ -1,0 +1,79 @@
+/*
+ Copyright (C) 2003 Paul Brossier
+
+ This program is free software; you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 2 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program; if not, write to the Free Software
+ Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+
+*/
+
+#include "aubio_priv.h"
+#include "sample.h"
+#include "utils/scale.h"
+
+struct _aubio_scale_t {
+ smpl_t ilow;
+ smpl_t ihig;
+ smpl_t olow;
+ smpl_t ohig;
+
+ smpl_t scaler;
+ smpl_t irange;
+
+ /* not implemented yet : type in/out data
+ bool inint;
+ bool outint;
+ */
+};
+
+aubio_scale_t * new_aubio_scale (smpl_t ilow, smpl_t ihig,
+ smpl_t olow, smpl_t ohig) {
+ aubio_scale_t * s = AUBIO_NEW(aubio_scale_t);
+ aubio_scale_set (s, ilow, ihig, olow, ohig);
+ return s;
+}
+
+void del_aubio_scale(aubio_scale_t *s) {
+ AUBIO_FREE(s);
+}
+
+void aubio_scale_set (aubio_scale_t *s, smpl_t ilow, smpl_t ihig,
+ smpl_t olow, smpl_t ohig) {
+ smpl_t inputrange = ihig - ilow;
+ smpl_t outputrange= ohig - olow;
+ s->ilow = ilow;
+ s->ihig = ihig;
+ s->olow = olow;
+ s->ohig = ohig;
+ if (inputrange == 0) {
+ s->scaler = 0.0f;
+ } else {
+ s->scaler = outputrange/inputrange;
+ if (inputrange < 0) {
+ inputrange = inputrange * -1.0f;
+ }
+ }
+}
+
+void aubio_scale_do (aubio_scale_t *s, fvec_t *input)
+{
+ uint_t i, j;
+ for (i=0; i < input->channels; i++){
+ for (j=0; j < input->length; j++){
+ input->data[i][j] -= s->ilow;
+ input->data[i][j] *= s->scaler;
+ input->data[i][j] += s->olow;
+ }
+ }
+}
+
--- /dev/null
+++ b/src/utils/scale.h
@@ -1,0 +1,78 @@
+/*
+ Copyright (C) 2003 Paul Brossier
+
+ This program is free software; you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 2 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program; if not, write to the Free Software
+ Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+*/
+
+/** \file
+
+ Vector scaling function
+
+ This object, inspired from the scale object in FTS, the jMax engine, scales
+ the values of a vector according to an affine function defined as follow:
+
+ \f$ y = (x - ilow)*(ohig-olow)/(ihig-ilow) + olow \f$
+
+*/
+#ifndef SCALE_H
+#define SCALE_H
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/** scale object */
+typedef struct _aubio_scale_t aubio_scale_t;
+
+/** create a scale object
+
+ \param flow lower value of output function
+ \param fhig higher value of output function
+ \param ilow lower value of input function
+ \param ihig higher value of output function
+
+*/
+aubio_scale_t * new_aubio_scale(smpl_t flow, smpl_t fhig,
+ smpl_t ilow, smpl_t ihig);
+/** delete a scale object
+
+ \param s scale object as returned by new_aubio_scale
+
+*/
+void del_aubio_scale(aubio_scale_t *s);
+/** scale input vector
+
+ \param s scale object as returned by new_aubio_scale
+ \param input vector to scale
+
+*/
+void aubio_scale_do(aubio_scale_t *s, fvec_t * input);
+/** modify scale parameters after object creation
+
+ \param s scale object as returned by new_aubio_scale
+ \param olow lower value of output function
+ \param ohig higher value of output function
+ \param ilow lower value of input function
+ \param ihig higher value of output function
+
+*/
+void aubio_scale_set (aubio_scale_t *s, smpl_t ilow, smpl_t ihig,
+ smpl_t olow, smpl_t ohig);
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif