3 from numpy.testing import TestCase, assert_equal, assert_array_less
4 from aubio import fvec, cvec, pvoc, float_type
5 from nose2.tools import params
8 if float_type == 'float32':
13 def create_sine(hop_s, freq, samplerate):
14 t = np.arange(hop_s).astype(float_type)
15 return np.sin( 2. * np.pi * freq * t / float(samplerate))
17 def create_noise(hop_s):
18 return np.random.rand(hop_s).astype(float_type) * 2. - 1.
20 class aubio_pvoc_test_case(TestCase):
21 """ pvoc object test case """
23 def test_members_automatic_sizes_default(self):
24 """ check object creation with default parameters """
26 assert_equal ([f.win_s, f.hop_s], [1024, 512])
28 def test_members_unnamed_params(self):
29 """ check object creation with unnamed parameters """
31 assert_equal ([f.win_s, f.hop_s], [2048, 128])
33 def test_members_named_params(self):
34 """ check object creation with named parameters """
35 f = pvoc(hop_s = 128, win_s = 2048)
36 assert_equal ([f.win_s, f.hop_s], [2048, 128])
39 """ check the resynthesis of zeros gives zeros """
40 win_s, hop_s = 1024, 256
41 f = pvoc (win_s, hop_s)
43 for time in range( int ( 4 * win_s / hop_s ) ):
47 assert_equal ( s.norm, 0.)
48 assert_equal ( s.phas, 0.)
74 def test_resynth_steps_noise(self, hop_s, ratio):
75 """ check the resynthesis of a random signal is correct """
76 sigin = create_noise(hop_s)
77 self.reconstruction(sigin, hop_s, ratio)
81 (44100, 256, 4, 1203),
82 (44100, 256, 2, 3045),
86 (44100, 1024, 8, 445),
87 (44100, 1024, 4, 445),
88 (44100, 1024, 2, 445),
89 ( 8000, 1024, 2, 445),
90 (22050, 1024, 2, 445),
92 (96000, 1024, 8, 47000),
95 def test_resynth_steps_sine(self, samplerate, hop_s, ratio, freq):
96 """ check the resynthesis of a sine is correct """
97 sigin = create_sine(hop_s, freq, samplerate)
98 self.reconstruction(sigin, hop_s, ratio)
100 def reconstruction(self, sigin, hop_s, ratio):
101 buf_s = hop_s * ratio
102 f = pvoc(buf_s, hop_s)
104 r2 = f.rdo( f(sigin) )
105 for i in range(1, ratio):
106 r2 = f.rdo( f(zeros) )
107 # compute square errors
108 sq_error = (r2 - sigin)**2
109 # make sure all square errors are less than desired precision
110 assert_array_less(sq_error, max_sq_error)
112 class aubio_pvoc_strange_params(TestCase):
114 def test_win_size_short(self):
115 with self.assertRaises(RuntimeError):
118 def test_hop_size_long(self):
119 with self.assertRaises(RuntimeError):
122 def test_large_input_timegrain(self):
126 with self.assertRaises(ValueError):
129 def test_small_input_timegrain(self):
133 with self.assertRaises(ValueError):
136 def test_large_input_fftgrain(self):
140 with self.assertRaises(ValueError):
143 def test_small_input_fftgrain(self):
147 with self.assertRaises(ValueError):
150 class aubio_pvoc_wrong_params(TestCase):
152 def test_wrong_buf_size(self):
154 with self.assertRaises(ValueError):
157 def test_buf_size_too_small(self):
159 with self.assertRaises(RuntimeError):
162 def test_hop_size_negative(self):
165 with self.assertRaises(ValueError):
168 def test_hop_size_too_small(self):
171 with self.assertRaises(RuntimeError):
174 def test_buf_size_not_power_of_two(self):
178 with self.assertRaises(RuntimeError):
180 except AssertionError as e:
181 # when compiled with fftw3, aubio supports non power of two fft sizes
182 self.skipTest('creating aubio.pvoc with size %d did not fail' % win_s)
184 if __name__ == '__main__':
185 from nose2 import main