[tests] fix definition and add edge cases for rolloff spectral descriptor
authorPaul Brossier <piem@piem.org>
Sun, 16 Nov 2025 13:29:27 +0000 (14:29 +0100)
committerPaul Brossier <piem@piem.org>
Sun, 16 Nov 2025 13:29:27 +0000 (14:29 +0100)
python/tests/test_specdesc.py

index 32a46fe..09cb8b5 100755 (executable)
@@ -203,18 +203,42 @@ class aubio_specdesc(TestCase):
         decrease = sum((a[1:] - a [0]) / k[1:]) / sum(a[1:]) 
         assert_almost_equal (decrease, o(c), decimal = 5)
 
+    def get_rolloff (self, a):
+        cumsum = .95*sum(a*a)
+        i = 0; rollsum = 0
+        while rollsum < cumsum:
+            rollsum += a[i]*a[i]
+            i+=1
+        rolloff = max (0, i - 1)
+        return rolloff
+
     def test_rolloff(self):
         o = specdesc("rolloff")
         c = cvec()
         assert_equal( 0., o(c))
         a = arange(c.length * 2, 0, -2, dtype=float_type)
         c.norm = a
-        cumsum = .95*sum(a*a)
-        i = 0; rollsum = 0
-        while rollsum < cumsum:
-            rollsum += a[i]*a[i]
-            i+=1
-        rolloff = i 
+        rolloff = self.get_rolloff (a)
+        assert_equal (rolloff, o(c))
+
+    def test_rolloff2(self):
+        o = specdesc("rolloff", 8)
+        c = cvec(8)
+        assert_equal( 0., o(c))
+        a = zeros(c.length, dtype=float_type)
+        a[-1] = 1
+        c.norm = a
+        rolloff = self.get_rolloff (a)
+        assert_equal (rolloff, o(c))
+
+    def test_rolloff3(self):
+        o = specdesc("rolloff", 8)
+        c = cvec(8)
+        assert_equal( 0., o(c))
+        a = zeros(c.length, dtype=float_type)
+        a[0] = 1
+        c.norm = a
+        rolloff = self.get_rolloff (a)
         assert_equal (rolloff, o(c))
 
 class aubio_specdesc_wrong(TestCase):