3 from numpy.testing import TestCase
4 from numpy.testing import assert_equal, assert_almost_equal
5 from aubio import fvec, fft, cvec
8 class aubio_fft_test_case(TestCase):
10 def test_members(self):
11 """ check members are set correctly """
14 assert_equal (f.win_s, win_s)
16 def test_output_dimensions(self):
17 """ check the dimensions of output """
19 timegrain = fvec(win_s)
21 fftgrain = f (timegrain)
23 assert_equal (fftgrain.norm.shape, (win_s/2+1,))
24 assert_equal (fftgrain.phas.shape, (win_s/2+1,))
27 """ check the transform of zeros is all zeros """
29 timegrain = fvec(win_s)
31 fftgrain = f (timegrain)
32 assert_equal ( fftgrain.norm, 0 )
33 assert_equal ( fftgrain.phas, 0 )
35 def test_impulse(self):
36 """ check the transform of one impulse at a random place """
37 from random import random
38 from math import floor
40 i = floor(random()*win_s)
41 impulse = pi * random()
43 timegrain = fvec(win_s)
44 timegrain[i] = impulse
45 fftgrain = f ( timegrain )
46 #self.plot_this ( fftgrain.phas )
47 assert_almost_equal ( fftgrain.norm, impulse, decimal = 6 )
48 assert_equal ( fftgrain.phas <= pi, True)
49 assert_equal ( fftgrain.phas >= -pi, True)
51 def test_impulse_negative(self):
52 """ check the transform of one impulse at a random place """
53 from random import random
54 from math import floor
59 timegrain = fvec(win_s)
60 timegrain[i] = impulse
61 fftgrain = f ( timegrain )
62 #self.plot_this ( fftgrain.phas )
63 assert_almost_equal ( fftgrain.norm, abs(impulse), decimal = 6 )
65 # phase can be pi or -pi, as it is not unwrapped
66 assert_almost_equal ( abs(fftgrain.phas[1:-1]) , pi, decimal = 6 )
67 assert_almost_equal ( fftgrain.phas[0], pi, decimal = 6)
68 assert_almost_equal ( fftgrain.phas[-1], pi, decimal = 6)
70 assert_equal ( fftgrain.phas[1:-1] == 0, True)
71 assert_equal ( fftgrain.phas[0] == 0, True)
72 assert_equal ( fftgrain.phas[-1] == 0, True)
73 # now check the resynthesis
74 synthgrain = f.rdo ( fftgrain )
75 #self.plot_this ( fftgrain.phas.T )
76 assert_equal ( fftgrain.phas <= pi, True)
77 assert_equal ( fftgrain.phas >= -pi, True)
78 #self.plot_this ( synthgrain - timegrain )
79 assert_almost_equal ( synthgrain, timegrain, decimal = 6 )
81 def test_impulse_at_zero(self):
82 """ check the transform of one impulse at a index 0 """
86 timegrain = fvec(win_s)
87 timegrain[0] = impulse
88 fftgrain = f ( timegrain )
89 #self.plot_this ( fftgrain.phas )
90 assert_equal ( fftgrain.phas[0], 0)
91 # could be 0 or -0 depending on fft implementation (0 for fftw3, -0 for ooura)
92 assert_almost_equal ( fftgrain.phas[1], 0)
93 assert_almost_equal ( fftgrain.norm[0], impulse, decimal = 6 )
95 def test_rdo_before_do(self):
96 """ check running fft.rdo before fft.do works """
100 fftgrain = cvec(win_s)
101 t = f.rdo( fftgrain )
102 assert_equal ( t, 0 )
104 def plot_this(self, this):
105 from pylab import plot, show
109 def test_local_fftgrain(self):
110 """ check aubio.fft() result can be accessed after deletion """
111 def compute_grain(impulse):
113 timegrain = fvec(win_s)
114 timegrain[0] = impulse
116 fftgrain = f ( timegrain )
119 fftgrain = compute_grain(impulse)
120 assert_equal ( fftgrain.phas[0], 0)
121 assert_almost_equal ( fftgrain.phas[1], 0)
122 assert_almost_equal ( fftgrain.norm[0], impulse, decimal = 6 )
124 def test_local_reconstruct(self):
125 """ check aubio.fft.rdo() result can be accessed after deletion """
126 def compute_grain(impulse):
128 timegrain = fvec(win_s)
129 timegrain[0] = impulse
131 fftgrain = f ( timegrain )
135 r = compute_grain(impulse)
136 assert_almost_equal ( r[0], impulse, decimal = 6)
137 assert_almost_equal ( r[1:], 0)
139 def test_large_input_timegrain(self):
143 with self.assertRaises(ValueError):
146 def test_small_input_timegrain(self):
150 with self.assertRaises(ValueError):
153 def test_large_input_fftgrain(self):
157 with self.assertRaises(ValueError):
160 def test_small_input_fftgrain(self):
164 with self.assertRaises(ValueError):
167 if __name__ == '__main__':
168 from nose2 import main