3 from numpy.testing import TestCase, assert_equal, assert_almost_equal
4 from numpy import random, arange, log, zeros
5 from aubio import specdesc, cvec, float_type
26 class aubio_specdesc(TestCase):
28 def test_members(self):
31 for method in methods:
32 o = specdesc(method, buf_size)
33 assert_equal ([o.buf_size, o.method], [buf_size, method])
38 #print "%20s" % method, str(o(spec))
40 spec.norm = random.random_sample((len(spec.norm),)).astype(float_type)
41 spec.phas = random.random_sample((len(spec.phas),)).astype(float_type)
42 #print "%20s" % method, str(o(spec))
43 assert (o(spec) != 0.)
46 o = specdesc("hfc", buf_size)
48 # hfc of zeros is zero
49 assert_equal (o(spec), 0.)
50 # hfc of ones is sum of all bin numbers
52 expected = sum(range(buf_size/2 + 2))
53 assert_equal (o(spec), expected)
54 # changing phase doesn't change anything
56 assert_equal (o(spec), sum(range(buf_size/2 + 2)))
59 o = specdesc("phase", buf_size)
61 # phase of zeros is zero
62 assert_equal (o(spec), 0.)
63 spec.phas = random.random_sample((len(spec.phas),)).astype(float_type)
64 # phase of random is not zero
66 assert (o(spec) != 0.)
68 def test_specdiff(self):
69 o = specdesc("phase", buf_size)
71 # specdiff of zeros is zero
72 assert_equal (o(spec), 0.)
73 spec.phas = random.random_sample((len(spec.phas),)).astype(float_type)
74 # phase of random is not zero
76 assert (o(spec) != 0.)
81 assert_equal( 0., o(c))
82 a = arange(c.length, dtype=float_type)
84 assert_equal (a, c.norm)
85 assert_equal ( sum(a*(a+1)), o(c))
87 def test_complex(self):
88 o = specdesc("complex")
90 assert_equal( 0., o(c))
91 a = arange(c.length, dtype=float_type)
93 assert_equal (a, c.norm)
94 # the previous run was on zeros, so previous frames are still 0
95 # so we have sqrt ( abs ( r2 ^ 2) ) == r2
96 assert_equal ( sum(a), o(c))
97 # second time. c.norm = a, so, r1 = r2, and the euclidian distance is 0
98 assert_equal ( 0, o(c))
103 assert_equal( 0., o(c))
104 a = arange(c.length, dtype=float_type)
106 assert_almost_equal( sum(a * log(1.+ a/1.e-1 ) ) / o(c), 1., decimal=6)
111 assert_equal( 0., o(c))
112 a = arange(c.length, dtype=float_type)
114 assert_almost_equal( sum(log(1.+ a/1.e-1 ) ) / o(c), 1, decimal=6)
116 def test_specflux(self):
117 o = specdesc("specflux")
119 assert_equal( 0., o(c))
120 a = arange(c.length, dtype=float_type)
122 assert_equal( sum(a), o(c))
123 assert_equal( 0, o(c))
124 c.norm = zeros(c.length, dtype=float_type)
125 assert_equal( 0, o(c))
127 def test_centroid(self):
128 o = specdesc("centroid")
130 # make sure centroid of zeros is zero
131 assert_equal( 0., o(c))
132 a = arange(c.length, dtype=float_type)
134 centroid = sum(a*a) / sum(a)
135 assert_almost_equal (centroid, o(c), decimal = 2)
138 assert_almost_equal (centroid, o(c), decimal = 2)
140 def test_spread(self):
141 o = specdesc("spread")
143 ramp = arange(c.length, dtype=float_type)
144 assert_equal( 0., o(c))
148 centroid = sum(a*a) / sum(a)
149 spread = sum( a * pow(ramp - centroid, 2.) ) / sum(a)
150 assert_almost_equal (o(c), spread, decimal = 1)
152 def test_skewness(self):
153 o = specdesc("skewness")
155 assert_equal( 0., o(c))
156 a = arange(c.length, dtype=float_type)
158 centroid = sum(a*a) / sum(a)
159 spread = sum( (a - centroid)**2 *a) / sum(a)
160 skewness = sum( (a - centroid)**3 *a) / sum(a) / spread **1.5
161 assert_almost_equal (skewness, o(c), decimal = 2)
164 assert_almost_equal (skewness, o(c), decimal = 2)
166 def test_kurtosis(self):
167 o = specdesc("kurtosis")
169 assert_equal( 0., o(c))
170 a = arange(c.length, dtype=float_type)
172 centroid = sum(a*a) / sum(a)
173 spread = sum( (a - centroid)**2 *a) / sum(a)
174 kurtosis = sum( (a - centroid)**4 *a) / sum(a) / spread **2
175 assert_almost_equal (kurtosis, o(c), decimal = 2)
177 def test_slope(self):
178 o = specdesc("slope")
180 assert_equal( 0., o(c))
181 a = arange(c.length * 2, 0, -2, dtype=float_type)
182 k = arange(c.length, dtype=float_type)
184 num = len(a) * sum(k*a) - sum(k)*sum(a)
185 den = (len(a) * sum(k**2) - sum(k)**2)
186 slope = num/den/sum(a)
187 assert_almost_equal (slope, o(c), decimal = 5)
189 a = arange(0, c.length * 2, +2, dtype=float_type)
191 num = len(a) * sum(k*a) - sum(k)*sum(a)
192 den = (len(a) * sum(k**2) - sum(k)**2)
193 slope = num/den/sum(a)
194 assert_almost_equal (slope, o(c), decimal = 5)
196 a = arange(0, c.length * 2, +2, dtype=float_type)
198 assert_almost_equal (slope, o(c), decimal = 5)
200 def test_decrease(self):
201 o = specdesc("decrease")
203 assert_equal( 0., o(c))
204 a = arange(c.length * 2, 0, -2, dtype=float_type)
205 k = arange(c.length, dtype=float_type)
207 decrease = sum((a[1:] - a [0]) / k[1:]) / sum(a[1:])
208 assert_almost_equal (decrease, o(c), decimal = 5)
210 a = arange(0, c.length * 2, +2, dtype=float_type)
212 decrease = sum((a[1:] - a [0]) / k[1:]) / sum(a[1:])
213 assert_almost_equal (decrease, o(c), decimal = 5)
215 a = arange(0, c.length * 2, +2, dtype=float_type)
217 decrease = sum((a[1:] - a [0]) / k[1:]) / sum(a[1:])
218 assert_almost_equal (decrease, o(c), decimal = 5)
220 def test_rolloff(self):
221 o = specdesc("rolloff")
223 assert_equal( 0., o(c))
224 a = arange(c.length * 2, 0, -2, dtype=float_type)
225 k = arange(c.length, dtype=float_type)
227 cumsum = .95*sum(a*a)
229 while rollsum < cumsum:
233 assert_equal (rolloff, o(c))
235 class aubio_specdesc_wrong(TestCase):
237 def test_negative(self):
238 with self.assertRaises(ValueError):
239 o = specdesc("default", -10)
241 def test_unknown(self):
243 with self.assertRaises(ValueError):
244 o = specdesc("unknown", 512)
245 self.skipTest('todo: new_specdesc should fail on wrong method')
247 if __name__ == '__main__':
248 from unittest import main