1 #include "aubio-types.h"
12 static char Py_filter_doc[] = "filter object";
15 Py_filter_new (PyTypeObject * type, PyObject * args, PyObject * kwds)
19 static char *kwlist[] = { "order", NULL };
21 if (!PyArg_ParseTupleAndKeywords (args, kwds, "|I", kwlist,
26 self = (Py_filter *) type->tp_alloc (type, 0);
36 } else if (order < 0) {
37 PyErr_SetString (PyExc_ValueError,
38 "can not use negative order");
42 return (PyObject *) self;
46 Py_filter_init (Py_filter * self, PyObject * args, PyObject * kwds)
48 self->o = new_aubio_filter (self->order);
49 if (self->o == NULL) {
52 self->out = new_fvec(Py_default_vector_length);
53 self->vec = (fvec_t *)malloc(sizeof(fvec_t));
58 Py_filter_del (Py_filter * self)
61 del_aubio_filter (self->o);
63 Py_TYPE(self)->tp_free ((PyObject *) self);
67 Py_filter_do(Py_filter * self, PyObject * args)
71 if (!PyArg_ParseTuple (args, "O:digital_filter.do", &input)) {
79 if (!PyAubio_ArrayToCFvec(input, self->vec)) {
83 // reallocate the output if needed
84 if (self->vec->length != self->out->length) {
86 self->out = new_fvec(self->vec->length);
88 // compute the function
89 aubio_filter_do_outplace (self->o, self->vec, self->out);
90 return PyAubio_CFvecToArray(self->out);
94 Py_filter_set_c_weighting (Py_filter * self, PyObject *args)
98 if (!PyArg_ParseTuple (args, "I", &samplerate)) {
102 err = aubio_filter_set_c_weighting (self->o, samplerate);
104 PyErr_SetString (PyExc_ValueError,
105 "error when setting filter to C-weighting");
112 Py_filter_set_a_weighting (Py_filter * self, PyObject *args)
116 if (!PyArg_ParseTuple (args, "I", &samplerate)) {
120 err = aubio_filter_set_a_weighting (self->o, samplerate);
122 PyErr_SetString (PyExc_ValueError,
123 "error when setting filter to A-weighting");
130 Py_filter_set_biquad(Py_filter * self, PyObject *args)
133 lsmp_t b0, b1, b2, a1, a2;
134 if (!PyArg_ParseTuple (args, "ddddd", &b0, &b1, &b2, &a1, &a2)) {
138 err = aubio_filter_set_biquad (self->o, b0, b1, b2, a1, a2);
140 PyErr_SetString (PyExc_ValueError,
141 "error when setting filter with biquad coefficients");
147 static PyMemberDef Py_filter_members[] = {
148 // TODO remove READONLY flag and define getter/setter
149 {"order", T_INT, offsetof (Py_filter, order), READONLY,
150 "order of the filter"},
151 {NULL} /* Sentinel */
154 static PyMethodDef Py_filter_methods[] = {
155 {"set_c_weighting", (PyCFunction) Py_filter_set_c_weighting, METH_VARARGS,
156 "set filter coefficients to C-weighting"},
157 {"set_a_weighting", (PyCFunction) Py_filter_set_a_weighting, METH_VARARGS,
158 "set filter coefficients to A-weighting"},
159 {"set_biquad", (PyCFunction) Py_filter_set_biquad, METH_VARARGS,
160 "set b0, b1, b2, a1, a2 biquad coefficients"},
164 PyTypeObject Py_filterType = {
165 PyVarObject_HEAD_INIT(NULL, 0)
166 "aubio.digital_filter", /* tp_name */
167 sizeof (Py_filter), /* tp_basicsize */
169 (destructor) Py_filter_del, /* tp_dealloc */
174 0, //(reprfunc) Py_filter_repr, /* tp_repr */
175 0, /* tp_as_number */
176 0, /* tp_as_sequence */
177 0, /* tp_as_mapping */
179 (ternaryfunc)Py_filter_do, /* tp_call */
183 0, /* tp_as_buffer */
184 Py_TPFLAGS_DEFAULT, /* tp_flags */
185 Py_filter_doc, /* tp_doc */
188 0, /* tp_richcompare */
189 0, /* tp_weaklistoffset */
192 Py_filter_methods, /* tp_methods */
193 Py_filter_members, /* tp_members */
197 0, /* tp_descr_get */
198 0, /* tp_descr_set */
199 0, /* tp_dictoffset */
200 (initproc) Py_filter_init, /* tp_init */
202 Py_filter_new, /* tp_new */