src/mathutils.c: change zero crossing function to split at >=0/<0; tests/python/src...
authorPaul Brossier <piem@piem.org>
Thu, 15 May 2008 22:50:38 +0000 (00:50 +0200)
committerPaul Brossier <piem@piem.org>
Thu, 15 May 2008 22:50:38 +0000 (00:50 +0200)
src/mathutils.c
tests/python/src/temporal/zero_crossing_rate.py [new file with mode: 0644]

index 1ecb2fd65731ac95196fd1d3d4c2e452d4f120c6..5a6e9baca06e03b3d8fa59c707c368e0a4a98c0c 100644 (file)
@@ -419,14 +419,18 @@ smpl_t aubio_zero_crossing_rate(fvec_t * input) {
   uint_t i=0,j;
   uint_t zcr = 0;
   for ( j = 1; j < input->length; j++ ) {
-    // previous was negative
-    if( input->data[i][j-1] <= 0. ) {
-      if ( input->data[i][j] > 0. ) {
+    // previous was strictly negative
+    if( input->data[i][j-1] < 0. ) {
+      // current is positive or null
+      if ( input->data[i][j] >= 0. ) {
+        zcr += 1;
+      }
+    // previous was positive or null
+    } else {
+      // current is strictly negative
+      if ( input->data[i][j] < 0. ) {
         zcr += 1;
       }
-    //previous was positive
-    } else if ( input->data[i][j] <= 0. ) {
-      zcr += 1;
     }
   }
   return zcr/(smpl_t)input->length;
diff --git a/tests/python/src/temporal/zero_crossing_rate.py b/tests/python/src/temporal/zero_crossing_rate.py
new file mode 100644 (file)
index 0000000..1693241
--- /dev/null
@@ -0,0 +1,54 @@
+import unittest
+
+from aubio.aubiowrapper import *
+
+buf_size = 2048
+channels = 1
+
+class zero_crossing_rate_unit(unittest.TestCase):
+
+  def setUp(self):
+    self.vector = new_fvec(buf_size, channels)
+
+  def tearDown(self):
+    del_fvec(self.vector)
+
+  def test(self):
+    """ create and delete fvec """
+    pass
+
+  def test_zeroes(self):
+    """ check zero crossing rate on a buffer of 0. """
+    self.assertEqual(0., aubio_zero_crossing_rate(self.vector))
+
+  def test_ones(self):
+    """ check zero crossing rate on a buffer of 1. """
+    for index in range(buf_size):
+      for channel in range(channels):
+        fvec_write_sample(self.vector, 1., channel, index)
+    self.assertEqual(0., aubio_zero_crossing_rate(self.vector))
+
+  def test_impulse(self):
+    """ check zero crossing rate on a buffer with an impulse """
+    fvec_write_sample(self.vector, 1., 0, buf_size / 2)
+    self.assertEqual(0., aubio_zero_crossing_rate(self.vector))
+
+  def test_negative_impulse(self):
+    """ check zero crossing rate on a buffer with a negative impulse """
+    fvec_write_sample(self.vector, -1., 0, buf_size / 2)
+    self.assertEqual(2./buf_size, aubio_zero_crossing_rate(self.vector))
+
+  def test_single(self):
+    """ check zero crossing rate on single crossing """
+    fvec_write_sample(self.vector, +1., 0, buf_size / 2 - 1)
+    fvec_write_sample(self.vector, -1., 0, buf_size / 2)
+    self.assertEqual(2./buf_size, aubio_zero_crossing_rate(self.vector))
+
+  def test_single_with_gap(self):
+    """ check zero crossing rate on single crossing with a gap"""
+    fvec_write_sample(self.vector, +1., 0, buf_size / 2 - 2)
+    fvec_write_sample(self.vector, -1., 0, buf_size / 2)
+    self.assertEqual(2./buf_size, aubio_zero_crossing_rate(self.vector))
+
+if __name__ == '__main__':
+  unittest.main()