1 from numpy.testing import TestCase, run_module_suite
2 from numpy.testing import assert_equal, assert_almost_equal
3 # WARNING: numpy also has an fft object
4 from _aubio import cvec, specdesc
5 from numpy import array, shape, arange, zeros, log
8 class aubio_specdesc(TestCase):
10 def test_members(self):
12 assert_equal ([o.buf_size, o.channels, o.method],
14 o = specdesc("complex", 512, 2)
15 assert_equal ([o.buf_size, o.channels, o.method],
21 assert_equal( 0., o(c))
22 a = arange(c.length, dtype='float32')
24 assert_equal (a, c.norm[0])
25 assert_equal ( sum(a*(a+1)), o(c))
27 def test_complex(self):
28 o = specdesc("complex")
30 assert_equal( 0., o(c))
31 a = arange(c.length, dtype='float32')
33 assert_equal (a, c.norm[0])
34 # the previous run was on zeros, so previous frames are still 0
35 # so we have sqrt ( abs ( r2 ^ 2) ) == r2
36 assert_equal ( sum(a), o(c))
37 # second time. c.norm = a, so, r1 = r2, and the euclidian distance is 0
38 assert_equal ( 0, o(c))
43 assert_equal( 0., o(c))
48 assert_equal( 0., o(c))
49 a = arange(c.length, dtype='float32')
51 assert_almost_equal( sum(a * log(1.+ a/1.e-10 ) ) / o(c), 1., decimal=6)
56 assert_equal( 0., o(c))
57 a = arange(c.length, dtype='float32')
59 assert_almost_equal( sum(log(1.+ a/1.e-10 ) ) / o(c), 1, decimal=6)
61 def test_specflux(self):
62 o = specdesc("specflux")
64 assert_equal( 0., o(c))
65 a = arange(c.length, dtype='float32')
67 assert_equal( sum(a), o(c))
68 assert_equal( 0, o(c))
69 c.norm = zeros(c.length, dtype='float32')
70 assert_equal( 0, o(c))
72 def test_centroid(self):
73 o = specdesc("centroid")
75 # make sure centroid of zeros is zero
76 assert_equal( 0., o(c))
77 a = arange(c.length, dtype='float32')
79 centroid = sum(a*a) / sum(a)
80 assert_almost_equal (centroid, o(c), decimal = 2)
83 assert_almost_equal (centroid, o(c), decimal = 2)
85 def test_spread(self):
86 o = specdesc("spread")
88 assert_equal( 0., o(c))
89 a = arange(c.length, dtype='float32')
91 centroid = sum(a*a) / sum(a)
92 spread = sum( (a - centroid)**2 *a) / sum(a)
93 assert_almost_equal (spread, o(c), decimal = 2)
96 assert_almost_equal (spread, o(c), decimal = 2)
98 def test_skewness(self):
99 o = specdesc("skewness")
101 assert_equal( 0., o(c))
102 a = arange(c.length, dtype='float32')
104 centroid = sum(a*a) / sum(a)
105 spread = sum( (a - centroid)**2 *a) / sum(a)
106 skewness = sum( (a - centroid)**3 *a) / sum(a) / spread **1.5
107 assert_almost_equal (skewness, o(c), decimal = 2)
110 assert_almost_equal (skewness, o(c), decimal = 2)
112 def test_kurtosis(self):
113 o = specdesc("kurtosis")
115 assert_equal( 0., o(c))
116 a = arange(c.length, dtype='float32')
118 centroid = sum(a*a) / sum(a)
119 spread = sum( (a - centroid)**2 *a) / sum(a)
120 kurtosis = sum( (a - centroid)**4 *a) / sum(a) / spread **2
121 assert_almost_equal (kurtosis, o(c), decimal = 2)
123 def test_slope(self):
124 o = specdesc("slope")
126 assert_equal( 0., o(c))
127 a = arange(c.length * 2, 0, -2, dtype='float32')
128 k = arange(c.length, dtype='float32')
130 num = len(a) * sum(k*a) - sum(k)*sum(a)
131 den = (len(a) * sum(k**2) - sum(k)**2)
132 slope = num/den/sum(a)
133 assert_almost_equal (slope, o(c), decimal = 5)
135 a = arange(0, c.length * 2, +2, dtype='float32')
137 num = len(a) * sum(k*a) - sum(k)*sum(a)
138 den = (len(a) * sum(k**2) - sum(k)**2)
139 slope = num/den/sum(a)
140 assert_almost_equal (slope, o(c), decimal = 5)
142 a = arange(0, c.length * 2, +2, dtype='float32')
144 assert_almost_equal (slope, o(c), decimal = 5)
146 def test_decrease(self):
147 o = specdesc("decrease")
149 assert_equal( 0., o(c))
150 a = arange(c.length * 2, 0, -2, dtype='float32')
151 k = arange(c.length, dtype='float32')
153 decrease = sum((a[1:] - a [0]) / k[1:]) / sum(a[1:])
154 assert_almost_equal (decrease, o(c), decimal = 5)
156 a = arange(0, c.length * 2, +2, dtype='float32')
158 decrease = sum((a[1:] - a [0]) / k[1:]) / sum(a[1:])
159 assert_almost_equal (decrease, o(c), decimal = 5)
161 a = arange(0, c.length * 2, +2, dtype='float32')
163 decrease = sum((a[1:] - a [0]) / k[1:]) / sum(a[1:])
164 assert_almost_equal (decrease, o(c), decimal = 5)
166 def test_rolloff(self):
167 o = specdesc("rolloff")
169 assert_equal( 0., o(c))
170 a = arange(c.length * 2, 0, -2, dtype='float32')
171 k = arange(c.length, dtype='float32')
173 cumsum = .95*sum(a*a)
175 while rollsum < cumsum:
179 assert_equal (rolloff, o(c))
181 if __name__ == '__main__':
182 from unittest import main