{"zero_crossing_rate", Py_zero_crossing_rate, METH_VARARGS, Py_zero_crossing_rate_doc},
{"min_removal", Py_min_removal, METH_VARARGS, Py_min_removal_doc},
{"level_lin", Py_aubio_level_lin, METH_VARARGS, Py_aubio_level_lin_doc},
+ {"db_spl", Py_aubio_db_spl, METH_VARARGS, Py_aubio_db_spl_doc},
{"window", Py_aubio_window, METH_VARARGS, Py_aubio_window_doc},
{NULL, NULL} /* Sentinel */
};
return level_lin;
}
+
+PyObject *
+Py_aubio_db_spl(PyObject *self, PyObject *args)
+{
+ PyObject *input;
+ fvec_t *vec;
+ PyObject *db_spl;
+
+ if (!PyArg_ParseTuple (args, "O:db_spl", &input)) {
+ PyErr_SetString (PyExc_ValueError, "failed parsing arguments");
+ return NULL;
+ }
+
+ if (input == NULL) {
+ return NULL;
+ }
+
+ vec = PyAubio_ArrayToCFvec (input);
+ if (vec == NULL) {
+ return NULL;
+ }
+
+ db_spl = Py_BuildValue("f", aubio_db_spl(vec));
+ if (db_spl == NULL) {
+ PyErr_SetString (PyExc_ValueError, "failed computing db_spl");
+ return NULL;
+ }
+
+ return db_spl;
+}
from numpy import cos, arange
from math import pi
-from aubio import window, level_lin
+from aubio import window, level_lin, db_spl
from aubio import fvec
from numpy import ones
assert_equal(level_lin(-ones(1024, dtype="float32")), 1.)
+class aubio_db_spl(TestCase):
+ def test_accept_fvec(self):
+ db_spl(fvec(1024))
+
+ def test_fail_not_fvec(self):
+ try:
+ db_spl("default")
+ except ValueError, e:
+ pass
+ else:
+ self.fail('non-number input phase does not raise a TypeError')
+
+ def test_zeros_is_inf(self):
+ from math import isinf
+ assert isinf(db_spl(fvec(1024)))
+
+ def test_minus_ones_is_zero(self):
+ from numpy import ones
+ assert_equal(db_spl(-ones(1024, dtype="float32")), 0.)
+
if __name__ == '__main__':
from unittest import main
main()