3 from unittest import main
4 from numpy.testing import TestCase, assert_equal, assert_almost_equal
5 from numpy import random, arange, log, zeros
6 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("phase", buf_size)
48 # phase of zeros is zero
49 assert_equal (o(spec), 0.)
50 spec.phas = random.random_sample((len(spec.phas),)).astype(float_type)
51 # phase of random is not zero
53 assert (o(spec) != 0.)
55 def test_specdiff(self):
56 o = specdesc("phase", buf_size)
58 # specdiff of zeros is zero
59 assert_equal (o(spec), 0.)
60 spec.phas = random.random_sample((len(spec.phas),)).astype(float_type)
61 # phase of random is not zero
63 assert (o(spec) != 0.)
68 assert_equal( 0., o(c))
69 a = arange(c.length, dtype=float_type)
71 assert_equal (a, c.norm)
72 assert_equal ( sum(a*(a+1)), o(c))
74 def test_complex(self):
75 o = specdesc("complex")
77 assert_equal( 0., o(c))
78 a = arange(c.length, dtype=float_type)
80 assert_equal (a, c.norm)
81 # the previous run was on zeros, so previous frames are still 0
82 # so we have sqrt ( abs ( r2 ^ 2) ) == r2
83 assert_equal ( sum(a), o(c))
84 # second time. c.norm = a, so, r1 = r2, and the euclidian distance is 0
85 assert_equal ( 0, o(c))
90 assert_equal( 0., o(c))
91 a = arange(c.length, dtype=float_type)
93 assert_almost_equal( sum(a * log(1.+ a/1.e-1 ) ) / o(c), 1., decimal=6)
98 assert_equal( 0., o(c))
99 a = arange(c.length, dtype=float_type)
101 assert_almost_equal( sum(log(1.+ a/1.e-1 ) ) / o(c), 1, decimal=6)
103 def test_specflux(self):
104 o = specdesc("specflux")
106 assert_equal( 0., o(c))
107 a = arange(c.length, dtype=float_type)
109 assert_equal( sum(a), o(c))
110 assert_equal( 0, o(c))
111 c.norm = zeros(c.length, dtype=float_type)
112 assert_equal( 0, o(c))
114 def test_centroid(self):
115 o = specdesc("centroid")
117 # make sure centroid of zeros is zero
118 assert_equal( 0., o(c))
119 a = arange(c.length, dtype=float_type)
121 centroid = sum(a*a) / sum(a)
122 assert_almost_equal (centroid, o(c), decimal = 2)
125 assert_almost_equal (centroid, o(c), decimal = 2)
127 def test_spread(self):
128 o = specdesc("spread")
130 ramp = arange(c.length, dtype=float_type)
131 assert_equal( 0., o(c))
135 centroid = sum(a*a) / sum(a)
136 spread = sum( a * pow(ramp - centroid, 2.) ) / sum(a)
137 assert_almost_equal (o(c), spread, decimal = 1)
139 def test_skewness(self):
140 o = specdesc("skewness")
142 assert_equal( 0., o(c))
143 a = arange(c.length, dtype=float_type)
145 centroid = sum(a*a) / sum(a)
146 spread = sum( (a - centroid)**2 *a) / sum(a)
147 skewness = sum( (a - centroid)**3 *a) / sum(a) / spread **1.5
148 assert_almost_equal (skewness, o(c), decimal = 2)
151 assert_almost_equal (skewness, o(c), decimal = 2)
153 def test_kurtosis(self):
154 o = specdesc("kurtosis")
156 assert_equal( 0., o(c))
157 a = arange(c.length, dtype=float_type)
159 centroid = sum(a*a) / sum(a)
160 spread = sum( (a - centroid)**2 *a) / sum(a)
161 kurtosis = sum( (a - centroid)**4 *a) / sum(a) / spread **2
162 assert_almost_equal (kurtosis, o(c), decimal = 2)
164 def test_slope(self):
165 o = specdesc("slope")
167 assert_equal( 0., o(c))
168 a = arange(c.length * 2, 0, -2, dtype=float_type)
169 k = arange(c.length, dtype=float_type)
171 num = len(a) * sum(k*a) - sum(k)*sum(a)
172 den = (len(a) * sum(k**2) - sum(k)**2)
173 slope = num/den/sum(a)
174 assert_almost_equal (slope, o(c), decimal = 5)
176 a = arange(0, c.length * 2, +2, dtype=float_type)
178 num = len(a) * sum(k*a) - sum(k)*sum(a)
179 den = (len(a) * sum(k**2) - sum(k)**2)
180 slope = num/den/sum(a)
181 assert_almost_equal (slope, o(c), decimal = 5)
183 a = arange(0, c.length * 2, +2, dtype=float_type)
185 assert_almost_equal (slope, o(c), decimal = 5)
187 def test_decrease(self):
188 o = specdesc("decrease")
190 assert_equal( 0., o(c))
191 a = arange(c.length * 2, 0, -2, dtype=float_type)
192 k = arange(c.length, dtype=float_type)
194 decrease = sum((a[1:] - a [0]) / k[1:]) / sum(a[1:])
195 assert_almost_equal (decrease, o(c), decimal = 5)
197 a = arange(0, c.length * 2, +2, dtype=float_type)
199 decrease = sum((a[1:] - a [0]) / k[1:]) / sum(a[1:])
200 assert_almost_equal (decrease, o(c), decimal = 5)
202 a = arange(0, c.length * 2, +2, dtype=float_type)
204 decrease = sum((a[1:] - a [0]) / k[1:]) / sum(a[1:])
205 assert_almost_equal (decrease, o(c), decimal = 5)
207 def test_rolloff(self):
208 o = specdesc("rolloff")
210 assert_equal( 0., o(c))
211 a = arange(c.length * 2, 0, -2, dtype=float_type)
213 cumsum = .95*sum(a*a)
215 while rollsum < cumsum:
219 assert_equal (rolloff, o(c))
221 class aubio_specdesc_wrong(TestCase):
223 def test_negative(self):
224 with self.assertRaises(ValueError):
225 specdesc("default", -10)
227 def test_unknown(self):
229 with self.assertRaises(ValueError):
230 specdesc("unknown", 512)
231 self.skipTest('todo: new_specdesc should fail on wrong method')
233 if __name__ == '__main__':