ref: 9b23eb311431d5862a5920b69082cca1a93bcb8e
parent: 998a8be252569cf32c8f371ec188e34892827b91
author: Paul Brossier <piem@piem.org>
date: Mon Oct 5 22:49:53 EDT 2009
interfaces/python: add cvec and filter types
--- /dev/null
+++ b/interfaces/python/a_weighting_test_simple.expected
@@ -1,0 +1,2 @@
+ 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 5.00000000e-01 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00
+ 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.27870563e-01 2.58244342e-01 1.18719361e-01 -4.02623805e-02 -5.61812129e-02 -5.24739734e-02 -4.72329276e-02 -4.23394349e-02 -3.79219586e-02 -3.39473148e-02 -3.03724479e-02 -2.71574847e-02 -2.42664433e-02 -2.16669285e-02 -1.93297810e-02 -1.72287543e-02 -1.53402241e-02 -1.36429261e-02 -1.21177207e-02 -1.07473802e-02
--- a/interfaces/python/aubio-types.h
+++ b/interfaces/python/aubio-types.h
@@ -4,9 +4,11 @@
#include <numpy/arrayobject.h>
#include <aubio.h>
-#define Py_fvec_default_length 1024
-#define Py_fvec_default_channels 1
+#define Py_default_vector_length 1024
+#define Py_default_vector_channels 1
+#define Py_aubio_default_samplerate 44100
+
#ifdef HAVE_AUBIO_DOUBLE
#define AUBIO_FLOAT NPY_FLOAT
#else
@@ -24,11 +26,16 @@
typedef struct
{
- PyObject_HEAD fvec_t * o;
+ PyObject_HEAD
+ fvec_t * o;
uint_t length;
uint_t channels;
} Py_fvec;
extern PyTypeObject Py_fvecType;
+
+extern PyTypeObject Py_cvecType;
+
+extern PyTypeObject Py_filterType;
extern PyObject *PyAubio_FvecToArray (Py_fvec * self);
--- a/interfaces/python/aubiomodule.c
+++ b/interfaces/python/aubiomodule.c
@@ -96,15 +96,12 @@
// since this function does not return, we could return None
//return Py_None;
// however it is convenient to return the modified vector
- //return (PyObject *) PyAubio_FvecToArray(vec);
+ return (PyObject *) PyAubio_FvecToArray(vec);
// or even without converting it back to an array
- Py_INCREF(vec);
- return (PyObject *)vec;
+ //Py_INCREF(vec);
+ //return (PyObject *)vec;
}
-
-
-
static PyMethodDef aubio_methods[] = {
{"alpha_norm", Py_alpha_norm, METH_VARARGS, Py_alpha_norm_doc},
{"zero_crossing_rate", Py_zero_crossing_rate, METH_VARARGS,
@@ -121,7 +118,9 @@
PyObject *m;
int err;
- if (PyType_Ready (&Py_fvecType) < 0) {
+ if ((PyType_Ready (&Py_fvecType) < 0) ||
+ (PyType_Ready (&Py_cvecType) < 0) ||
+ (PyType_Ready (&Py_filterType) < 0)) {
return;
}
@@ -140,4 +139,8 @@
Py_INCREF (&Py_fvecType);
PyModule_AddObject (m, "fvec", (PyObject *) & Py_fvecType);
+ Py_INCREF (&Py_cvecType);
+ PyModule_AddObject (m, "cvec", (PyObject *) & Py_cvecType);
+ Py_INCREF (&Py_filterType);
+ PyModule_AddObject (m, "digital_filter", (PyObject *) & Py_filterType);
}
--- /dev/null
+++ b/interfaces/python/c_weighting_test_simple.expected
@@ -1,0 +1,2 @@
+ 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 5.00000000e-01 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00
+ 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.08504281e-01 2.31621372e-01 1.38614617e-01 1.58040475e-02 -9.84900252e-04 -2.72686896e-03 -2.87772967e-03 -2.87932142e-03 -2.86783482e-03 -2.85529016e-03 -2.84270413e-03 -2.83016008e-03 -2.81766458e-03 -2.80521796e-03 -2.79282009e-03 -2.78047079e-03 -2.76816989e-03 -2.75591721e-03 -2.74371257e-03 -2.73155579e-03
--- a/interfaces/python/py-fvec.c
+++ b/interfaces/python/py-fvec.c
@@ -27,8 +27,8 @@
self = (Py_fvec *) type->tp_alloc (type, 0);
- self->length = Py_fvec_default_length;
- self->channels = Py_fvec_default_channels;
+ self->length = Py_default_vector_length;
+ self->channels = Py_default_vector_channels;
if (self == NULL) {
return NULL;
@@ -50,7 +50,6 @@
return NULL;
}
-
return (PyObject *) self;
}
@@ -88,6 +87,7 @@
if (args == NULL) {
goto fail;
}
+ fvec_print ( self->o );
result = PyString_Format (format, args);
@@ -98,18 +98,15 @@
return result;
}
-static PyObject *
-Py_fvec_print (Py_fvec * self, PyObject * unused)
-{
- fvec_print (self->o);
- return Py_None;
-}
-
Py_fvec *
PyAubio_ArrayToFvec (PyObject *input) {
PyObject *array;
Py_fvec *vec;
uint_t i;
+ if (input == NULL) {
+ PyErr_SetString (PyExc_ValueError, "input array is not a python object");
+ goto fail;
+ }
// parsing input object into a Py_fvec
if (PyObject_TypeCheck (input, &Py_fvecType)) {
// input is an fvec, nothing else to do
@@ -266,8 +263,6 @@
};
static PyMethodDef Py_fvec_methods[] = {
- {"dump", (PyCFunction) Py_fvec_print, METH_NOARGS,
- "Dumps the contents of the vector to stdout."},
{"__array__", (PyCFunction) PyAubio_FvecToArray, METH_NOARGS,
"Returns the first channel as a numpy array."},
{NULL}
--- a/interfaces/python/setup.py
+++ b/interfaces/python/setup.py
@@ -3,7 +3,7 @@
setup(name="_aubio", version="1.0",
ext_modules = [
Extension("_aubio",
- ["aubiomodule.c", "py-fvec.c"],
+ ["aubiomodule.c", "py-fvec.c", "py-cvec.c", "py-filter.c"],
include_dirs=['../../build/default/src', '../../src' ],
library_dirs=['../../build/default/src', '../../src/.libs' ],
libraries=['aubio'])])
--- a/interfaces/python/test_aubio.py
+++ b/interfaces/python/test_aubio.py
@@ -1,12 +1,9 @@
from numpy.testing import TestCase, run_module_suite
-from numpy.testing import assert_equal as numpy_assert_equal
+from numpy.testing import assert_equal
from _aubio import *
from numpy import array
AUBIO_DO_CASTING = 0
-
-def assert_equal(a, b):
- numpy_assert_equal(array(a),array(b))
class aubiomodule_test_case(TestCase):
--- /dev/null
+++ b/interfaces/python/test_filter.py
@@ -1,0 +1,67 @@
+from numpy.testing import TestCase, run_module_suite
+from numpy.testing import assert_equal, assert_almost_equal
+from _aubio import *
+from numpy import array
+
+def array_from_text_file(filename, dtype = 'float'):
+ return array([line.split() for line in open(filename).readlines()],
+ dtype = dtype)
+
+class aubio_filter_test_case(TestCase):
+
+ def test_members(self):
+ f = digital_filter()
+ assert_equal ([f.channels, f.order, f.samplerate], [1, 7, 44100])
+ f = digital_filter(48000, 5, 2)
+ assert_equal ([f.channels, f.order, f.samplerate], [2, 5, 48000])
+ f(fvec())
+
+ def test_cweighting_error(self):
+ f = digital_filter (44100, 2, 1)
+ self.assertRaises ( ValueError, f.set_c_weighting )
+ f = digital_filter (44100, 8, 1)
+ self.assertRaises ( ValueError, f.set_c_weighting )
+ f = digital_filter (4000, 5, 1)
+ self.assertRaises ( ValueError, f.set_c_weighting )
+ f = digital_filter (193000, 5, 1)
+ self.assertRaises ( ValueError, f.set_c_weighting )
+ f = digital_filter (193000, 7, 1)
+ self.assertRaises ( ValueError, f.set_a_weighting )
+ f = digital_filter (192000, 5, 1)
+ self.assertRaises ( ValueError, f.set_a_weighting )
+
+ def test_c_weighting(self):
+ expected = array_from_text_file('c_weighting_test_simple.expected')
+ f = digital_filter(44100, 5, 1)
+ f.set_c_weighting()
+ v = fvec(32)
+ v[0][12] = .5
+ u = f(v)
+ assert_almost_equal (expected[1], u)
+
+ def test_a_weighting(self):
+ expected = array_from_text_file('a_weighting_test_simple.expected')
+ f = digital_filter(44100, 7, 1)
+ f.set_a_weighting()
+ v = fvec(32)
+ v[0][12] = .5
+ u = f(v)
+ assert_almost_equal (expected[1], u)
+
+ def test_a_weighting_parted(self):
+ expected = array_from_text_file('a_weighting_test_simple.expected')
+ f = digital_filter(44100, 7, 1)
+ f.set_a_weighting()
+ v = fvec(16)
+ v[0][12] = .5
+ u = f(v)
+ assert_almost_equal (expected[1][:16], u)
+ # one more time
+ v = fvec(16)
+ u = f(v)
+ assert_almost_equal (expected[1][16:], u)
+
+if __name__ == '__main__':
+ from unittest import main
+ main()
+