amine@315: import unittest amine@257: from unittest import TestCase amine@257: from array import array as array_ amine@257: from genty import genty, genty_dataset amine@257: import numpy as np amine@257: from auditok import signal as signal_ amine@257: from auditok import signal_numpy amine@257: amine@257: amine@257: @genty amine@257: class TestSignal(TestCase): amine@257: def setUp(self): amine@257: self.data = b"012345679ABC" amine@257: self.numpy_fmt = {"b": np.int8, "h": np.int16, "i": np.int32} amine@257: amine@315: amine@257: @genty_dataset( amine@315: int8_mono=(1, [48, 49, 50, 51, 52, 53, 54, 55, 57, 65, 66, 67]), amine@315: int16_mono=(2, [12592, 13106, 13620, 14134, 16697, 17218]), amine@315: int32_mono=(4, [858927408, 926299444, 1128415545]), amine@315: int8_stereo=(1, [[48, 50, 52, 54, 57, 66], [49, 51, 53, 55, 65, 67]]), amine@315: int16_stereo=(2, [[12592, 13620, 16697], [13106, 14134, 17218]]), amine@315: int32_3channel=(4, [[858927408], [926299444], [1128415545]]), amine@257: ) amine@315: def test_to_array(self, sample_width, expected): amine@315: if isinstance(expected[0], list): amine@315: channels = len(expected) amine@315: expected = [array_(signal_.FORMAT[sample_width], xi) for xi in expected] amine@315: else: amine@315: channels = 1 amine@315: expected = array_(signal_.FORMAT[sample_width], expected) amine@315: resutl = signal_.to_array(self.data, sample_width, channels) amine@315: resutl_numpy = signal_numpy.to_array(self.data, sample_width, channels) amine@257: self.assertEqual(resutl, expected) amine@315: self.assertTrue((resutl_numpy == np.asarray(expected)).all()) amine@257: self.assertEqual(resutl_numpy.dtype, np.float64) amine@257: amine@257: @genty_dataset( amine@257: int8_1channel_select_0=( amine@257: "b", amine@257: 1, amine@257: 0, amine@257: [48, 49, 50, 51, 52, 53, 54, 55, 57, 65, 66, 67], amine@257: ), amine@257: int8_2channel_select_0=("b", 2, 0, [48, 50, 52, 54, 57, 66]), amine@257: int8_3channel_select_0=("b", 3, 0, [48, 51, 54, 65]), amine@257: int8_3channel_select_1=("b", 3, 1, [49, 52, 55, 66]), amine@257: int8_3channel_select_2=("b", 3, 2, [50, 53, 57, 67]), amine@257: int8_4channel_select_0=("b", 4, 0, [48, 52, 57]), amine@257: int16_1channel_select_0=( amine@257: "h", amine@257: 1, amine@257: 0, amine@257: [12592, 13106, 13620, 14134, 16697, 17218], amine@257: ), amine@257: int16_2channel_select_0=("h", 2, 0, [12592, 13620, 16697]), amine@257: int16_2channel_select_1=("h", 2, 1, [13106, 14134, 17218]), amine@257: int16_3channel_select_0=("h", 3, 0, [12592, 14134]), amine@257: int16_3channel_select_1=("h", 3, 1, [13106, 16697]), amine@257: int16_3channel_select_2=("h", 3, 2, [13620, 17218]), amine@257: int32_1channel_select_0=( amine@257: "i", amine@257: 1, amine@257: 0, amine@257: [858927408, 926299444, 1128415545], amine@257: ), amine@257: int32_3channel_select_0=("i", 3, 0, [858927408]), amine@257: int32_3channel_select_1=("i", 3, 1, [926299444]), amine@257: int32_3channel_select_2=("i", 3, 2, [1128415545]), amine@257: ) amine@257: def test_extract_single_channel(self, fmt, channels, selected, expected): amine@257: resutl = signal_.extract_single_channel( amine@257: self.data, fmt, channels, selected amine@257: ) amine@257: expected = array_(fmt, expected) amine@315: expected_numpy_fmt = self.numpy_fmt[fmt] amine@257: self.assertEqual(resutl, expected) amine@257: resutl_numpy = signal_numpy.extract_single_channel( amine@257: self.data, self.numpy_fmt[fmt], channels, selected amine@257: ) amine@257: self.assertTrue(all(resutl_numpy == expected)) amine@315: self.assertEqual(resutl_numpy.dtype, expected_numpy_fmt) amine@257: amine@257: @genty_dataset( amine@257: int8_2channel=("b", 2, [48, 50, 52, 54, 61, 66]), amine@257: int8_4channel=("b", 4, [50, 54, 64]), amine@257: int16_1channel=("h", 1, [12592, 13106, 13620, 14134, 16697, 17218]), amine@257: int16_2channel=("h", 2, [12849, 13877, 16958]), amine@257: int32_3channel=("i", 3, [971214132]), amine@257: ) amine@257: def test_average_channels(self, fmt, channels, expected): amine@257: resutl = signal_.average_channels(self.data, fmt, channels) amine@257: expected = array_(fmt, expected) amine@315: expected_numpy_fmt = self.numpy_fmt[fmt] amine@257: self.assertEqual(resutl, expected) amine@257: resutl_numpy = signal_numpy.average_channels( amine@257: self.data, self.numpy_fmt[fmt], channels amine@257: ) amine@257: self.assertTrue(all(resutl_numpy == expected)) amine@315: self.assertEqual(resutl_numpy.dtype, expected_numpy_fmt) amine@257: amine@257: @genty_dataset( amine@257: int8_1channel=( amine@257: "b", amine@257: 1, amine@257: [[48, 49, 50, 51, 52, 53, 54, 55, 57, 65, 66, 67]], amine@257: ), amine@257: int8_2channel=( amine@257: "b", amine@257: 2, amine@257: [[48, 50, 52, 54, 57, 66], [49, 51, 53, 55, 65, 67]], amine@257: ), amine@257: int8_4channel=( amine@257: "b", amine@257: 4, amine@257: [[48, 52, 57], [49, 53, 65], [50, 54, 66], [51, 55, 67]], amine@257: ), amine@257: int16_2channel=( amine@257: "h", amine@257: 2, amine@257: [[12592, 13620, 16697], [13106, 14134, 17218]], amine@257: ), amine@257: int32_3channel=("i", 3, [[858927408], [926299444], [1128415545]]), amine@257: ) amine@257: def test_separate_channels(self, fmt, channels, expected): amine@257: resutl = signal_.separate_channels(self.data, fmt, channels) amine@257: expected = [array_(fmt, exp) for exp in expected] amine@315: expected_numpy_fmt = self.numpy_fmt[fmt] amine@257: self.assertEqual(resutl, expected) amine@257: amine@257: resutl_numpy = signal_numpy.separate_channels( amine@257: self.data, self.numpy_fmt[fmt], channels amine@257: ) amine@257: self.assertTrue((resutl_numpy == expected).all()) amine@315: self.assertEqual(resutl_numpy.dtype, expected_numpy_fmt) amine@257: amine@257: @genty_dataset( amine@315: simple=([300, 320, 400, 600], 2, 52.50624901923348), amine@315: zero=([0], 2, -200), amine@315: zeros=([0, 0, 0], 2, -200), amine@257: ) amine@315: def test_calculate_energy_single_channel(self, x, sample_width, expected): amine@315: x = array_(signal_.FORMAT[sample_width], x) amine@315: energy = signal_.calculate_energy_single_channel(x, sample_width) amine@257: self.assertEqual(energy, expected) amine@315: energy = signal_numpy.calculate_energy_single_channel(x, sample_width) amine@257: self.assertEqual(energy, expected) amine@257: amine@315: amine@257: @genty_dataset( amine@257: min_=( amine@257: [[300, 320, 400, 600], [150, 160, 200, 300]], amine@315: 2, amine@257: min, amine@315: 46.485649105953854, amine@257: ), amine@257: max_=( amine@257: [[300, 320, 400, 600], [150, 160, 200, 300]], amine@315: 2, amine@257: max, amine@315: 52.50624901923348, amine@257: ), amine@257: ) amine@315: def test_calculate_energy_multichannel(self, x, sample_width, aggregation_fn, expected): amine@315: x = [array_(signal_.FORMAT[sample_width], xi) for xi in x] amine@315: energy = signal_.calculate_energy_multichannel(x, sample_width, aggregation_fn) amine@257: self.assertEqual(energy, expected) amine@257: amine@315: energy = signal_numpy.calculate_energy_multichannel(x, sample_width, aggregation_fn) amine@257: self.assertEqual(energy, expected) amine@315: amine@315: if __name__ == "__main__": amine@315: unittest.main()