amine@400
|
1 import pytest
|
amine@257
|
2 from array import array as array_
|
amine@257
|
3 import numpy as np
|
amine@257
|
4 from auditok import signal as signal_
|
amine@257
|
5 from auditok import signal_numpy
|
amine@257
|
6
|
amine@257
|
7
|
amine@400
|
8 @pytest.fixture
|
amine@400
|
9 def setup_data():
|
amine@400
|
10 return b"012345679ABC"
|
amine@257
|
11
|
amine@257
|
12
|
amine@400
|
13 @pytest.fixture
|
amine@400
|
14 def numpy_fmt():
|
amine@400
|
15 return {"b": np.int8, "h": np.int16, "i": np.int32}
|
amine@400
|
16
|
amine@400
|
17
|
amine@400
|
18 @pytest.mark.parametrize(
|
amine@400
|
19 "sample_width, expected",
|
amine@400
|
20 [
|
amine@400
|
21 (1, [[48, 49, 50, 51, 52, 53, 54, 55, 57, 65, 66, 67]]), # int8_mono
|
amine@400
|
22 (2, [[12592, 13106, 13620, 14134, 16697, 17218]]), # int16_mono
|
amine@400
|
23 (4, [[858927408, 926299444, 1128415545]]), # int32_mono
|
amine@400
|
24 (
|
amine@400
|
25 1,
|
amine@400
|
26 [[48, 50, 52, 54, 57, 66], [49, 51, 53, 55, 65, 67]],
|
amine@400
|
27 ), # int8_stereo
|
amine@400
|
28 (2, [[12592, 13620, 16697], [13106, 14134, 17218]]), # int16_stereo
|
amine@400
|
29 (4, [[858927408], [926299444], [1128415545]]), # int32_3channel
|
amine@400
|
30 ],
|
amine@400
|
31 ids=[
|
amine@400
|
32 "int8_mono",
|
amine@400
|
33 "int16_mono",
|
amine@400
|
34 "int32_mono",
|
amine@400
|
35 "int8_stereo",
|
amine@400
|
36 "int16_stereo",
|
amine@400
|
37 "int32_3channel",
|
amine@400
|
38 ],
|
amine@400
|
39 )
|
amine@400
|
40 def test_to_array(setup_data, sample_width, expected):
|
amine@400
|
41 data = setup_data
|
amine@400
|
42 channels = len(expected)
|
amine@400
|
43 expected = [array_(signal_.FORMAT[sample_width], xi) for xi in expected]
|
amine@400
|
44 result = signal_.to_array(data, sample_width, channels)
|
amine@400
|
45 result_numpy = signal_numpy.to_array(data, sample_width, channels)
|
amine@400
|
46 assert result == expected
|
amine@400
|
47 assert (result_numpy == np.asarray(expected)).all()
|
amine@400
|
48 assert result_numpy.dtype == np.float64
|
amine@400
|
49
|
amine@400
|
50
|
amine@400
|
51 @pytest.mark.parametrize(
|
amine@400
|
52 "fmt, channels, selected, expected",
|
amine@400
|
53 [
|
amine@400
|
54 (
|
amine@257
|
55 "b",
|
amine@257
|
56 1,
|
amine@257
|
57 0,
|
amine@257
|
58 [48, 49, 50, 51, 52, 53, 54, 55, 57, 65, 66, 67],
|
amine@400
|
59 ), # int8_1channel_select_0
|
amine@400
|
60 ("b", 2, 0, [48, 50, 52, 54, 57, 66]), # int8_2channel_select_0
|
amine@400
|
61 ("b", 3, 0, [48, 51, 54, 65]), # int8_3channel_select_0
|
amine@400
|
62 ("b", 3, 1, [49, 52, 55, 66]), # int8_3channel_select_1
|
amine@400
|
63 ("b", 3, 2, [50, 53, 57, 67]), # int8_3channel_select_2
|
amine@400
|
64 ("b", 4, 0, [48, 52, 57]), # int8_4channel_select_0
|
amine@400
|
65 (
|
amine@257
|
66 "h",
|
amine@257
|
67 1,
|
amine@257
|
68 0,
|
amine@257
|
69 [12592, 13106, 13620, 14134, 16697, 17218],
|
amine@400
|
70 ), # int16_1channel_select_0
|
amine@400
|
71 ("h", 2, 0, [12592, 13620, 16697]), # int16_2channel_select_0
|
amine@400
|
72 ("h", 2, 1, [13106, 14134, 17218]), # int16_2channel_select_1
|
amine@400
|
73 ("h", 3, 0, [12592, 14134]), # int16_3channel_select_0
|
amine@400
|
74 ("h", 3, 1, [13106, 16697]), # int16_3channel_select_1
|
amine@400
|
75 ("h", 3, 2, [13620, 17218]), # int16_3channel_select_2
|
amine@400
|
76 (
|
amine@257
|
77 "i",
|
amine@257
|
78 1,
|
amine@257
|
79 0,
|
amine@257
|
80 [858927408, 926299444, 1128415545],
|
amine@400
|
81 ), # int32_1channel_select_0
|
amine@400
|
82 ("i", 3, 0, [858927408]), # int32_3channel_select_0
|
amine@400
|
83 ("i", 3, 1, [926299444]), # int32_3channel_select_1
|
amine@400
|
84 ("i", 3, 2, [1128415545]), # int32_3channel_select_2
|
amine@400
|
85 ],
|
amine@400
|
86 ids=[
|
amine@400
|
87 "int8_1channel_select_0",
|
amine@400
|
88 "int8_2channel_select_0",
|
amine@400
|
89 "int8_3channel_select_0",
|
amine@400
|
90 "int8_3channel_select_1",
|
amine@400
|
91 "int8_3channel_select_2",
|
amine@400
|
92 "int8_4channel_select_0",
|
amine@400
|
93 "int16_1channel_select_0",
|
amine@400
|
94 "int16_2channel_select_0",
|
amine@400
|
95 "int16_2channel_select_1",
|
amine@400
|
96 "int16_3channel_select_0",
|
amine@400
|
97 "int16_3channel_select_1",
|
amine@400
|
98 "int16_3channel_select_2",
|
amine@400
|
99 "int32_1channel_select_0",
|
amine@400
|
100 "int32_3channel_select_0",
|
amine@400
|
101 "int32_3channel_select_1",
|
amine@400
|
102 "int32_3channel_select_2",
|
amine@400
|
103 ],
|
amine@400
|
104 )
|
amine@400
|
105 def test_extract_single_channel(
|
amine@400
|
106 setup_data, numpy_fmt, fmt, channels, selected, expected
|
amine@400
|
107 ):
|
amine@400
|
108 data = setup_data
|
amine@400
|
109 result = signal_.extract_single_channel(data, fmt, channels, selected)
|
amine@400
|
110 expected = array_(fmt, expected)
|
amine@400
|
111 expected_numpy_fmt = numpy_fmt[fmt]
|
amine@400
|
112 assert result == expected
|
amine@400
|
113 result_numpy = signal_numpy.extract_single_channel(
|
amine@400
|
114 data, numpy_fmt[fmt], channels, selected
|
amine@257
|
115 )
|
amine@400
|
116 assert all(result_numpy == expected)
|
amine@400
|
117 assert result_numpy.dtype == expected_numpy_fmt
|
amine@257
|
118
|
amine@400
|
119
|
amine@400
|
120 @pytest.mark.parametrize(
|
amine@400
|
121 "fmt, channels, expected",
|
amine@400
|
122 [
|
amine@400
|
123 ("b", 2, [48, 50, 52, 54, 61, 66]), # int8_2channel
|
amine@400
|
124 ("b", 4, [50, 54, 64]), # int8_4channel
|
amine@400
|
125 ("h", 1, [12592, 13106, 13620, 14134, 16697, 17218]), # int16_1channel
|
amine@400
|
126 ("h", 2, [12849, 13877, 16958]), # int16_2channel
|
amine@400
|
127 ("i", 3, [971214132]), # int32_3channel
|
amine@400
|
128 ],
|
amine@400
|
129 ids=[
|
amine@400
|
130 "int8_2channel",
|
amine@400
|
131 "int8_4channel",
|
amine@400
|
132 "int16_1channel",
|
amine@400
|
133 "int16_2channel",
|
amine@400
|
134 "int32_3channel",
|
amine@400
|
135 ],
|
amine@400
|
136 )
|
amine@400
|
137 def test_compute_average_channel(
|
amine@400
|
138 setup_data, numpy_fmt, fmt, channels, expected
|
amine@400
|
139 ):
|
amine@400
|
140 data = setup_data
|
amine@400
|
141 result = signal_.compute_average_channel(data, fmt, channels)
|
amine@400
|
142 expected = array_(fmt, expected)
|
amine@400
|
143 expected_numpy_fmt = numpy_fmt[fmt]
|
amine@400
|
144 assert result == expected
|
amine@400
|
145 result_numpy = signal_numpy.compute_average_channel(
|
amine@400
|
146 data, numpy_fmt[fmt], channels
|
amine@257
|
147 )
|
amine@400
|
148 assert all(result_numpy == expected)
|
amine@400
|
149 assert result_numpy.dtype == expected_numpy_fmt
|
amine@358
|
150
|
amine@257
|
151
|
amine@400
|
152 @pytest.mark.parametrize(
|
amine@400
|
153 "sample_width, expected",
|
amine@400
|
154 [
|
amine@400
|
155 (1, [48, 50, 52, 54, 61, 66]), # int8_2channel
|
amine@400
|
156 (2, [12849, 13877, 16957]), # int16_2channel
|
amine@400
|
157 ],
|
amine@400
|
158 ids=["int8_2channel", "int16_2channel"],
|
amine@400
|
159 )
|
amine@400
|
160 def test_compute_average_channel_stereo(setup_data, sample_width, expected):
|
amine@400
|
161 data = setup_data
|
amine@400
|
162 result = signal_.compute_average_channel_stereo(data, sample_width)
|
amine@400
|
163 fmt = signal_.FORMAT[sample_width]
|
amine@400
|
164 expected = array_(fmt, expected)
|
amine@400
|
165 assert result == expected
|
amine@400
|
166
|
amine@400
|
167
|
amine@400
|
168 @pytest.mark.parametrize(
|
amine@400
|
169 "fmt, channels, expected",
|
amine@400
|
170 [
|
amine@400
|
171 (
|
amine@257
|
172 "b",
|
amine@257
|
173 1,
|
amine@257
|
174 [[48, 49, 50, 51, 52, 53, 54, 55, 57, 65, 66, 67]],
|
amine@400
|
175 ), # int8_1channel
|
amine@400
|
176 (
|
amine@257
|
177 "b",
|
amine@257
|
178 2,
|
amine@257
|
179 [[48, 50, 52, 54, 57, 66], [49, 51, 53, 55, 65, 67]],
|
amine@400
|
180 ), # int8_2channel
|
amine@400
|
181 (
|
amine@257
|
182 "b",
|
amine@257
|
183 4,
|
amine@257
|
184 [[48, 52, 57], [49, 53, 65], [50, 54, 66], [51, 55, 67]],
|
amine@400
|
185 ), # int8_4channel
|
amine@400
|
186 (
|
amine@257
|
187 "h",
|
amine@257
|
188 2,
|
amine@257
|
189 [[12592, 13620, 16697], [13106, 14134, 17218]],
|
amine@400
|
190 ), # int16_2channel
|
amine@400
|
191 ("i", 3, [[858927408], [926299444], [1128415545]]), # int32_3channel
|
amine@400
|
192 ],
|
amine@400
|
193 ids=[
|
amine@400
|
194 "int8_1channel",
|
amine@400
|
195 "int8_2channel",
|
amine@400
|
196 "int8_4channel",
|
amine@400
|
197 "int16_2channel",
|
amine@400
|
198 "int32_3channel",
|
amine@400
|
199 ],
|
amine@400
|
200 )
|
amine@400
|
201 def test_separate_channels(setup_data, numpy_fmt, fmt, channels, expected):
|
amine@400
|
202 data = setup_data
|
amine@400
|
203 result = signal_.separate_channels(data, fmt, channels)
|
amine@400
|
204 expected = [array_(fmt, exp) for exp in expected]
|
amine@400
|
205 expected_numpy_fmt = numpy_fmt[fmt]
|
amine@400
|
206 assert result == expected
|
amine@400
|
207 result_numpy = signal_numpy.separate_channels(
|
amine@400
|
208 data, numpy_fmt[fmt], channels
|
amine@257
|
209 )
|
amine@400
|
210 assert (result_numpy == expected).all()
|
amine@400
|
211 assert result_numpy.dtype == expected_numpy_fmt
|
amine@257
|
212
|
amine@257
|
213
|
amine@400
|
214 @pytest.mark.parametrize(
|
amine@400
|
215 "x, sample_width, expected",
|
amine@400
|
216 [
|
amine@400
|
217 ([300, 320, 400, 600], 2, 52.50624901923348), # simple
|
amine@400
|
218 ([0], 2, -200), # zero
|
amine@400
|
219 ([0, 0, 0], 2, -200), # zeros
|
amine@400
|
220 ],
|
amine@400
|
221 ids=["simple", "zero", "zeros"],
|
amine@400
|
222 )
|
amine@400
|
223 def test_calculate_energy_single_channel(x, sample_width, expected):
|
amine@400
|
224 x = array_(signal_.FORMAT[sample_width], x)
|
amine@400
|
225 energy = signal_.calculate_energy_single_channel(x, sample_width)
|
amine@400
|
226 assert energy == expected
|
amine@400
|
227 energy = signal_numpy.calculate_energy_single_channel(x, sample_width)
|
amine@400
|
228 assert energy == expected
|
amine@257
|
229
|
amine@400
|
230
|
amine@400
|
231 @pytest.mark.parametrize(
|
amine@400
|
232 "x, sample_width, aggregation_fn, expected",
|
amine@400
|
233 [
|
amine@400
|
234 (
|
amine@257
|
235 [[300, 320, 400, 600], [150, 160, 200, 300]],
|
amine@315
|
236 2,
|
amine@257
|
237 min,
|
amine@315
|
238 46.485649105953854,
|
amine@400
|
239 ), # min_
|
amine@400
|
240 (
|
amine@257
|
241 [[300, 320, 400, 600], [150, 160, 200, 300]],
|
amine@315
|
242 2,
|
amine@257
|
243 max,
|
amine@315
|
244 52.50624901923348,
|
amine@400
|
245 ), # max_
|
amine@400
|
246 ],
|
amine@400
|
247 ids=["min_", "max_"],
|
amine@400
|
248 )
|
amine@400
|
249 def test_calculate_energy_multichannel(
|
amine@400
|
250 x, sample_width, aggregation_fn, expected
|
amine@400
|
251 ):
|
amine@400
|
252 x = [array_(signal_.FORMAT[sample_width], xi) for xi in x]
|
amine@400
|
253 energy = signal_.calculate_energy_multichannel(
|
amine@400
|
254 x, sample_width, aggregation_fn
|
amine@257
|
255 )
|
amine@400
|
256 assert energy == expected
|
amine@400
|
257 energy = signal_numpy.calculate_energy_multichannel(
|
amine@400
|
258 x, sample_width, aggregation_fn
|
amine@400
|
259 )
|
amine@400
|
260 assert energy == expected
|