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()