1 #include "aubio-types.h"
3 static char Py_filterbank_doc[] = ""
4 "filterbank(n_filters=40, win_s=1024)\n"
6 "Create a bank of spectral filters. Each instance is a callable\n"
7 "that holds a matrix of coefficients.\n"
9 "See also :meth:`set_mel_coeffs`, :meth:`set_mel_coeffs_htk`,\n"
10 ":meth:`set_mel_coeffs_slaney`, :meth:`set_triangle_bands`, and\n"
11 ":meth:`set_coeffs`.\n"
16 " Number of filters to create.\n"
18 " Size of the input spectrum to process.\n"
22 ">>> f = aubio.filterbank(128, 1024)\n"
23 ">>> f.set_mel_coeffs(44100, 0, 10000)\n"
24 ">>> c = aubio.cvec(1024)\n"
29 static char Py_filterbank_set_triangle_bands_doc[] =""
30 "set_triangle_bands(freqs, samplerate)\n"
32 "Set triangular bands. The coefficients will be set to triangular\n"
33 "overlapping windows using the boundaries specified by `freqs`.\n"
35 "`freqs` should contain `n_filters + 2` frequencies in Hz, ordered\n"
36 "by value, from smallest to largest. The first element should be greater\n"
37 "or equal to zero; the last element should be smaller or equal to\n"
43 " List of frequencies, in Hz.\n"
44 "samplerate : float\n"
45 " Sampling-rate of the expected input.\n"
49 ">>> fb = aubio.filterbank(n_filters=100, win_s=2048)\n"
50 ">>> samplerate = 44100; freqs = np.linspace(0, 20200, 102)\n"
51 ">>> fb.set_triangle_bands(aubio.fvec(freqs), samplerate)\n"
54 static char Py_filterbank_set_mel_coeffs_slaney_doc[] = ""
55 "set_mel_coeffs_slaney(samplerate)\n"
57 "Set coefficients of filterbank to match Slaney's Auditory Toolbox.\n"
59 "The filter coefficients will be set as in Malcolm Slaney's\n"
60 "implementation. The filterbank should have been created with\n"
63 "This is approximately equivalent to using :meth:`set_mel_coeffs` with\n"
64 "`fmin = 400./3., fmax = 6853.84`.\n"
68 "samplerate : float\n"
69 " Sampling-rate of the expected input.\n"
74 "Malcolm Slaney, `Auditory Toolbox Version 2, Technical Report #1998-010\n"
75 "<https://engineering.purdue.edu/~malcolm/interval/1998-010/>`_\n"
78 static char Py_filterbank_set_mel_coeffs_doc[] = ""
79 "set_mel_coeffs(samplerate, fmin, fmax)\n"
81 "Set coefficients of filterbank to linearly spaced mel scale.\n"
85 "samplerate : float\n"
86 " Sampling-rate of the expected input.\n"
88 " Lower frequency boundary of the first filter.\n"
90 " Upper frequency boundary of the last filter.\n"
97 static char Py_filterbank_set_mel_coeffs_htk_doc[] = ""
98 "set_mel_coeffs_htk(samplerate, fmin, fmax)\n"
100 "Set coefficients of the filters to be linearly spaced in the HTK mel scale.\n"
104 "samplerate : float\n"
105 " Sampling-rate of the expected input.\n"
107 " Lower frequency boundary of the first filter.\n"
109 " Upper frequency boundary of the last filter.\n"
113 "hztomel with `htk=True`\n"
116 static char Py_filterbank_get_coeffs_doc[] = ""
119 "Get coefficients matrix of filterbank.\n"
124 " Array of shape (n_filters, win_s/2+1) containing the coefficients.\n"
127 static char Py_filterbank_set_coeffs_doc[] = ""
128 "set_coeffs(coeffs)\n"
130 "Set coefficients of filterbank.\n"
135 " Array of shape (n_filters, win_s/2+1) containing the coefficients.\n"
138 static char Py_filterbank_set_power_doc[] = ""
141 "Set power applied to input spectrum of filterbank.\n"
146 " Power to raise input spectrum to before computing the filters.\n"
149 static char Py_filterbank_get_power_doc[] = ""
152 "Get power applied to filterbank.\n"
157 " Power parameter.\n"
160 static char Py_filterbank_set_norm_doc[] = ""
163 "Set norm parameter. If set to `0`, the filters will not be normalized.\n"
164 "If set to `1`, the filters will be normalized to one. Default to `1`.\n"
166 "This function should be called *before* :meth:`set_triangle_bands`,\n"
167 ":meth:`set_mel_coeffs`, :meth:`set_mel_coeffs_htk`, or\n"
168 ":meth:`set_mel_coeffs_slaney`.\n"
173 " `0` to disable, `1` to enable\n"
176 static char Py_filterbank_get_norm_doc[] = ""
179 "Get norm parameter of filterbank.\n"
190 aubio_filterbank_t * o;
201 Py_filterbank_new (PyTypeObject * type, PyObject * args, PyObject * kwds)
203 int win_s = 0, n_filters = 0;
205 static char *kwlist[] = { "n_filters", "win_s", NULL };
207 if (!PyArg_ParseTupleAndKeywords (args, kwds, "|II", kwlist,
208 &n_filters, &win_s)) {
212 self = (Py_filterbank *) type->tp_alloc (type, 0);
218 self->win_s = Py_default_vector_length;
221 } else if (win_s < 0) {
222 PyErr_SetString (PyExc_ValueError,
223 "can not use negative window size");
227 self->n_filters = 40;
229 self->n_filters = n_filters;
230 } else if (n_filters < 0) {
231 PyErr_SetString (PyExc_ValueError,
232 "can not use negative number of filters");
236 return (PyObject *) self;
240 Py_filterbank_init (Py_filterbank * self, PyObject * args, PyObject * kwds)
242 self->o = new_aubio_filterbank (self->n_filters, self->win_s);
243 if (self->o == NULL) {
244 PyErr_Format(PyExc_RuntimeError, "error creating filterbank with"
245 " n_filters=%d, win_s=%d", self->n_filters, self->win_s);
248 self->out = new_py_fvec(self->n_filters);
254 Py_filterbank_del (Py_filterbank *self, PyObject *unused)
257 free(self->coeffs.data);
258 del_aubio_filterbank(self->o);
260 Py_XDECREF(self->out);
261 Py_TYPE(self)->tp_free((PyObject *) self);
265 Py_filterbank_do(Py_filterbank * self, PyObject * args)
269 if (!PyArg_ParseTuple (args, "O", &input)) {
273 if (!PyAubio_PyCvecToCCvec(input, &(self->vec) )) {
277 if (self->vec.length != self->win_s / 2 + 1) {
278 PyErr_Format(PyExc_ValueError,
279 "input cvec has length %d, but filterbank expects length %d",
280 self->vec.length, self->win_s / 2 + 1);
284 Py_INCREF(self->out);
285 if (!PyAubio_ArrayToCFvec(self->out, &(self->c_out))) {
288 // compute the function
289 aubio_filterbank_do (self->o, &(self->vec), &(self->c_out));
293 static PyMemberDef Py_filterbank_members[] = {
294 {"win_s", T_INT, offsetof (Py_filterbank, win_s), READONLY,
295 "size of the window"},
296 {"n_filters", T_INT, offsetof (Py_filterbank, n_filters), READONLY,
297 "number of filters"},
298 {NULL} /* sentinel */
302 Py_filterbank_set_triangle_bands (Py_filterbank * self, PyObject *args)
308 if (!PyArg_ParseTuple (args, "O" AUBIO_NPY_SMPL_CHR, &input, &samplerate)) {
316 if (!PyAubio_ArrayToCFvec(input, &(self->freqs) )) {
320 err = aubio_filterbank_set_triangle_bands (self->o,
321 &(self->freqs), samplerate);
323 if (PyErr_Occurred() == NULL) {
324 PyErr_SetString (PyExc_ValueError, "error running set_triangle_bands");
326 // change the RuntimeError into ValueError
327 PyObject *type, *value, *traceback;
328 PyErr_Fetch(&type, &value, &traceback);
329 PyErr_Restore(PyExc_ValueError, value, traceback);
337 Py_filterbank_set_mel_coeffs_slaney (Py_filterbank * self, PyObject *args)
342 if (!PyArg_ParseTuple (args, AUBIO_NPY_SMPL_CHR, &samplerate)) {
346 err = aubio_filterbank_set_mel_coeffs_slaney (self->o, samplerate);
348 if (PyErr_Occurred() == NULL) {
349 PyErr_SetString (PyExc_ValueError, "error running set_mel_coeffs_slaney");
351 // change the RuntimeError into ValueError
352 PyObject *type, *value, *traceback;
353 PyErr_Fetch(&type, &value, &traceback);
354 PyErr_Restore(PyExc_ValueError, value, traceback);
362 Py_filterbank_set_mel_coeffs (Py_filterbank * self, PyObject *args)
369 if (!PyArg_ParseTuple (args, AUBIO_NPY_SMPL_CHR AUBIO_NPY_SMPL_CHR
370 AUBIO_NPY_SMPL_CHR, &samplerate, &freq_min, &freq_max)) {
374 err = aubio_filterbank_set_mel_coeffs (self->o, samplerate,
377 if (PyErr_Occurred() == NULL) {
378 PyErr_SetString (PyExc_ValueError, "error running set_mel_coeffs");
380 // change the RuntimeError into ValueError
381 PyObject *type, *value, *traceback;
382 PyErr_Fetch(&type, &value, &traceback);
383 PyErr_Restore(PyExc_ValueError, value, traceback);
391 Py_filterbank_set_mel_coeffs_htk (Py_filterbank * self, PyObject *args)
398 if (!PyArg_ParseTuple (args, AUBIO_NPY_SMPL_CHR AUBIO_NPY_SMPL_CHR
399 AUBIO_NPY_SMPL_CHR, &samplerate, &freq_min, &freq_max)) {
403 err = aubio_filterbank_set_mel_coeffs_htk (self->o, samplerate,
406 if (PyErr_Occurred() == NULL) {
407 PyErr_SetString (PyExc_ValueError, "error running set_mel_coeffs_htk");
409 // change the RuntimeError into ValueError
410 PyObject *type, *value, *traceback;
411 PyErr_Fetch(&type, &value, &traceback);
412 PyErr_Restore(PyExc_ValueError, value, traceback);
420 Py_filterbank_set_coeffs (Py_filterbank * self, PyObject *args)
425 if (!PyArg_ParseTuple (args, "O", &input)) {
429 if (!PyAubio_ArrayToCFmat(input, &(self->coeffs))) {
433 err = aubio_filterbank_set_coeffs (self->o, &(self->coeffs));
436 PyErr_SetString (PyExc_ValueError,
437 "error when setting filter coefficients");
444 Py_filterbank_get_coeffs (Py_filterbank * self, PyObject *unused)
446 return (PyObject *)PyAubio_CFmatToArray(
447 aubio_filterbank_get_coeffs (self->o) );
451 Py_filterbank_set_power(Py_filterbank *self, PyObject *args)
455 if (!PyArg_ParseTuple (args, AUBIO_NPY_SMPL_CHR, &power)) {
458 if(aubio_filterbank_set_power (self->o, power)) {
459 if (PyErr_Occurred() == NULL) {
460 PyErr_SetString (PyExc_ValueError,
461 "error running filterbank.set_power");
463 // change the RuntimeError into ValueError
464 PyObject *type, *value, *traceback;
465 PyErr_Fetch(&type, &value, &traceback);
466 PyErr_Restore(PyExc_ValueError, value, traceback);
474 Py_filterbank_get_power (Py_filterbank * self, PyObject *unused)
476 smpl_t power = aubio_filterbank_get_power(self->o);
477 return (PyObject *)PyFloat_FromDouble (power);
481 Py_filterbank_set_norm(Py_filterbank *self, PyObject *args)
485 if (!PyArg_ParseTuple (args, AUBIO_NPY_SMPL_CHR, &norm)) {
488 if(aubio_filterbank_set_norm (self->o, norm)) {
489 if (PyErr_Occurred() == NULL) {
490 PyErr_SetString (PyExc_ValueError,
491 "error running filterbank.set_power");
493 // change the RuntimeError into ValueError
494 PyObject *type, *value, *traceback;
495 PyErr_Fetch(&type, &value, &traceback);
496 PyErr_Restore(PyExc_ValueError, value, traceback);
504 Py_filterbank_get_norm (Py_filterbank * self, PyObject *unused)
506 smpl_t norm = aubio_filterbank_get_norm(self->o);
507 return (PyObject *)PyFloat_FromDouble (norm);
510 static PyMethodDef Py_filterbank_methods[] = {
511 {"set_triangle_bands", (PyCFunction) Py_filterbank_set_triangle_bands,
512 METH_VARARGS, Py_filterbank_set_triangle_bands_doc},
513 {"set_mel_coeffs_slaney", (PyCFunction) Py_filterbank_set_mel_coeffs_slaney,
514 METH_VARARGS, Py_filterbank_set_mel_coeffs_slaney_doc},
515 {"set_mel_coeffs", (PyCFunction) Py_filterbank_set_mel_coeffs,
516 METH_VARARGS, Py_filterbank_set_mel_coeffs_doc},
517 {"set_mel_coeffs_htk", (PyCFunction) Py_filterbank_set_mel_coeffs_htk,
518 METH_VARARGS, Py_filterbank_set_mel_coeffs_htk_doc},
519 {"get_coeffs", (PyCFunction) Py_filterbank_get_coeffs,
520 METH_NOARGS, Py_filterbank_get_coeffs_doc},
521 {"set_coeffs", (PyCFunction) Py_filterbank_set_coeffs,
522 METH_VARARGS, Py_filterbank_set_coeffs_doc},
523 {"set_power", (PyCFunction) Py_filterbank_set_power,
524 METH_VARARGS, Py_filterbank_set_power_doc},
525 {"get_power", (PyCFunction) Py_filterbank_get_power,
526 METH_NOARGS, Py_filterbank_get_power_doc},
527 {"set_norm", (PyCFunction) Py_filterbank_set_norm,
528 METH_VARARGS, Py_filterbank_set_norm_doc},
529 {"get_norm", (PyCFunction) Py_filterbank_get_norm,
530 METH_NOARGS, Py_filterbank_get_norm_doc},
534 PyTypeObject Py_filterbankType = {
535 PyVarObject_HEAD_INIT (NULL, 0)
537 sizeof (Py_filterbank),
539 (destructor) Py_filterbank_del,
549 (ternaryfunc)Py_filterbank_do,
562 Py_filterbank_methods,
563 Py_filterbank_members,
570 (initproc) Py_filterbank_init,