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
25 class aubio_specdesc(TestCase):
27 def test_members(self):
30 for method in methods:
31 o = specdesc(method, buf_size)
32 assert_equal ([o.buf_size, o.method], [buf_size, method])
37 #print "%20s" % method, str(o(spec))
39 spec.norm = random.random_sample((len(spec.norm),)).astype(float_type)
40 spec.phas = random.random_sample((len(spec.phas),)).astype(float_type)
41 #print "%20s" % method, str(o(spec))
42 assert (o(spec) != 0.)
45 o = specdesc("phase", buf_size)
47 # phase of zeros is zero
48 assert_equal (o(spec), 0.)
49 spec.phas = random.random_sample((len(spec.phas),)).astype(float_type)
50 # phase of random is not zero
52 assert (o(spec) != 0.)
54 def test_specdiff(self):
55 o = specdesc("phase", buf_size)
57 # specdiff of zeros is zero
58 assert_equal (o(spec), 0.)
59 spec.phas = random.random_sample((len(spec.phas),)).astype(float_type)
60 # phase of random is not zero
62 assert (o(spec) != 0.)
67 assert_equal( 0., o(c))
68 a = arange(c.length, dtype=float_type)
70 assert_equal (a, c.norm)
71 assert_equal ( sum(a*(a+1)), o(c))
73 def test_complex(self):
74 o = specdesc("complex")
76 assert_equal( 0., o(c))
77 a = arange(c.length, dtype=float_type)
79 assert_equal (a, c.norm)
80 # the previous run was on zeros, so previous frames are still 0
81 # so we have sqrt ( abs ( r2 ^ 2) ) == r2
82 assert_equal ( sum(a), o(c))
83 # second time. c.norm = a, so, r1 = r2, and the euclidian distance is 0
84 assert_equal ( 0, o(c))
89 assert_equal( 0., o(c))
90 a = arange(c.length, dtype=float_type)
92 assert_almost_equal( sum(a * log(1.+ a/1.e-1 ) ) / o(c), 1., decimal=6)
97 assert_equal( 0., o(c))
98 a = arange(c.length, dtype=float_type)
100 assert_almost_equal( sum(log(1.+ a/1.e-1 ) ) / o(c), 1, decimal=6)
102 def test_specflux(self):
103 o = specdesc("specflux")
105 assert_equal( 0., o(c))
106 a = arange(c.length, dtype=float_type)
108 assert_equal( sum(a), o(c))
109 assert_equal( 0, o(c))
110 c.norm = zeros(c.length, dtype=float_type)
111 assert_equal( 0, o(c))
113 def test_centroid(self):
114 o = specdesc("centroid")
116 # make sure centroid of zeros is zero
117 assert_equal( 0., o(c))
118 a = arange(c.length, dtype=float_type)
120 centroid = sum(a*a) / sum(a)
121 assert_almost_equal (centroid, o(c), decimal = 2)
124 assert_almost_equal (centroid, o(c), decimal = 2)
126 def test_spread(self):
127 o = specdesc("spread")
129 ramp = arange(c.length, dtype=float_type)
130 assert_equal( 0., o(c))
134 centroid = sum(a*a) / sum(a)
135 spread = sum( a * pow(ramp - centroid, 2.) ) / sum(a)
136 assert_almost_equal (o(c), spread, decimal = 1)
138 def test_skewness(self):
139 o = specdesc("skewness")
141 assert_equal( 0., o(c))
142 a = arange(c.length, dtype=float_type)
144 centroid = sum(a*a) / sum(a)
145 spread = sum( (a - centroid)**2 *a) / sum(a)
146 skewness = sum( (a - centroid)**3 *a) / sum(a) / spread **1.5
147 assert_almost_equal (skewness, o(c), decimal = 2)
150 assert_almost_equal (skewness, o(c), decimal = 2)
152 def test_kurtosis(self):
153 o = specdesc("kurtosis")
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 kurtosis = sum( (a - centroid)**4 *a) / sum(a) / spread **2
161 assert_almost_equal (kurtosis, o(c), decimal = 2)
163 def test_slope(self):
164 o = specdesc("slope")
166 assert_equal( 0., o(c))
167 a = arange(c.length * 2, 0, -2, dtype=float_type)
168 k = arange(c.length, dtype=float_type)
170 num = len(a) * sum(k*a) - sum(k)*sum(a)
171 den = (len(a) * sum(k**2) - sum(k)**2)
172 slope = num/den/sum(a)
173 assert_almost_equal (slope, o(c), decimal = 5)
175 a = arange(0, c.length * 2, +2, dtype=float_type)
177 num = len(a) * sum(k*a) - sum(k)*sum(a)
178 den = (len(a) * sum(k**2) - sum(k)**2)
179 slope = num/den/sum(a)
180 assert_almost_equal (slope, o(c), decimal = 5)
182 a = arange(0, c.length * 2, +2, dtype=float_type)
184 assert_almost_equal (slope, o(c), decimal = 5)
186 def test_decrease(self):
187 o = specdesc("decrease")
189 assert_equal( 0., o(c))
190 a = arange(c.length * 2, 0, -2, dtype=float_type)
191 k = arange(c.length, dtype=float_type)
193 decrease = sum((a[1:] - a [0]) / k[1:]) / sum(a[1:])
194 assert_almost_equal (decrease, o(c), decimal = 5)
196 a = arange(0, c.length * 2, +2, dtype=float_type)
198 decrease = sum((a[1:] - a [0]) / k[1:]) / sum(a[1:])
199 assert_almost_equal (decrease, o(c), decimal = 5)
201 a = arange(0, c.length * 2, +2, dtype=float_type)
203 decrease = sum((a[1:] - a [0]) / k[1:]) / sum(a[1:])
204 assert_almost_equal (decrease, o(c), decimal = 5)
206 def test_rolloff(self):
207 o = specdesc("rolloff")
209 assert_equal( 0., o(c))
210 a = arange(c.length * 2, 0, -2, dtype=float_type)
212 cumsum = .95*sum(a*a)
214 while rollsum < cumsum:
218 assert_equal (rolloff, o(c))
220 class aubio_specdesc_wrong(TestCase):
222 def test_negative(self):
223 with self.assertRaises(ValueError):
224 specdesc("default", -10)
226 def test_unknown(self):
227 with self.assertRaises(RuntimeError):
228 specdesc("unknown", 512)
230 if __name__ == '__main__':
231 from unittest import main