5497a4fd217f5e506fbb50fb94e831e35543fc89
[aubio.git] / src / spectral / filterbank.c
1 /*
2   Copyright (C) 2007-2009 Paul Brossier <piem@aubio.org>
3                       and Amaury Hazan <ahazan@iua.upf.edu>
4
5   This file is part of aubio.
6
7   aubio 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 3 of the License, or
10   (at your option) any later version.
11
12   aubio 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 aubio.  If not, see <http://www.gnu.org/licenses/>.
19
20 */
21
22 #include "aubio_priv.h"
23 #include "fvec.h"
24 #include "fmat.h"
25 #include "cvec.h"
26 #include "vecutils.h"
27 #include "spectral/filterbank.h"
28 #include "mathutils.h"
29
30 /** \brief A structure to store a set of n_filters filters of lenghts win_s */
31 struct _aubio_filterbank_t
32 {
33   uint_t win_s;
34   uint_t n_filters;
35   fmat_t *filters;
36   smpl_t norm;
37   smpl_t power;
38 };
39
40 aubio_filterbank_t *
41 new_aubio_filterbank (uint_t n_filters, uint_t win_s)
42 {
43   /* allocate space for filterbank object */
44   aubio_filterbank_t *fb = AUBIO_NEW (aubio_filterbank_t);
45   fb->win_s = win_s;
46   fb->n_filters = n_filters;
47
48   /* allocate filter tables, a matrix of length win_s and of height n_filters */
49   fb->filters = new_fmat (n_filters, win_s / 2 + 1);
50
51   fb->norm = 1;
52
53   fb->power = 1;
54
55   return fb;
56 }
57
58 void
59 del_aubio_filterbank (aubio_filterbank_t * fb)
60 {
61   del_fmat (fb->filters);
62   AUBIO_FREE (fb);
63 }
64
65 void
66 aubio_filterbank_do (aubio_filterbank_t * f, const cvec_t * in, fvec_t * out)
67 {
68   /* apply filter to all input channel, provided out has enough channels */
69   //uint_t max_filters = MIN (f->n_filters, out->length);
70   //uint_t max_length = MIN (in->length, f->filters->length);
71
72   // view cvec->norm as fvec->data
73   fvec_t tmp;
74   tmp.length = in->length;
75   tmp.data = in->norm;
76
77   if (f->power != 1.) fvec_pow(&tmp, f->power);
78
79   fmat_vecmul(f->filters, &tmp, out);
80
81   return;
82 }
83
84 fmat_t *
85 aubio_filterbank_get_coeffs (const aubio_filterbank_t * f)
86 {
87   return f->filters;
88 }
89
90 uint_t
91 aubio_filterbank_set_coeffs (aubio_filterbank_t * f, const fmat_t * filter_coeffs)
92 {
93   fmat_copy(filter_coeffs, f->filters);
94   return 0;
95 }
96
97 uint_t
98 aubio_filterbank_set_norm (aubio_filterbank_t *f, smpl_t norm)
99 {
100   if (norm != 0 && norm != 1) return AUBIO_FAIL;
101   f->norm = norm;
102   return AUBIO_OK;
103 }
104
105 smpl_t
106 aubio_filterbank_get_norm (aubio_filterbank_t *f)
107 {
108   return f->norm;
109 }
110
111 uint_t
112 aubio_filterbank_set_power (aubio_filterbank_t *f, smpl_t power)
113 {
114   f->power = power;
115   return AUBIO_OK;
116 }
117
118 smpl_t
119 aubio_filterbank_get_power (aubio_filterbank_t *f)
120 {
121   return f->norm;
122 }