source: src/spectral/mfcc.c @ c185ebb

feature/autosinkfeature/cnnfeature/cnn_orgfeature/constantqfeature/crepefeature/crepe_orgfeature/pitchshiftfeature/pydocstringsfeature/timestretchfix/ffmpeg5pitchshiftsamplertimestretchyinfft+
Last change on this file since c185ebb was c185ebb, checked in by Paul Brossier <piem@piem.org>, 15 years ago

mfcc.c: use a coefficient table for DCT computation, remove unused parameters

  • Property mode set to 100644
File size: 3.1 KB
Line 
1/*
2   Copyright (C) 2006 Amaury Hazan
3   Ported to aubio from LibXtract
4   http://libxtract.sourceforge.net/
5   
6
7   This program is free software; you can redistribute it and/or modify
8   it under the terms of the GNU General Public License as published by
9   the Free Software Foundation; either version 2 of the License, or
10   (at your option) any later version.
11
12   This program is distributed in the hope that it will be useful,
13   but WITHOUT ANY WARRANTY; without even the implied warranty of
14   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
15   GNU General Public License for more details.
16
17   You should have received a copy of the GNU General Public License
18   along with this program; if not, write to the Free Software
19   Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
20
21*/
22
23#include "aubio_priv.h"
24#include "fvec.h"
25#include "cvec.h"
26#include "spectral/fft.h"
27#include "spectral/filterbank_mel.h"
28#include "spectral/mfcc.h"
29
30/** Internal structure for mfcc object **/
31
32struct aubio_mfcc_t_{
33  uint_t win_s;             /** grain length */
34  uint_t samplerate;        /** sample rate (needed?) */
35  uint_t n_filters;         /** number of  *filters */
36  uint_t n_coefs;           /** number of coefficients (<= n_filters/2 +1) */
37  aubio_filterbank_t * fb;  /** filter bank */
38  fvec_t * in_dct;          /** input buffer for dct * [fb->n_filters] */
39  fvec_t * dct_coeffs;      /** DCT transform n_filters * n_coeffs */
40};
41
42
43aubio_mfcc_t * new_aubio_mfcc (uint_t win_s, uint_t samplerate, uint_t n_filters, uint_t n_coefs){
44
45  uint_t i, j;
46
47  /** allocating space for mfcc object */
48  aubio_mfcc_t * mfcc = AUBIO_NEW(aubio_mfcc_t);
49
50  //we need (n_coefs-1)*2 filters to obtain n_coefs coefficients after dct
51  //uint_t n_filters = (n_coefs-1)*2;
52 
53  mfcc->win_s=win_s;
54  mfcc->samplerate=samplerate;
55  mfcc->n_filters=n_filters;
56  mfcc->n_coefs=n_coefs;
57
58 
59  /** filterbank allocation */
60  mfcc->fb = new_aubio_filterbank(n_filters, mfcc->win_s);
61  aubio_filterbank_set_mel_coeffs_slaney(mfcc->fb, samplerate);
62
63  /** allocating buffers */
64  mfcc->in_dct=new_fvec(n_filters, 1);
65 
66  mfcc->dct_coeffs = new_fvec(n_coefs, n_filters);
67
68 
69  /* compute DCT transform dct_coeffs[i][j] as
70    cos ( j * (i+.5) * PI / n_filters )
71  */
72  smpl_t scaling = 1./SQRT(n_filters/2.);
73  for (i = 0; i < n_filters; i++) { 
74    for (j = 0; j < n_coefs; j++) {
75      mfcc->dct_coeffs->data[i][j] =
76        scaling * COS (j * (i + 0.5) * PI / n_filters);
77    }
78    mfcc->dct_coeffs->data[i][0] *= SQRT(2.)/2.;
79  }
80
81  return mfcc;
82};
83
84void del_aubio_mfcc(aubio_mfcc_t *mf){
85  /** deleting filterbank */
86  del_aubio_filterbank(mf->fb);
87  /** deleting buffers */
88  del_fvec(mf->in_dct);
89 
90  /** deleting mfcc object */
91  AUBIO_FREE(mf);
92}
93
94
95void aubio_mfcc_do(aubio_mfcc_t * mf, cvec_t *in, fvec_t *out){
96  uint_t i, j;
97  // compute filterbank
98  aubio_filterbank_do(mf->fb, in, mf->in_dct);
99
100  //extract real part of fft grain
101  for (i = 0; i < mf->n_filters; i++) { 
102    for (j = 0; j < mf->n_coefs; j++) {
103      out->data[0][j] += mf->in_dct->data[0][i]
104        * mf->dct_coeffs->data[i][j];
105    }
106  }
107
108  return;
109}
Note: See TracBrowser for help on using the repository browser.