amine@315
|
1 import unittest
|
amine@257
|
2 from unittest import TestCase
|
amine@257
|
3 from array import array as array_
|
amine@257
|
4 from genty import genty, genty_dataset
|
amine@257
|
5 import numpy as np
|
amine@257
|
6 from auditok import signal as signal_
|
amine@257
|
7 from auditok import signal_numpy
|
amine@257
|
8
|
amine@257
|
9
|
amine@257
|
10 @genty
|
amine@257
|
11 class TestSignal(TestCase):
|
amine@257
|
12 def setUp(self):
|
amine@257
|
13 self.data = b"012345679ABC"
|
amine@257
|
14 self.numpy_fmt = {"b": np.int8, "h": np.int16, "i": np.int32}
|
amine@257
|
15
|
amine@257
|
16 @genty_dataset(
|
amine@372
|
17 int8_mono=(1, [[48, 49, 50, 51, 52, 53, 54, 55, 57, 65, 66, 67]]),
|
amine@372
|
18 int16_mono=(2, [[12592, 13106, 13620, 14134, 16697, 17218]]),
|
amine@372
|
19 int32_mono=(4, [[858927408, 926299444, 1128415545]]),
|
amine@331
|
20 int8_stereo=(1, [[48, 50, 52, 54, 57, 66], [49, 51, 53, 55, 65, 67]]),
|
amine@315
|
21 int16_stereo=(2, [[12592, 13620, 16697], [13106, 14134, 17218]]),
|
amine@315
|
22 int32_3channel=(4, [[858927408], [926299444], [1128415545]]),
|
amine@257
|
23 )
|
amine@315
|
24 def test_to_array(self, sample_width, expected):
|
amine@372
|
25 channels = len(expected)
|
amine@372
|
26 expected = [
|
amine@372
|
27 array_(signal_.FORMAT[sample_width], xi) for xi in expected
|
amine@372
|
28 ]
|
amine@358
|
29 result = signal_.to_array(self.data, sample_width, channels)
|
amine@358
|
30 result_numpy = signal_numpy.to_array(self.data, sample_width, channels)
|
amine@358
|
31 self.assertEqual(result, expected)
|
amine@358
|
32 self.assertTrue((result_numpy == np.asarray(expected)).all())
|
amine@358
|
33 self.assertEqual(result_numpy.dtype, np.float64)
|
amine@257
|
34
|
amine@257
|
35 @genty_dataset(
|
amine@257
|
36 int8_1channel_select_0=(
|
amine@257
|
37 "b",
|
amine@257
|
38 1,
|
amine@257
|
39 0,
|
amine@257
|
40 [48, 49, 50, 51, 52, 53, 54, 55, 57, 65, 66, 67],
|
amine@257
|
41 ),
|
amine@257
|
42 int8_2channel_select_0=("b", 2, 0, [48, 50, 52, 54, 57, 66]),
|
amine@257
|
43 int8_3channel_select_0=("b", 3, 0, [48, 51, 54, 65]),
|
amine@257
|
44 int8_3channel_select_1=("b", 3, 1, [49, 52, 55, 66]),
|
amine@257
|
45 int8_3channel_select_2=("b", 3, 2, [50, 53, 57, 67]),
|
amine@257
|
46 int8_4channel_select_0=("b", 4, 0, [48, 52, 57]),
|
amine@257
|
47 int16_1channel_select_0=(
|
amine@257
|
48 "h",
|
amine@257
|
49 1,
|
amine@257
|
50 0,
|
amine@257
|
51 [12592, 13106, 13620, 14134, 16697, 17218],
|
amine@257
|
52 ),
|
amine@257
|
53 int16_2channel_select_0=("h", 2, 0, [12592, 13620, 16697]),
|
amine@257
|
54 int16_2channel_select_1=("h", 2, 1, [13106, 14134, 17218]),
|
amine@257
|
55 int16_3channel_select_0=("h", 3, 0, [12592, 14134]),
|
amine@257
|
56 int16_3channel_select_1=("h", 3, 1, [13106, 16697]),
|
amine@257
|
57 int16_3channel_select_2=("h", 3, 2, [13620, 17218]),
|
amine@257
|
58 int32_1channel_select_0=(
|
amine@257
|
59 "i",
|
amine@257
|
60 1,
|
amine@257
|
61 0,
|
amine@257
|
62 [858927408, 926299444, 1128415545],
|
amine@257
|
63 ),
|
amine@257
|
64 int32_3channel_select_0=("i", 3, 0, [858927408]),
|
amine@257
|
65 int32_3channel_select_1=("i", 3, 1, [926299444]),
|
amine@257
|
66 int32_3channel_select_2=("i", 3, 2, [1128415545]),
|
amine@257
|
67 )
|
amine@257
|
68 def test_extract_single_channel(self, fmt, channels, selected, expected):
|
amine@358
|
69 result = signal_.extract_single_channel(
|
amine@257
|
70 self.data, fmt, channels, selected
|
amine@257
|
71 )
|
amine@257
|
72 expected = array_(fmt, expected)
|
amine@315
|
73 expected_numpy_fmt = self.numpy_fmt[fmt]
|
amine@358
|
74 self.assertEqual(result, expected)
|
amine@358
|
75 result_numpy = signal_numpy.extract_single_channel(
|
amine@257
|
76 self.data, self.numpy_fmt[fmt], channels, selected
|
amine@257
|
77 )
|
amine@358
|
78 self.assertTrue(all(result_numpy == expected))
|
amine@358
|
79 self.assertEqual(result_numpy.dtype, expected_numpy_fmt)
|
amine@257
|
80
|
amine@257
|
81 @genty_dataset(
|
amine@257
|
82 int8_2channel=("b", 2, [48, 50, 52, 54, 61, 66]),
|
amine@257
|
83 int8_4channel=("b", 4, [50, 54, 64]),
|
amine@257
|
84 int16_1channel=("h", 1, [12592, 13106, 13620, 14134, 16697, 17218]),
|
amine@257
|
85 int16_2channel=("h", 2, [12849, 13877, 16958]),
|
amine@257
|
86 int32_3channel=("i", 3, [971214132]),
|
amine@257
|
87 )
|
amine@359
|
88 def test_compute_average_channel(self, fmt, channels, expected):
|
amine@359
|
89 result = signal_.compute_average_channel(self.data, fmt, channels)
|
amine@257
|
90 expected = array_(fmt, expected)
|
amine@315
|
91 expected_numpy_fmt = self.numpy_fmt[fmt]
|
amine@358
|
92 self.assertEqual(result, expected)
|
amine@359
|
93 result_numpy = signal_numpy.compute_average_channel(
|
amine@257
|
94 self.data, self.numpy_fmt[fmt], channels
|
amine@257
|
95 )
|
amine@358
|
96 self.assertTrue(all(result_numpy == expected))
|
amine@358
|
97 self.assertEqual(result_numpy.dtype, expected_numpy_fmt)
|
amine@358
|
98
|
amine@358
|
99 @genty_dataset(
|
amine@358
|
100 int8_2channel=(1, [48, 50, 52, 54, 61, 66]),
|
amine@358
|
101 int16_2channel=(2, [12849, 13877, 16957]),
|
amine@358
|
102 )
|
amine@359
|
103 def test_compute_average_channel_stereo(self, sample_width, expected):
|
amine@359
|
104 result = signal_.compute_average_channel_stereo(
|
amine@359
|
105 self.data, sample_width
|
amine@359
|
106 )
|
amine@358
|
107 fmt = signal_.FORMAT[sample_width]
|
amine@358
|
108 expected = array_(fmt, expected)
|
amine@358
|
109 self.assertEqual(result, expected)
|
amine@257
|
110
|
amine@257
|
111 @genty_dataset(
|
amine@257
|
112 int8_1channel=(
|
amine@257
|
113 "b",
|
amine@257
|
114 1,
|
amine@257
|
115 [[48, 49, 50, 51, 52, 53, 54, 55, 57, 65, 66, 67]],
|
amine@257
|
116 ),
|
amine@257
|
117 int8_2channel=(
|
amine@257
|
118 "b",
|
amine@257
|
119 2,
|
amine@257
|
120 [[48, 50, 52, 54, 57, 66], [49, 51, 53, 55, 65, 67]],
|
amine@257
|
121 ),
|
amine@257
|
122 int8_4channel=(
|
amine@257
|
123 "b",
|
amine@257
|
124 4,
|
amine@257
|
125 [[48, 52, 57], [49, 53, 65], [50, 54, 66], [51, 55, 67]],
|
amine@257
|
126 ),
|
amine@257
|
127 int16_2channel=(
|
amine@257
|
128 "h",
|
amine@257
|
129 2,
|
amine@257
|
130 [[12592, 13620, 16697], [13106, 14134, 17218]],
|
amine@257
|
131 ),
|
amine@257
|
132 int32_3channel=("i", 3, [[858927408], [926299444], [1128415545]]),
|
amine@257
|
133 )
|
amine@257
|
134 def test_separate_channels(self, fmt, channels, expected):
|
amine@358
|
135 result = signal_.separate_channels(self.data, fmt, channels)
|
amine@257
|
136 expected = [array_(fmt, exp) for exp in expected]
|
amine@315
|
137 expected_numpy_fmt = self.numpy_fmt[fmt]
|
amine@358
|
138 self.assertEqual(result, expected)
|
amine@257
|
139
|
amine@358
|
140 result_numpy = signal_numpy.separate_channels(
|
amine@257
|
141 self.data, self.numpy_fmt[fmt], channels
|
amine@257
|
142 )
|
amine@358
|
143 self.assertTrue((result_numpy == expected).all())
|
amine@358
|
144 self.assertEqual(result_numpy.dtype, expected_numpy_fmt)
|
amine@257
|
145
|
amine@257
|
146 @genty_dataset(
|
amine@315
|
147 simple=([300, 320, 400, 600], 2, 52.50624901923348),
|
amine@315
|
148 zero=([0], 2, -200),
|
amine@315
|
149 zeros=([0, 0, 0], 2, -200),
|
amine@257
|
150 )
|
amine@315
|
151 def test_calculate_energy_single_channel(self, x, sample_width, expected):
|
amine@315
|
152 x = array_(signal_.FORMAT[sample_width], x)
|
amine@315
|
153 energy = signal_.calculate_energy_single_channel(x, sample_width)
|
amine@257
|
154 self.assertEqual(energy, expected)
|
amine@315
|
155 energy = signal_numpy.calculate_energy_single_channel(x, sample_width)
|
amine@257
|
156 self.assertEqual(energy, expected)
|
amine@257
|
157
|
amine@257
|
158 @genty_dataset(
|
amine@257
|
159 min_=(
|
amine@257
|
160 [[300, 320, 400, 600], [150, 160, 200, 300]],
|
amine@315
|
161 2,
|
amine@257
|
162 min,
|
amine@315
|
163 46.485649105953854,
|
amine@257
|
164 ),
|
amine@257
|
165 max_=(
|
amine@257
|
166 [[300, 320, 400, 600], [150, 160, 200, 300]],
|
amine@315
|
167 2,
|
amine@257
|
168 max,
|
amine@315
|
169 52.50624901923348,
|
amine@257
|
170 ),
|
amine@257
|
171 )
|
amine@331
|
172 def test_calculate_energy_multichannel(
|
amine@331
|
173 self, x, sample_width, aggregation_fn, expected
|
amine@331
|
174 ):
|
amine@315
|
175 x = [array_(signal_.FORMAT[sample_width], xi) for xi in x]
|
amine@331
|
176 energy = signal_.calculate_energy_multichannel(
|
amine@331
|
177 x, sample_width, aggregation_fn
|
amine@331
|
178 )
|
amine@257
|
179 self.assertEqual(energy, expected)
|
amine@257
|
180
|
amine@331
|
181 energy = signal_numpy.calculate_energy_multichannel(
|
amine@331
|
182 x, sample_width, aggregation_fn
|
amine@331
|
183 )
|
amine@257
|
184 self.assertEqual(energy, expected)
|
amine@315
|
185
|
amine@331
|
186
|
amine@315
|
187 if __name__ == "__main__":
|
amine@331
|
188 unittest.main()
|