Mercurial > hg > auditok
comparison tests/test_signal.py @ 315:5f1859160fd7
Refactor signal processing code
- Use audioop for channel averaging and energy computation
author | Amine Sehili <amine.sehili@gmail.com> |
---|---|
date | Wed, 16 Oct 2019 21:58:54 +0100 |
parents | b3095d23d0c3 |
children | 9741b52f194a |
comparison
equal
deleted
inserted
replaced
314:12a030453422 | 315:5f1859160fd7 |
---|---|
1 import unittest | |
1 from unittest import TestCase | 2 from unittest import TestCase |
2 from array import array as array_ | 3 from array import array as array_ |
3 from genty import genty, genty_dataset | 4 from genty import genty, genty_dataset |
4 import numpy as np | 5 import numpy as np |
5 from auditok import signal as signal_ | 6 from auditok import signal as signal_ |
10 class TestSignal(TestCase): | 11 class TestSignal(TestCase): |
11 def setUp(self): | 12 def setUp(self): |
12 self.data = b"012345679ABC" | 13 self.data = b"012345679ABC" |
13 self.numpy_fmt = {"b": np.int8, "h": np.int16, "i": np.int32} | 14 self.numpy_fmt = {"b": np.int8, "h": np.int16, "i": np.int32} |
14 | 15 |
16 | |
15 @genty_dataset( | 17 @genty_dataset( |
16 int8=("b", [48, 49, 50, 51, 52, 53, 54, 55, 57, 65, 66, 67]), | 18 int8_mono=(1, [48, 49, 50, 51, 52, 53, 54, 55, 57, 65, 66, 67]), |
17 int16=("h", [12592, 13106, 13620, 14134, 16697, 17218]), | 19 int16_mono=(2, [12592, 13106, 13620, 14134, 16697, 17218]), |
18 int32=("i", [858927408, 926299444, 1128415545]), | 20 int32_mono=(4, [858927408, 926299444, 1128415545]), |
21 int8_stereo=(1, [[48, 50, 52, 54, 57, 66], [49, 51, 53, 55, 65, 67]]), | |
22 int16_stereo=(2, [[12592, 13620, 16697], [13106, 14134, 17218]]), | |
23 int32_3channel=(4, [[858927408], [926299444], [1128415545]]), | |
19 ) | 24 ) |
20 def test_to_array(self, fmt, expected): | 25 def test_to_array(self, sample_width, expected): |
21 resutl = signal_.to_array(self.data, fmt) | 26 if isinstance(expected[0], list): |
22 expected = array_(fmt, expected) | 27 channels = len(expected) |
28 expected = [array_(signal_.FORMAT[sample_width], xi) for xi in expected] | |
29 else: | |
30 channels = 1 | |
31 expected = array_(signal_.FORMAT[sample_width], expected) | |
32 resutl = signal_.to_array(self.data, sample_width, channels) | |
33 resutl_numpy = signal_numpy.to_array(self.data, sample_width, channels) | |
23 self.assertEqual(resutl, expected) | 34 self.assertEqual(resutl, expected) |
24 resutl_numpy = signal_numpy.to_array(self.data, self.numpy_fmt[fmt]) | 35 self.assertTrue((resutl_numpy == np.asarray(expected)).all()) |
25 self.assertTrue(all(resutl_numpy == expected)) | |
26 self.assertEqual(resutl_numpy.dtype, np.float64) | 36 self.assertEqual(resutl_numpy.dtype, np.float64) |
27 | 37 |
28 @genty_dataset( | 38 @genty_dataset( |
29 int8_1channel_select_0=( | 39 int8_1channel_select_0=( |
30 "b", | 40 "b", |
61 def test_extract_single_channel(self, fmt, channels, selected, expected): | 71 def test_extract_single_channel(self, fmt, channels, selected, expected): |
62 resutl = signal_.extract_single_channel( | 72 resutl = signal_.extract_single_channel( |
63 self.data, fmt, channels, selected | 73 self.data, fmt, channels, selected |
64 ) | 74 ) |
65 expected = array_(fmt, expected) | 75 expected = array_(fmt, expected) |
76 expected_numpy_fmt = self.numpy_fmt[fmt] | |
66 self.assertEqual(resutl, expected) | 77 self.assertEqual(resutl, expected) |
67 resutl_numpy = signal_numpy.extract_single_channel( | 78 resutl_numpy = signal_numpy.extract_single_channel( |
68 self.data, self.numpy_fmt[fmt], channels, selected | 79 self.data, self.numpy_fmt[fmt], channels, selected |
69 ) | 80 ) |
70 self.assertTrue(all(resutl_numpy == expected)) | 81 self.assertTrue(all(resutl_numpy == expected)) |
71 self.assertEqual(resutl_numpy.dtype, np.float64) | 82 self.assertEqual(resutl_numpy.dtype, expected_numpy_fmt) |
72 | 83 |
73 @genty_dataset( | 84 @genty_dataset( |
74 int8_2channel=("b", 2, [48, 50, 52, 54, 61, 66]), | 85 int8_2channel=("b", 2, [48, 50, 52, 54, 61, 66]), |
75 int8_4channel=("b", 4, [50, 54, 64]), | 86 int8_4channel=("b", 4, [50, 54, 64]), |
76 int16_1channel=("h", 1, [12592, 13106, 13620, 14134, 16697, 17218]), | 87 int16_1channel=("h", 1, [12592, 13106, 13620, 14134, 16697, 17218]), |
78 int32_3channel=("i", 3, [971214132]), | 89 int32_3channel=("i", 3, [971214132]), |
79 ) | 90 ) |
80 def test_average_channels(self, fmt, channels, expected): | 91 def test_average_channels(self, fmt, channels, expected): |
81 resutl = signal_.average_channels(self.data, fmt, channels) | 92 resutl = signal_.average_channels(self.data, fmt, channels) |
82 expected = array_(fmt, expected) | 93 expected = array_(fmt, expected) |
94 expected_numpy_fmt = self.numpy_fmt[fmt] | |
83 self.assertEqual(resutl, expected) | 95 self.assertEqual(resutl, expected) |
84 resutl_numpy = signal_numpy.average_channels( | 96 resutl_numpy = signal_numpy.average_channels( |
85 self.data, self.numpy_fmt[fmt], channels | 97 self.data, self.numpy_fmt[fmt], channels |
86 ) | 98 ) |
87 self.assertTrue(all(resutl_numpy == expected)) | 99 self.assertTrue(all(resutl_numpy == expected)) |
88 self.assertEqual(resutl_numpy.dtype, np.float64) | 100 self.assertEqual(resutl_numpy.dtype, expected_numpy_fmt) |
89 | 101 |
90 @genty_dataset( | 102 @genty_dataset( |
91 int8_1channel=( | 103 int8_1channel=( |
92 "b", | 104 "b", |
93 1, | 105 1, |
111 int32_3channel=("i", 3, [[858927408], [926299444], [1128415545]]), | 123 int32_3channel=("i", 3, [[858927408], [926299444], [1128415545]]), |
112 ) | 124 ) |
113 def test_separate_channels(self, fmt, channels, expected): | 125 def test_separate_channels(self, fmt, channels, expected): |
114 resutl = signal_.separate_channels(self.data, fmt, channels) | 126 resutl = signal_.separate_channels(self.data, fmt, channels) |
115 expected = [array_(fmt, exp) for exp in expected] | 127 expected = [array_(fmt, exp) for exp in expected] |
128 expected_numpy_fmt = self.numpy_fmt[fmt] | |
116 self.assertEqual(resutl, expected) | 129 self.assertEqual(resutl, expected) |
117 | 130 |
118 resutl_numpy = signal_numpy.separate_channels( | 131 resutl_numpy = signal_numpy.separate_channels( |
119 self.data, self.numpy_fmt[fmt], channels | 132 self.data, self.numpy_fmt[fmt], channels |
120 ) | 133 ) |
121 self.assertTrue((resutl_numpy == expected).all()) | 134 self.assertTrue((resutl_numpy == expected).all()) |
122 self.assertEqual(resutl_numpy.dtype, np.float64) | 135 self.assertEqual(resutl_numpy.dtype, expected_numpy_fmt) |
123 | 136 |
124 @genty_dataset( | 137 @genty_dataset( |
125 simple=([300, 320, 400, 600], 52.506639194632434), | 138 simple=([300, 320, 400, 600], 2, 52.50624901923348), |
126 zero=([0], -200), | 139 zero=([0], 2, -200), |
127 zeros=([0, 0, 0], -200), | 140 zeros=([0, 0, 0], 2, -200), |
128 ) | 141 ) |
129 def test_calculate_energy_single_channel(self, x, expected): | 142 def test_calculate_energy_single_channel(self, x, sample_width, expected): |
130 energy = signal_.calculate_energy_single_channel(x) | 143 x = array_(signal_.FORMAT[sample_width], x) |
144 energy = signal_.calculate_energy_single_channel(x, sample_width) | |
131 self.assertEqual(energy, expected) | 145 self.assertEqual(energy, expected) |
132 energy = signal_numpy.calculate_energy_single_channel(x) | 146 energy = signal_numpy.calculate_energy_single_channel(x, sample_width) |
133 self.assertEqual(energy, expected) | 147 self.assertEqual(energy, expected) |
148 | |
134 | 149 |
135 @genty_dataset( | 150 @genty_dataset( |
136 min_=( | 151 min_=( |
137 [[300, 320, 400, 600], [150, 160, 200, 300]], | 152 [[300, 320, 400, 600], [150, 160, 200, 300]], |
153 2, | |
138 min, | 154 min, |
139 46.48603928135281, | 155 46.485649105953854, |
140 ), | 156 ), |
141 max_=( | 157 max_=( |
142 [[300, 320, 400, 600], [150, 160, 200, 300]], | 158 [[300, 320, 400, 600], [150, 160, 200, 300]], |
159 2, | |
143 max, | 160 max, |
144 52.506639194632434, | 161 52.50624901923348, |
145 ), | 162 ), |
146 ) | 163 ) |
147 def test_calculate_energy_multichannel(self, x, aggregation_fn, expected): | 164 def test_calculate_energy_multichannel(self, x, sample_width, aggregation_fn, expected): |
148 energy = signal_.calculate_energy_multichannel(x, aggregation_fn) | 165 x = [array_(signal_.FORMAT[sample_width], xi) for xi in x] |
166 energy = signal_.calculate_energy_multichannel(x, sample_width, aggregation_fn) | |
149 self.assertEqual(energy, expected) | 167 self.assertEqual(energy, expected) |
150 | 168 |
151 energy = signal_numpy.calculate_energy_multichannel(x, aggregation_fn) | 169 energy = signal_numpy.calculate_energy_multichannel(x, sample_width, aggregation_fn) |
152 self.assertEqual(energy, expected) | 170 self.assertEqual(energy, expected) |
171 | |
172 if __name__ == "__main__": | |
173 unittest.main() |