1 #include "aubio-types.h"
13 static char Py_filter_doc[] = "filter object";
16 Py_filter_new (PyTypeObject * type, PyObject * args, PyObject * kwds)
20 static char *kwlist[] = { "order", NULL };
22 if (!PyArg_ParseTupleAndKeywords (args, kwds, "|I", kwlist,
27 self = (Py_filter *) type->tp_alloc (type, 0);
37 } else if (order < 0) {
38 PyErr_SetString (PyExc_ValueError,
39 "can not use negative order");
43 return (PyObject *) self;
47 Py_filter_init (Py_filter * self, PyObject * args, PyObject * kwds)
49 self->o = new_aubio_filter (self->order);
50 if (self->o == NULL) {
58 Py_filter_del (Py_filter * self)
60 Py_XDECREF(self->out);
61 del_aubio_filter (self->o);
62 Py_TYPE(self)->tp_free ((PyObject *) self);
66 Py_filter_do(Py_filter * self, PyObject * args)
70 if (!PyArg_ParseTuple (args, "O:digital_filter.do", &input)) {
78 if (!PyAubio_ArrayToCFvec(input, &(self->vec))) {
82 // initialize output now
83 if (self->out == NULL) {
84 self->out = new_py_fvec(self->vec.length);
88 if (!PyAubio_ArrayToCFvec(self->out, &(self->c_out)) ) {
91 // compute the function
92 aubio_filter_do_outplace (self->o, &(self->vec), &(self->c_out));
97 Py_filter_set_c_weighting (Py_filter * self, PyObject *args)
101 if (!PyArg_ParseTuple (args, "I", &samplerate)) {
105 err = aubio_filter_set_c_weighting (self->o, samplerate);
107 PyErr_SetString (PyExc_ValueError,
108 "error when setting filter to C-weighting");
115 Py_filter_set_a_weighting (Py_filter * self, PyObject *args)
119 if (!PyArg_ParseTuple (args, "I", &samplerate)) {
123 err = aubio_filter_set_a_weighting (self->o, samplerate);
125 PyErr_SetString (PyExc_ValueError,
126 "error when setting filter to A-weighting");
133 Py_filter_set_biquad(Py_filter * self, PyObject *args)
136 lsmp_t b0, b1, b2, a1, a2;
137 if (!PyArg_ParseTuple (args, "ddddd", &b0, &b1, &b2, &a1, &a2)) {
141 err = aubio_filter_set_biquad (self->o, b0, b1, b2, a1, a2);
143 PyErr_SetString (PyExc_ValueError,
144 "error when setting filter with biquad coefficients");
150 static PyMemberDef Py_filter_members[] = {
151 // TODO remove READONLY flag and define getter/setter
152 {"order", T_INT, offsetof (Py_filter, order), READONLY,
153 "order of the filter"},
154 {NULL} /* Sentinel */
157 static PyMethodDef Py_filter_methods[] = {
158 {"set_c_weighting", (PyCFunction) Py_filter_set_c_weighting, METH_VARARGS,
159 "set filter coefficients to C-weighting"},
160 {"set_a_weighting", (PyCFunction) Py_filter_set_a_weighting, METH_VARARGS,
161 "set filter coefficients to A-weighting"},
162 {"set_biquad", (PyCFunction) Py_filter_set_biquad, METH_VARARGS,
163 "set b0, b1, b2, a1, a2 biquad coefficients"},
167 PyTypeObject Py_filterType = {
168 PyVarObject_HEAD_INIT(NULL, 0)
169 "aubio.digital_filter", /* tp_name */
170 sizeof (Py_filter), /* tp_basicsize */
172 (destructor) Py_filter_del, /* tp_dealloc */
177 0, //(reprfunc) Py_filter_repr, /* tp_repr */
178 0, /* tp_as_number */
179 0, /* tp_as_sequence */
180 0, /* tp_as_mapping */
182 (ternaryfunc)Py_filter_do, /* tp_call */
186 0, /* tp_as_buffer */
187 Py_TPFLAGS_DEFAULT, /* tp_flags */
188 Py_filter_doc, /* tp_doc */
191 0, /* tp_richcompare */
192 0, /* tp_weaklistoffset */
195 Py_filter_methods, /* tp_methods */
196 Py_filter_members, /* tp_members */
200 0, /* tp_descr_get */
201 0, /* tp_descr_set */
202 0, /* tp_dictoffset */
203 (initproc) Py_filter_init, /* tp_init */
205 Py_filter_new, /* tp_new */