ref: 7e204d01af966224f8823e68d5cc4eb114e9f3e0
parent: cf2f1b84fa847dc80ecac111730e0aef480dae74
author: Paul Brossier <piem@piem.org>
date: Thu May 15 20:50:38 EDT 2008
src/mathutils.c: change zero crossing function to split at >=0/<0; tests/python/src/temporal/zero_crossing_rate.py: add some tests for zero crossing
--- a/src/mathutils.c
+++ b/src/mathutils.c
@@ -419,14 +419,18 @@
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
- } else 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;
+ }
}
}
return zcr/(smpl_t)input->length;
--- /dev/null
+++ b/tests/python/src/temporal/zero_crossing_rate.py
@@ -1,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()