From 06cae6cc6c312a179e19503edfd430ef1c64cf6f Mon Sep 17 00:00:00 2001 From: Paul Brossier Date: Thu, 17 Sep 2009 01:20:54 +0200 Subject: [PATCH] src/spectral/filterbank.c: refactorise filter bank, split mel frequency coefficients to src/spectral/filterbank_mel.c, start bumping license to GPLv3 --- src/Makefile.am | 2 + src/aubio.h | 1 + src/spectral/filterbank.c | 219 +++++++--------------------------- src/spectral/filterbank.h | 58 +++++---- src/spectral/filterbank_mel.c | 152 +++++++++++++++++++++++ src/spectral/filterbank_mel.h | 58 +++++++++ src/spectral/mfcc.c | 5 +- swig/aubio.i | 4 +- 8 files changed, 289 insertions(+), 210 deletions(-) create mode 100644 src/spectral/filterbank_mel.c create mode 100644 src/spectral/filterbank_mel.h diff --git a/src/Makefile.am b/src/Makefile.am index 52602c81..e3ef8843 100644 --- a/src/Makefile.am +++ b/src/Makefile.am @@ -17,6 +17,7 @@ nobase_pkginclude_HEADERS = \ temporal/adesign.h \ temporal/cdesign.h \ spectral/filterbank.h \ + spectral/filterbank_mel.h \ spectral/mfcc.h \ spectral/phasevoc.h \ spectral/fft.h \ @@ -48,6 +49,7 @@ libaubio_la_SOURCES = \ temporal/adesign.c \ temporal/cdesign.c \ spectral/filterbank.c \ + spectral/filterbank_mel.c \ spectral/mfcc.c \ spectral/phasevoc.c \ spectral/fft.c \ diff --git a/src/aubio.h b/src/aubio.h index 678075e6..0bab0660 100644 --- a/src/aubio.h +++ b/src/aubio.h @@ -72,6 +72,7 @@ extern "C" #include "temporal/adesign.h" #include "temporal/cdesign.h" #include "spectral/filterbank.h" +#include "spectral/filterbank_mel.h" #include "spectral/mfcc.h" #include "spectral/fft.h" #include "spectral/phasevoc.h" diff --git a/src/spectral/filterbank.c b/src/spectral/filterbank.c index aacca4fd..8b1fdf8f 100644 --- a/src/spectral/filterbank.c +++ b/src/spectral/filterbank.c @@ -1,23 +1,23 @@ /* - Copyright (C) 2007 Amaury Hazan - and Paul Brossier + Copyright (C) 2007-2009 Paul Brossier + and Amaury Hazan - 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 file is part of Aubio. - 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. + Aubio 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 3 of the License, or + (at your option) any later version. - 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. + Aubio 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 Aubio. If not, see . +*/ #include "aubio_priv.h" #include "fvec.h" @@ -31,189 +31,58 @@ struct aubio_filterbank_t_ { uint_t win_s; uint_t n_filters; - fvec_t **filters; + fvec_t *filters; }; aubio_filterbank_t * new_aubio_filterbank(uint_t n_filters, uint_t win_s){ - /** allocating space for filterbank object */ + /* allocate 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_cntfilters[filter_cnt]=new_fvec(win_s, 1); + /* allocate filter tables, an fvec of length win_s and of filter_cnt channel */ + fb->filters = new_fvec(win_s, n_filters); 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_cntdata[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_cntdata[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_cntdata[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]; - } +void del_aubio_filterbank(aubio_filterbank_t * fb){ + del_fvec(fb->filters); + AUBIO_FREE(fb); +} - //computing triangle heights so that each triangle has unit area - for(filter_cnt=0; filter_cntdata[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_cntdata[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_cntdata[0][bin_cnt]= aubio_bintofreq(bin_cnt, samplerate, win_s); - } +void aubio_filterbank_do(aubio_filterbank_t * f, cvec_t * in, fvec_t *out) { + uint_t i, j, fn; - //building each filter table - for(filter_cnt=0; filter_cntdata[0][filter_cnt]/(center_freqs->data[0][filter_cnt]-lower_freqs->data[0][filter_cnt]); - - //zeroing begining of filter - for(bin_cnt=0; bin_cntfilters[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_cntfilters[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_cntdata[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_cntfilters[filter_cnt]->data[0][bin_cnt]=0.f; + /* apply filter to all input channel, provided out has enough channels */ + uint_t max_channels = MIN(in->channels, out->channels); + uint_t max_filters = MIN(f->n_filters, out->length); - } - - - del_fvec(freqs); - del_fvec(lower_freqs); - del_fvec(upper_freqs); - del_fvec(center_freqs); + /* reset all values in output vector */ + fvec_zeros(out); - del_fvec(triangle_heights); - del_fvec(fft_freqs); + /* apply filters on all channels */ + for (i = 0; i < max_channels; i++) { - return fb; + /* for each filter */ + for(fn = 0; fn < max_filters; fn++) { -} + /* for each sample */ + for(j = 0; j < in->length; j++) { + out->data[i][fn] += in->norm[i][j] * f->filters->data[fn][j]; + } -void del_aubio_filterbank(aubio_filterbank_t * fb){ - uint_t filter_cnt; - /** deleting filter tables first */ - for (filter_cnt=0; filter_cntn_filters; filter_cnt++) - del_fvec(fb->filters[filter_cnt]); - AUBIO_FREE(fb->filters); - AUBIO_FREE(fb); -} + /* threshold to VERY_SMALL_NUMBER to avoid log oveflow */ + out->data[i][fn] = MAX(VERY_SMALL_NUMBER, out->data[i][fn]); -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]); + /* compute logarithm */ + out->data[i][fn] = LOG(out->data[i][fn]); + } } 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; } +fvec_t * aubio_filterbank_get_coeffs(aubio_filterbank_t * f) { + return f->filters; } diff --git a/src/spectral/filterbank.h b/src/spectral/filterbank.h index 84c5ab6a..4c8b04ee 100644 --- a/src/spectral/filterbank.h +++ b/src/spectral/filterbank.h @@ -1,27 +1,29 @@ /* - Copyright (C) 2007 Amaury Hazan - and 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. + Copyright (C) 2007-2009 Paul Brossier + and Amaury Hazan + + This file is part of Aubio. + + Aubio 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 3 of the License, or + (at your option) any later version. + + Aubio 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 Aubio. If not, see . + */ /** \file Filterbank object - General-purpose spectral filterbank object. Comes with mel-filter initialization function. + General-purpose spectral filterbank object. */ @@ -44,18 +46,6 @@ typedef struct aubio_filterbank_t_ aubio_filterbank_t; 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 @@ -65,13 +55,19 @@ void del_aubio_filterbank(aubio_filterbank_t * fb); /** compute filterbank + \param fb filterbank containing nfilt x win_s filter coefficients + \param in input spectrum containing chans x win_s spectrum + \param out output vector containing chans x nfilt output values + */ void aubio_filterbank_do(aubio_filterbank_t * fb, cvec_t * in, fvec_t *out); -/** return the vector containing the filter coefficients of one channel +/** return a pointer to the fvec object containing all filter coefficients + + \param f filterbank object to get coefficients from */ -fvec_t * aubio_filterbank_getchannel(aubio_filterbank_t * f, uint_t channel); +fvec_t * aubio_filterbank_get_coeffs(aubio_filterbank_t * f); #ifdef __cplusplus } diff --git a/src/spectral/filterbank_mel.c b/src/spectral/filterbank_mel.c new file mode 100644 index 00000000..55d9ef14 --- /dev/null +++ b/src/spectral/filterbank_mel.c @@ -0,0 +1,152 @@ +/* + Copyright (C) 2007-2009 Paul Brossier + and Amaury Hazan + + This file is part of Aubio. + + Aubio 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 3 of the License, or + (at your option) any later version. + + Aubio 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 Aubio. If not, see . + +*/ + +#include "aubio_priv.h" +#include "fvec.h" +#include "cvec.h" +#include "spectral/filterbank.h" +#include "mathutils.h" + +void aubio_filterbank_set_mel_coeffs(aubio_filterbank_t *fb, uint_t samplerate, smpl_t freq_min, smpl_t freq_max){ + + fvec_t *filters = aubio_filterbank_get_coeffs(fb); + uint_t n_filters = filters->channels, win_s = filters->length; + + //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_cntdata[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_cntdata[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_cntdata[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_cntdata[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_cntdata[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_cntdata[0][bin_cnt]= aubio_bintofreq(bin_cnt, samplerate, win_s); + } + + //building each filter table + for(filter_cnt=0; filter_cntdata[0][filter_cnt]/(center_freqs->data[0][filter_cnt]-lower_freqs->data[0][filter_cnt]); + + //zeroing begining of filter + for(bin_cnt=0; bin_cntdata[filter_cnt][bin_cnt]=0.0; + 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_cntdata[filter_cnt][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_cntdata[0][filter_cnt]-(fft_freqs->data[0][bin_cnt]-center_freqs->data[0][filter_cnt])*riseInc; + if(val>=0) + filters->data[filter_cnt][bin_cnt]=val; + else filters->data[filter_cnt][bin_cnt]=0.0; + + //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_cntdata[filter_cnt][bin_cnt]=0.f; + + } + + /* destroy temporarly allocated vectors */ + del_fvec(freqs); + del_fvec(lower_freqs); + del_fvec(upper_freqs); + del_fvec(center_freqs); + + del_fvec(triangle_heights); + del_fvec(fft_freqs); + +} + diff --git a/src/spectral/filterbank_mel.h b/src/spectral/filterbank_mel.h new file mode 100644 index 00000000..d1fcb31a --- /dev/null +++ b/src/spectral/filterbank_mel.h @@ -0,0 +1,58 @@ +/* + Copyright (C) 2007-2009 Paul Brossier + and Amaury Hazan + + This file is part of Aubio. + + Aubio 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 3 of the License, or + (at your option) any later version. + + Aubio 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 Aubio. If not, see . + +*/ + +/** \file + + Mel frequency filter bankd coefficients + + Set filter bank coefficients to Mel frequency bands. + + The filter coefficients are built according to Malcolm Slaney's Auditory + Toolbox available at http://cobweb.ecn.purdue.edu/~malcolm/interval/1998-010/ + (see the file mfcc.m). + +*/ + +#ifndef FILTERBANK_MEL_H +#define FILTERBANK_MEL_H + +#ifdef __cplusplus +extern "C" { +#endif + +#include "filterbank.h" + +/** 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 + +*/ +void aubio_filterbank_set_mel_coeffs(aubio_filterbank_t *fb, uint_t samplerate, smpl_t freq_min, smpl_t freq_max); + +#ifdef __cplusplus +} +#endif + +#endif // FILTERBANK_MEL_H diff --git a/src/spectral/mfcc.c b/src/spectral/mfcc.c index a8315a76..5d9e6ae8 100644 --- a/src/spectral/mfcc.c +++ b/src/spectral/mfcc.c @@ -24,7 +24,7 @@ #include "fvec.h" #include "cvec.h" #include "spectral/fft.h" -#include "spectral/filterbank.h" +#include "spectral/filterbank_mel.h" #include "spectral/mfcc.h" /** Internal structure for mfcc object **/ @@ -61,7 +61,8 @@ aubio_mfcc_t * new_aubio_mfcc (uint_t win_s, uint_t samplerate, uint_t n_filters /** filterbank allocation */ - mfcc->fb = new_aubio_filterbank_mfcc(n_filters, mfcc->win_s, samplerate, lowfreq, highfreq); + mfcc->fb = new_aubio_filterbank(n_filters, mfcc->win_s); + aubio_filterbank_set_mel_coeffs(mfcc->fb, samplerate, lowfreq, highfreq); /** allocating space for fft object (used for dct) */ mfcc->fft_dct=new_aubio_fft(n_filters, 1); diff --git a/swig/aubio.i b/swig/aubio.i index f7605ba4..1fe613ae 100644 --- a/swig/aubio.i +++ b/swig/aubio.i @@ -162,10 +162,10 @@ smpl_t aubio_spectral_centroid(cvec_t * spectrum, smpl_t samplerate); /* filterbank */ aubio_filterbank_t * new_aubio_filterbank(uint_t win_s, uint_t channels); -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); +void aubio_filterbank_set_mel_coeffs(aubio_filterbank_t *fb, uint_t samplerate, smpl_t freq_min, smpl_t freq_max); void del_aubio_filterbank(aubio_filterbank_t * fb); void aubio_filterbank_do(aubio_filterbank_t * fb, cvec_t * in, fvec_t *out); -fvec_t * aubio_filterbank_getchannel(aubio_filterbank_t * fb, uint_t channel); +fvec_t * aubio_filterbank_get_coeffs(aubio_filterbank_t * fb); /* mfcc */ 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); -- 2.26.2