1 #include "aubio-types.h"
3 static char Py_filterbank_doc[] = "filterbank object";
8 aubio_filterbank_t * o;
18 Py_filterbank_new (PyTypeObject * type, PyObject * args, PyObject * kwds)
20 int win_s = 0, n_filters = 0;
22 static char *kwlist[] = { "n_filters", "win_s", NULL };
24 if (!PyArg_ParseTupleAndKeywords (args, kwds, "|II", kwlist,
25 &n_filters, &win_s)) {
29 self = (Py_filterbank *) type->tp_alloc (type, 0);
35 self->win_s = Py_default_vector_length;
38 } else if (win_s < 0) {
39 PyErr_SetString (PyExc_ValueError,
40 "can not use negative window size");
46 self->n_filters = n_filters;
47 } else if (n_filters < 0) {
48 PyErr_SetString (PyExc_ValueError,
49 "can not use negative number of filters");
53 return (PyObject *) self;
57 Py_filterbank_init (Py_filterbank * self, PyObject * args, PyObject * kwds)
59 self->o = new_aubio_filterbank (self->n_filters, self->win_s);
60 if (self->o == NULL) {
62 sprintf(errstr, "error creating filterbank with n_filters=%d, win_s=%d",
63 self->n_filters, self->win_s);
64 PyErr_SetString (PyExc_RuntimeError, errstr);
67 self->out = new_fvec(self->n_filters);
69 self->vec = (cvec_t *)malloc(sizeof(cvec_t));
71 self->freqs = (fvec_t *)malloc(sizeof(fvec_t));
73 self->coeffs = (fmat_t *)malloc(sizeof(fmat_t));
74 self->coeffs->data = (smpl_t **)malloc(sizeof(smpl_t*) * self->n_filters);
75 self->coeffs->height = self->n_filters;
81 Py_filterbank_del (Py_filterbank *self, PyObject *unused)
83 del_aubio_filterbank(self->o);
87 free(self->coeffs->data);
89 Py_TYPE(self)->tp_free((PyObject *) self);
93 Py_filterbank_do(Py_filterbank * self, PyObject * args)
97 if (!PyArg_ParseTuple (args, "O", &input)) {
101 if (!PyAubio_ArrayToCCvec(input, self->vec)) {
105 // compute the function
106 aubio_filterbank_do (self->o, self->vec, self->out);
107 return (PyObject *)PyAubio_CFvecToArray(self->out);
110 static PyMemberDef Py_filterbank_members[] = {
111 {"win_s", T_INT, offsetof (Py_filterbank, win_s), READONLY,
112 "size of the window"},
113 {"n_filters", T_INT, offsetof (Py_filterbank, n_filters), READONLY,
114 "number of filters"},
115 {NULL} /* sentinel */
119 Py_filterbank_set_triangle_bands (Py_filterbank * self, PyObject *args)
125 if (!PyArg_ParseTuple (args, "OI", &input, &samplerate)) {
133 if (!PyAubio_ArrayToCFvec(input, self->freqs)) {
137 err = aubio_filterbank_set_triangle_bands (self->o,
138 self->freqs, samplerate);
140 PyErr_SetString (PyExc_ValueError,
141 "error when setting filter to A-weighting");
148 Py_filterbank_set_mel_coeffs_slaney (Py_filterbank * self, PyObject *args)
153 if (!PyArg_ParseTuple (args, "I", &samplerate)) {
157 err = aubio_filterbank_set_mel_coeffs_slaney (self->o, samplerate);
159 PyErr_SetString (PyExc_ValueError,
160 "error when setting filter to A-weighting");
167 Py_filterbank_set_coeffs (Py_filterbank * self, PyObject *args)
172 if (!PyArg_ParseTuple (args, "O", &input)) {
176 if (!PyAubio_ArrayToCFmat(input, self->coeffs)) {
180 err = aubio_filterbank_set_coeffs (self->o, self->coeffs);
183 PyErr_SetString (PyExc_ValueError,
184 "error when setting filter coefficients");
191 Py_filterbank_get_coeffs (Py_filterbank * self, PyObject *unused)
193 return (PyObject *)PyAubio_CFmatToArray(
194 aubio_filterbank_get_coeffs (self->o) );
197 static PyMethodDef Py_filterbank_methods[] = {
198 {"set_triangle_bands", (PyCFunction) Py_filterbank_set_triangle_bands,
199 METH_VARARGS, "set coefficients of filterbanks"},
200 {"set_mel_coeffs_slaney", (PyCFunction) Py_filterbank_set_mel_coeffs_slaney,
201 METH_VARARGS, "set coefficients of filterbank as in Auditory Toolbox"},
202 {"get_coeffs", (PyCFunction) Py_filterbank_get_coeffs,
203 METH_NOARGS, "get coefficients of filterbank"},
204 {"set_coeffs", (PyCFunction) Py_filterbank_set_coeffs,
205 METH_VARARGS, "set coefficients of filterbank"},
209 PyTypeObject Py_filterbankType = {
210 PyVarObject_HEAD_INIT (NULL, 0)
212 sizeof (Py_filterbank),
214 (destructor) Py_filterbank_del,
224 (ternaryfunc)Py_filterbank_do,
237 Py_filterbank_methods,
238 Py_filterbank_members,
245 (initproc) Py_filterbank_init,