def test_auto_interpretation_elektromaten(self):
        data = Signal(get_path_for_data_file("elektromaten.coco"), "").data
        result = AutoInterpretation.estimate(data)

        mod_type, bit_length = result["modulation_type"], result["bit_length"]
        center, noise, tolerance = result["center"], result["noise"], result["tolerance"]

        self.assertEqual(mod_type, "ASK")
        self.assertEqual(bit_length, 600)

        demodulated = demodulate(data, mod_type, bit_length, center, noise, tolerance, pause_threshold=8)
        self.assertEqual(len(demodulated), 11)
        for i in range(11):
            self.assertTrue(demodulated[i].startswith("8"))

        # Test with added 20% noise
        np.random.seed(5)
        noise = np.random.normal(loc=0, scale=1, size=2 * len(data)).astype(np.float32).view(np.complex64)
        noised_data = data + 0.2 * np.mean(np.abs(data)) * noise
        result = AutoInterpretation.estimate(noised_data)

        mod_type, bit_length = result["modulation_type"], result["bit_length"]
        center, noise, tolerance = result["center"], result["noise"], result["tolerance"]

        self.assertEqual(mod_type, "ASK")
        self.assertEqual(bit_length, 600)

        demodulated = demodulate(noised_data, mod_type, bit_length, center, noise, tolerance, pause_threshold=8)
        self.assertEqual(len(demodulated), 11)
        for i in range(11):
            self.assertTrue(demodulated[i].startswith("8"))
Пример #2
0
    def test_tolerance_estimation(self):
        data = [[40, 4, 3, 8, 12, 3, 4, 3, 2, 9, 10, 4, 7, 12, 7, 5, 11, 4, 8, 10, 1, 1, 1, 1, 4, 4, 10, 7, 7, 1, 17, 1, 1, 5, 3, 2, 1, 3, 17, 1, 1, 1, 1, 3, 3, 7, 18, 1, 3, 1, 1, 8, 7, 6, 6, 14, 6, 5, 8, 14, 2, 6, 10, 16, 1, 1, 16, 7, 2, 6, 18, 3, 1, 4, 1, 5, 15, 1, 3, 1, 2, 1, 1, 9, 18, 15, 6, 3, 9, 13, 1, 1, 4, 4, 10, 15, 2, 1, 1, 1, 13, 5, 7, 3, 17, 1, 1, 1, 1, 2, 3, 2, 1, 4, 22, 2, 2, 7, 18, 15, 6, 4, 8, 15, 4, 3, 11, 15, 2, 4, 12, 8, 2, 2, 1, 2, 18, 3, 1, 3, 2, 6, 15, 1, 3, 1, 2, 4, 1, 6, 19, 2, 2, 10, 10, 2, 6, 15, 18, 15, 18, 15, 1, 3, 14, 4, 7, 4, 16, 1, 8, 8, 12, 1, 8, 1, 3, 8, 8, 5, 5, 15, 6, 5, 7, 15, 4, 4, 10, 15, 1, 5, 12, 7, 1, 7, 18, 3, 1, 3, 2, 6, 14, 1, 3, 3, 1, 11, 9, 2, 7, 15, 6, 6, 6, 15, 4, 6, 8, 15, 1, 7, 8, 7, 3, 1, 2, 4, 1, 2, 15, 3, 6, 6, 11, 1, 3, 1, 8, 8, 12, 1, 9, 1, 1, 10, 5, 7, 6, 15, 1, 1, 1, 7, 8, 15, 1, 6, 9, 22, 3, 1, 3, 4, 1, 1, 13, 1, 3, 3, 2, 3, 1, 5, 24, 9, 10, 3, 6, 1, 1, 12, 3, 8, 7, 15, 2, 14, 2, 7, 8, 10, 1, 10, 10, 1, 1, 1, 1, 3, 7, 4, 15, 1, 1, 1, 1, 3, 3, 2, 1, 5, 3, 1, 1, 12, 9, 1, 8, 2, 1, 9, 7, 8, 6, 15, 2, 7, 7, 17, 1, 21, 8, 11, 1, 8, 12, 3, 1, 1, 1, 1, 1, 12, 3, 1, 3, 10, 10, 2, 11, 9, 7, 5, 7, 15, 1, 23, 7, 24, 5, 22, 1, 7, 1, 8, 12, 3, 1, 1, 1, 1, 1, 12, 12, 3, 4, 1, 1, 12, 8, 4, 7, 15, 1, 24, 8, 22, 6, 31, 1, 8, 11, 4, 1, 3, 1, 3, 2, 6, 9, 6, 3, 2, 2, 10, 2, 15, 7, 4, 3, 19, 1, 32, 1, 23, 3, 26, 8, 3, 2, 1, 1, 14, 2, 2, 3, 11, 8, 3, 1, 2, 4, 1, 2, 11, 2, 11, 1, 2, 7, 26, 2, 55, 6, 20, 1, 1, 9, 3, 1, 3, 1, 13, 3, 1, 2, 12, 8, 5, 5, 1, 2, 11, 2, 10, 2, 2, 4, 11, 2, 16, 2, 32, 1, 22, 7, 19, 2, 2, 3, 2, 1, 7, 8, 7, 3, 1, 3, 11, 7, 5, 6, 2, 1, 9, 1, 1, 2, 15, 2, 11, 4, 16, 1, 24, 6, 24, 6, 21, 3, 1, 2, 3, 1, 7, 8, 7, 4, 1, 2, 11, 2, 13, 7, 4, 1, 2, 4, 16, 2, 12, 1, 41, 7, 37, 8, 1, 2, 4, 1, 1, 1, 1, 2, 12, 3, 1, 3, 6, 5, 1, 2, 11, 3, 10, 1, 1, 7, 8, 3, 17, 1, 23, 7, 24, 5, 30, 2, 7, 7, 3, 1, 4, 2, 1, 3, 12, 2, 13, 7, 7, 2, 1, 1, 1, 1, 12, 4, 1, 2, 51, 6, 57, 2, 2, 2, 7, 2, 15, 6, 1, 2, 7, 2, 12, 1, 1, 3, 1, 1, 9, 1, 2, 3, 7, 7, 26, 1, 88, 10, 6, 3, 13, 3, 1, 2, 11, 3, 2, 2, 7, 3, 1, 1, 1, 1, 12, 2, 8, 7, 181, 1, 16, 1, 9, 2, 1, 4, 7, 1, 2, 3, 2, 1, 8, 3, 12, 1, 9, 1, 3, 7, 13, 1, 8, 2, 1, 1, 1, 2, 3, 1, 54, 1, 16, 1, 15, 3],
                [1, 1, 2, 3660, 1, 634, 1, 465, 1, 50, 1, 66, 1, 16, 1, 815, 1, 522, 1, 97, 1, 14, 1, 78, 1, 21, 1, 142, 1, 28, 1, 57, 1, 129, 1, 129, 1, 7, 1, 14, 1, 28, 1, 34, 1, 196, 1, 14, 1, 22, 1, 159, 1, 68, 1, 88, 1, 51, 1, 25, 1, 119, 1, 370],
                [4, 2, 2, 1, 8, 1, 1, 1, 6, 2, 6, 2, 2, 1, 1, 1, 6, 1, 1, 2, 1, 1, 2, 2, 1, 1, 3, 2, 3, 1, 6, 1, 4, 2, 2, 1, 4, 2, 3, 2, 1, 2],
                [1, 66, 1, 13, 1, 2, 1, 2, 104, 104, 104, 105, 104, 104, 104, 105, 104, 104, 104, 104, 104, 104, 104, 105, 104, 104, 104, 104, 105, 104, 104, 104, 104, 104, 104, 105, 104, 104, 104, 104, 105, 104, 104, 104, 104, 104, 104, 104, 209, 104, 105, 208, 104, 312, 105, 104, 104, 104, 521, 416, 105, 104, 208, 104, 313, 208, 209, 104, 104, 104, 417],
                [1, 73, 1, 2, 1, 6, 1, 1, 105, 104, 104, 105, 104, 104, 104, 105, 104, 104, 104, 104, 104, 104, 104, 105, 104, 104, 104, 105, 104, 104, 104, 104, 104, 104, 104, 105, 104, 104, 104, 104, 105, 104, 104, 104, 105, 103, 104, 105, 208, 104, 104, 209, 104, 312, 105, 104, 104, 104, 521, 417, 104, 104, 208, 104, 313, 208, 209, 104, 104, 104, 416],
                [1, 76, 1, 2, 1, 3, 1, 1, 105, 104, 104, 104, 105, 104, 104, 104, 105, 103, 104, 105, 104, 104, 104, 105, 104, 104, 104, 104, 105, 103, 104, 105, 104, 104, 104, 104, 105, 104, 104, 104, 105, 103, 104, 105, 104, 104, 104, 105, 208, 104, 104, 209, 103, 313, 105, 103, 104, 105, 521, 416, 104, 105, 208, 104, 313, 208, 209, 103, 104, 105, 416],
                [1, 11, 1, 10, 1, 10, 1, 10, 1, 5, 1, 4, 1, 5, 1, 4, 2, 4, 1, 3, 3, 3, 3, 2, 104, 105, 104, 104, 105, 104, 103, 104, 105, 104, 104, 104, 105, 104, 104, 104, 104, 105, 104, 104, 104, 104, 104, 104, 105, 104, 104, 104, 104, 105, 104, 104, 103, 105, 104, 104, 105, 104, 104, 104, 208, 104, 105],
                [1, 12, 1, 22, 1, 10, 1, 3, 1, 1, 1, 4, 1, 5, 1, 3, 2, 4, 2, 4, 2, 3, 2, 3, 104, 104, 105, 104, 104, 104, 105, 104, 104, 104, 104, 104, 105, 104, 104, 104, 104, 104, 105, 104, 105, 103, 104, 104, 104, 105, 104, 104, 104, 105, 104, 103, 105, 104, 104, 104, 105, 104, 104, 104, 209, 103, 105],
                [1, 12, 1, 22, 1, 10, 1, 5, 1, 3, 2, 5, 1, 3, 2, 4, 2, 3, 3, 3, 2, 3, 104, 105, 104, 104, 105, 103, 104, 105, 104, 104, 104, 104, 105, 104, 104, 104, 104, 105, 104, 103, 105, 104, 104, 104, 104, 105, 104, 104, 104, 104, 105, 103, 105, 104, 104, 104, 104, 105, 104, 104, 208, 104, 104],
                [1, 66, 1, 2, 1, 6, 1, 6, 1, 1, 105, 104, 104, 104, 105, 104, 104, 104, 105, 103, 105, 104, 104, 104, 104, 105, 104, 104, 104, 104, 105, 103, 105, 104, 104, 104, 104, 104, 105, 104, 104, 104, 105, 103, 104, 105, 104, 104, 104, 105, 208, 104, 104, 209, 104, 312, 105, 104, 104, 104, 521, 417, 103, 104, 209, 104, 313, 208, 209, 103, 104, 105, 416],
                [1, 66, 1, 13, 1, 2, 1, 2, 105, 103, 104, 105, 104, 104, 104, 105, 104, 104, 104, 104, 105, 103, 104, 105, 104, 104, 104, 104, 105, 104, 104, 104, 105, 104, 103, 105, 104, 104, 104, 105, 104, 104, 104, 105, 104, 104, 104, 104, 208, 105, 104, 208, 104, 312, 105, 104, 104, 104, 521, 417, 104, 104, 208, 105, 312, 208, 209, 104, 104, 105, 416],
                [1, 66, 1, 6, 1, 6, 1, 2, 1, 2, 105, 104, 104, 104, 105, 103, 104, 105, 104, 104, 104, 104, 105, 104, 104, 105, 104, 103, 104, 105, 104, 104, 104, 104, 105, 104, 104, 104, 104, 104, 105, 104, 104, 104, 104, 104, 105, 104, 104, 104, 208, 105, 104, 208, 104, 312, 105, 104, 104, 104, 521, 417, 104, 105, 207, 104, 314, 208, 208, 104, 104, 105, 416],
                [2, 3, 13, 1, 5, 1, 1, 1, 26, 1, 2, 1, 2, 1, 6, 1, 5, 1, 2, 1, 5, 1, 3, 1, 6, 1, 3, 1, 3, 1, 7, 1, 1, 1, 3, 1, 19, 1, 7, 1, 26, 1, 26, 1, 2, 1, 5, 1, 2, 1, 3, 1, 7, 1, 12, 1, 6, 1, 24, 1, 4, 1, 6, 1, 6, 1, 4, 1, 1, 1, 27, 1, 6, 1, 7, 1, 13, 1, 6, 1, 7, 1, 6, 1, 16, 1, 1, 1, 11, 1, 6, 1, 1, 1, 3, 1, 2, 1, 1, 1, 4, 1, 6, 1, 3, 1, 2, 1, 3, 1, 2, 1, 6, 1, 3, 1, 2, 1, 1, 1, 2, 1, 3, 1, 2, 1, 3, 1, 6, 1, 2, 1, 3, 1, 4, 1, 112, 1, 2, 1, 5, 1, 1, 1, 4, 1, 1, 1, 4, 1, 1, 1, 4, 1, 1, 2, 3, 1, 1, 1, 2, 1, 1, 1, 1, 3, 4, 2, 1, 1, 2, 1, 1, 1, 1, 1, 2, 1, 3, 2, 1, 1, 1, 1, 4, 1, 4, 1, 1, 1, 4, 1, 6, 1, 28, 1, 83, 1, 1, 1, 5, 1, 6, 1, 6, 1, 4, 1, 2, 1, 3, 1, 2, 1, 6, 1, 3, 1, 2, 1, 3, 1, 2, 1, 3, 1, 4, 1, 1, 1, 4, 1, 2, 1, 3, 1, 4, 1, 1, 1, 4, 1, 1, 1, 5, 1, 9, 1, 6, 1, 4, 1, 11, 1, 13, 1, 7, 1, 6, 1, 40, 1, 3, 1, 1, 1, 2, 1, 6, 1, 3, 1, 2, 1, 3, 1, 13, 1, 6, 1, 6, 1, 25, 1, 6, 1, 4, 1, 6, 1, 45, 1, 14, 1, 6, 1, 6, 1, 14, 1, 16, 1, 1, 1, 3, 2, 1, 1, 1, 1, 1, 1, 1, 2, 1, 1, 1, 1, 4, 1, 6, 1, 1, 1, 1, 1, 2, 1, 4, 1, 1, 1, 3, 1, 2, 1, 4, 1, 1, 1, 4, 1, 6, 1, 3, 1, 2, 1, 4, 1, 6, 1, 10, 1, 112, 1, 1, 1, 1, 1, 4, 1, 1, 1, 4, 1, 2, 1, 3, 1, 1, 1, 4, 1, 1, 1, 4, 1, 1, 2, 3, 1, 1, 2, 1, 1, 1, 1, 1, 4, 1, 1, 1, 2, 1, 1, 2, 1, 1, 1, 2, 1, 1, 1, 4, 1, 1, 1, 4, 1, 4, 1, 1, 1, 4, 1, 3, 1, 24, 1, 78, 1, 7, 1, 20, 1, 7, 1, 6, 1, 3, 1, 2, 1, 3, 1, 2, 1, 3, 1, 4, 1, 2, 1, 3, 1, 2, 1, 3, 1, 6, 1, 4, 1, 1, 1, 11, 1, 7, 1, 7, 1, 25, 1, 11, 1, 7, 1, 27, 1, 9, 1, 1, 1, 2, 1, 1, 1, 3, 1, 2, 1, 3, 1, 2, 1, 3, 1, 2, 1, 3, 1, 2, 1, 3, 1, 6, 1, 25, 1, 13, 1, 11, 1, 65, 1, 13, 1, 7, 1, 6, 1, 6, 1, 3, 1, 4, 1, 1, 1, 2, 1, 1, 1, 1, 1, 1, 1, 2, 1, 1, 1, 1, 2, 1, 1, 1, 1, 2, 1, 1, 1, 4, 1, 1, 1, 4, 1, 1, 1, 4, 1, 1, 1, 4, 1, 6, 1, 3, 1, 2, 1, 4, 1, 1, 1, 1, 1, 2, 1, 6, 1, 3, 1, 2, 1, 3, 1, 108, 1, 3, 1, 1, 1, 2, 1, 3, 1, 2, 1, 3, 1, 1, 1, 4, 1, 1, 1, 4, 1, 2, 1, 3, 1, 2, 1, 3, 1, 4, 1, 1, 1, 1, 2, 1, 1, 1, 1, 4, 1, 1, 1, 2, 1, 1, 1, 2, 1, 1, 1, 1, 1, 2, 1, 1, 1, 2, 1, 1, 1, 2, 1, 1, 1, 4, 1, 10, 1, 7, 1, 6, 1, 14, 1, 66, 1, 8, 1, 6, 1, 6, 1, 6, 1, 10, 1, 6, 1, 6, 1, 6, 1, 7, 1, 3, 1, 6, 1, 4, 1, 1, 1, 4, 1, 2, 1, 3, 1, 19, 1, 7, 1, 14, 1, 18, 1, 10, 1, 7, 1, 6, 1, 13, 1, 7, 1, 1, 1, 6, 1, 1, 1, 4, 1, 5, 1, 2, 1, 3, 1, 7, 1, 6, 1, 6, 1, 3, 1, 6, 1, 6, 1, 18, 1, 11, 1, 57, 1, 14, 1, 13, 1, 6, 1, 11, 1, 1, 1, 1, 1, 4, 1, 1, 1, 1, 2, 1, 1, 1, 1, 2, 1, 1, 1, 1, 2, 1, 1, 1, 1, 1, 2, 1, 1, 4, 1, 1, 1, 4, 1, 1, 1, 4, 1, 1, 1, 4, 1, 3, 1, 2, 1, 4, 1, 1, 1, 4, 1, 3, 1, 2, 1, 3, 1, 2, 1, 4, 1, 13, 1, 97, 1, 1, 1, 2, 1, 3, 1, 2, 1, 3, 1, 1, 1, 4, 1, 2, 1, 3, 1, 2, 1, 3, 1, 4, 1, 1, 1, 4, 1, 1, 1, 4, 1, 1, 1, 4, 1, 6, 1, 1, 2, 1, 1, 1, 1, 1, 2, 1, 1, 1, 2, 1, 1, 1, 1, 2, 4, 1, 1, 1, 2, 12, 1, 6, 1, 7, 1, 21, 1, 14, 1, 13, 1, 26, 1, 8, 1, 5, 1, 6, 1, 13, 1, 10, 1, 6, 1, 7, 1, 6, 1, 3, 1, 6, 1, 4, 1, 2, 1, 3, 1, 2, 1, 3, 1, 31, 1, 7, 1, 14, 1, 3, 1, 25, 1, 7, 1, 16, 1, 8, 1, 1, 1, 4, 1, 1, 1, 4, 1, 1, 1, 4, 1, 6, 1, 1, 1, 4, 1, 6, 1, 3, 1, 2, 1, 3, 1, 6, 1, 7, 1, 3, 1, 13, 1, 52, 1, 21, 1, 21, 1, 6, 1, 5, 1, 2, 1, 6, 1, 1, 1, 1, 2, 3, 1, 1, 2, 1, 1, 1, 1, 1, 2, 1, 1, 1, 1, 2, 1, 1, 1, 1, 2, 1, 1, 1, 2, 1, 1, 1, 1, 4, 1, 1, 1, 4, 1, 4, 1, 1, 1, 4, 1, 1, 1, 4, 1, 3, 1, 2, 1, 3, 1, 2, 1, 4, 1, 3, 1, 108, 1, 1, 1, 5, 1, 6, 1, 2, 1, 3, 1, 6, 1, 4, 1, 1, 1, 6, 1, 4, 1, 2, 1, 3, 1, 2, 1, 3, 1, 1, 2, 3, 1, 4, 1, 1, 1, 4, 1, 1, 2, 1, 1, 1, 1, 1, 2, 1, 1, 1, 1, 1, 1, 15, 1, 3, 1, 6, 1, 7, 1, 29, 1, 46, 1, 2, 1, 8, 1, 12, 1, 25, 1, 13, 1, 11, 1, 3, 1, 6, 1, 6, 1, 21, 1, 7, 1, 14, 1, 6, 1, 7, 1, 6, 1, 5, 1, 4, 1, 11, 1, 6, 1, 7, 1, 6, 1, 20, 1, 6, 1, 6, 1, 13, 1, 57, 1, 1, 1, 6, 1, 6, 1, 6, 1, 6, 1, 6, 1, 6, 1, 3, 1, 2, 1, 3, 1, 2, 1, 3, 1, 6, 1, 4, 1, 2, 1, 3, 1, 6, 1, 4, 1, 2, 1, 1, 1, 6, 1, 15, 1, 5, 1, 7, 1, 7, 1, 3, 1, 4, 1, 7, 1, 5, 1, 21, 1, 6, 1, 9, 1, 3, 1, 1, 1, 2, 1, 3, 1, 2, 1, 6, 1, 6, 1, 6, 1, 3, 1, 2, 1, 3, 1, 2, 1, 3, 1, 11, 1, 6, 1, 6, 1, 11, 1, 6, 1, 6, 1, 11, 1, 3, 1, 6, 1, 4, 1, 2, 1, 3, 1, 6, 1, 4, 1, 2, 1, 3, 1, 2, 1, 1, 1, 1, 1, 4, 1, 2, 1, 3, 1, 2, 1, 1, 1, 1, 1, 4, 1, 4, 1, 1, 1, 1, 2, 1, 1, 9, 1, 25, 1, 7, 1, 6, 1, 14, 1, 6, 1, 28, 1, 6, 1, 2, 1, 1, 1, 6, 1, 6, 1, 6, 1, 10, 1, 13, 1, 6, 1, 10, 1, 7, 1, 6, 1, 3, 1, 7, 1, 6, 1, 3, 1, 6, 1, 4, 1, 2, 1, 3, 1, 2, 1, 4, 1, 3, 1, 2, 1, 3, 1, 2, 1, 1, 1, 1, 1, 4, 1, 2, 1, 3, 1, 1, 2, 1, 1, 1, 1, 4, 1, 1, 2, 1, 1, 1, 1, 1, 2, 1, 1, 2, 1, 1, 1, 1, 1, 2, 1, 1, 2, 1, 1, 1, 1, 2, 1, 1, 1, 3, 2, 1, 1, 4, 1, 1, 1, 4, 1, 4, 1, 1, 1, 4, 1, 1, 1, 4, 1, 4, 1, 6, 1, 3, 1, 2, 1, 4, 1, 3, 1, 2, 1, 3, 1, 7, 1, 3, 1, 2, 1, 3, 1, 4, 1, 82, 1, 21, 1, 3, 1, 5, 1, 1, 1, 4, 1, 1, 1, 6, 1, 4, 1, 1, 1, 4, 1, 1, 1, 4, 1, 1, 1, 2, 1, 1, 1, 1, 1, 4, 1, 1, 2, 1, 1, 1, 2, 1, 1, 1, 1, 1, 2, 1, 1, 1, 2, 1, 1, 1, 1, 2, 1, 1, 1, 4, 1, 1, 1, 1, 2, 1, 1, 3, 1, 4, 1, 8, 1, 22, 1, 71, 1, 8, 1, 6, 1, 5, 1, 7, 1, 6, 1, 3, 1, 2, 1, 3, 1, 6, 1, 2, 1, 3, 1, 4, 1, 1, 1, 4, 1, 2, 1, 3, 1, 4, 1, 1, 1, 4, 1, 1, 1, 4, 1, 5, 1, 7, 1, 6, 1, 8, 1, 7, 1, 8, 1, 5, 1, 6, 1, 14, 1, 6, 1, 28, 1, 103, 1, 42, 1, 6, 1, 6, 1, 6, 1, 20, 1, 5, 1, 8, 1, 2, 1, 4, 1, 7, 1, 6, 1, 12, 1, 6, 1, 28, 1, 6, 1, 153, 1, 6, 1, 6, 1, 20, 1, 5, 1, 7, 1, 2, 1, 13, 1, 5, 1, 8, 1, 5, 1, 2, 1, 6, 1, 1, 1, 1, 1, 2, 1, 3, 1, 2, 1, 6, 1, 3, 1, 2, 1, 6, 1, 4, 1, 6, 1, 6, 1, 3, 1, 6, 1, 7, 1, 10, 1, 18, 1, 6, 1, 11, 1, 3, 1, 2, 1, 6, 1, 3, 1, 7, 1, 3, 1, 2, 1, 4, 1, 3, 1, 2, 1, 3, 1, 4, 1, 2, 1, 3, 1, 2, 1, 1, 1, 3, 1, 8, 1, 7, 1, 14, 1, 22, 1, 14, 1, 6, 1, 21, 1, 6, 1, 6, 1, 96, 1, 1, 1, 5, 1, 7, 1, 6, 1, 5, 1, 6, 1, 4, 1, 2, 1, 3, 1, 2, 1, 3, 1, 6, 1, 4, 1, 1, 1, 4, 1, 2, 1, 3, 1, 1, 2, 3, 1, 1, 2, 1, 1, 1, 1, 4, 1, 6, 1, 8, 1, 2, 1, 14, 1, 6, 1, 13, 1, 7, 1, 6, 1, 28, 1, 6, 1, 104, 1, 2, 1, 5, 1, 2, 1, 6, 1, 5, 1, 4, 1, 2, 1, 3, 1, 2, 1, 3, 1, 2, 1, 3, 1, 1, 2, 1, 1, 1, 1, 1, 2, 1, 1, 1, 1, 4, 1, 1, 1, 4, 1, 1, 2, 1, 1, 1, 1, 2, 1, 1, 1, 1, 2, 1, 4, 1, 1, 2, 1, 22, 1, 6, 1, 162, 1, 6, 1, 35, 1, 6, 1, 6, 1, 5, 1, 7, 1, 3, 1, 3, 1, 8, 1, 5, 1, 20, 1, 4, 1, 4, 1, 1, 1, 1, 1, 4, 1, 1, 1, 3, 1, 2, 1, 3, 1, 2, 1, 4, 1, 6, 1, 6, 1, 6, 1, 10, 1, 18, 1, 6, 1, 6, 1, 11, 1, 11, 1, 5, 1, 7, 1, 3, 1, 6, 1, 4, 1, 2, 1, 3, 1, 4, 1, 1, 1, 4, 1, 2, 1, 4, 1, 3, 1, 6, 1, 4, 1, 1, 1, 4, 1, 22, 1, 17, 1, 6, 1, 7, 1, 6, 1, 21, 1, 6, 1, 28, 1, 98, 1, 2, 1, 3, 1, 2, 1, 3, 1, 2, 1, 3, 1, 2, 1, 3, 1, 2, 1, 3, 1, 6, 1, 4, 1, 1, 1, 4, 1, 2, 1, 3, 1, 1, 1, 4, 1, 1, 2, 1, 1, 1, 1, 4, 1, 1, 1, 4, 1, 1, 2, 1, 1, 1, 1, 4, 1, 10, 1, 5, 1, 14, 1, 14, 1, 35, 1, 21, 1, 1, 1, 5, 1, 7, 1, 5, 1, 6, 1, 6, 1, 24, 1, 7, 1, 3, 1, 2, 1, 3, 1, 7, 1, 3, 1, 2, 1, 33, 1, 14, 1, 6, 1, 6, 1, 14, 1, 2, 1, 1, 1, 11, 1, 5, 1, 6, 1, 6, 1, 28, 1, 146, 1, 6, 1, 6, 1, 34, 1, 6, 1, 7, 1, 5, 1, 2, 1, 8, 1, 4, 1, 5, 1, 6, 1, 6, 1, 7, 1, 17, 1, 1, 1, 5, 1, 2, 1, 3, 1, 2, 1, 6, 1, 6, 1, 6, 1, 3, 1, 2, 1, 3, 1, 13, 1, 11, 1, 6, 1, 48, 1, 36, 1, 13, 1, 6, 1, 7, 1, 6, 1, 2, 1, 1, 1, 1, 2, 3, 1, 2, 1, 1, 1, 1, 1, 2, 1, 1, 1, 1, 2, 1, 1, 1, 1, 1, 2, 1, 1, 1, 1, 4, 1, 1, 1, 4, 1, 3, 2, 1, 1, 4, 1, 1, 1, 4, 1, 1, 1, 4, 1, 3, 1, 2, 1, 3, 1, 2, 1, 4, 1, 3, 1, 2, 1, 3, 1, 2, 1, 4, 1, 10, 1, 6, 1, 11, 1, 11, 1, 13, 1, 11, 1, 3, 1, 6, 1, 7, 1, 3, 1, 37, 1, 6, 1, 22, 1, 6, 1, 6, 1, 11, 1, 3, 1, 7, 1, 3, 1, 6, 1, 1, 1, 1, 1, 4, 1, 1, 1, 4, 1, 1, 1, 4, 1, 1, 1, 4, 1, 1, 1, 4, 1, 6, 1, 4, 1, 1, 1, 3, 1, 7, 1, 3, 1, 2, 1, 3, 1, 2, 1, 3, 1, 7, 1, 3, 1, 82, 1, 6, 1, 20, 1, 14, 1, 6, 1, 6, 1, 6, 1, 29, 1, 6, 1, 6, 1, 6, 1, 6, 1, 8, 1, 6, 1, 1, 1, 3, 1, 2, 1, 3, 1, 2, 1, 3, 1, 2, 1, 6, 1, 3, 1, 2, 1, 3, 1, 6, 1, 6, 1, 7, 1, 10, 1, 18, 1, 41, 1, 57, 1, 7, 1, 16, 1, 18, 1, 6, 1, 7, 1, 6, 1, 20, 1, 6, 1, 6, 1, 153, 1, 6, 1, 20, 1, 21, 1, 13, 1, 1, 1, 1, 1, 1, 1, 1, 1, 2, 1, 1, 1, 2, 1, 1, 1, 6, 1, 1, 1, 1, 1, 2, 1, 4, 1, 1, 1, 3, 1, 2, 1, 4, 1, 1, 1, 3, 1, 7, 1, 3, 1, 2, 1, 3, 1, 2, 1, 3, 1, 7, 1, 3, 1, 107, 1, 4, 1, 2, 1, 5, 1, 2, 1, 3, 1, 1, 1, 4, 1, 1, 1, 4, 1, 1, 1, 4, 1, 1, 2, 3, 1, 1, 1, 4, 1, 1, 2, 3, 1, 1, 2, 1, 1, 1, 1, 2, 1, 1, 1, 2, 1, 1, 1, 2, 1, 1, 1, 4, 1, 1, 1, 4, 1, 3, 2, 1, 1, 43, 1, 21, 1, 111, 1, 6, 1, 21, 1, 6, 1, 6, 1, 6, 1, 6, 1, 6, 1, 10, 1, 1, 1, 2, 1, 7, 1, 5, 1, 6, 1, 6, 1, 6, 1, 13, 1, 6, 1, 6, 1, 8, 1, 3, 1, 2, 1, 5, 1, 7, 1, 6, 1, 6, 1, 5, 1, 4, 1, 6, 1, 11, 1, 13, 1, 48, 1, 14, 1, 6, 1, 21, 1, 6, 1, 6, 1, 7, 1, 6, 1, 15, 1, 5, 1, 6, 1, 6, 1, 28, 1, 167, 1, 6, 1, 13, 1, 6, 1, 6, 1, 30, 1, 5, 1, 6, 1, 6, 1, 6, 1, 28, 1, 6, 1, 13, 1, 110, 1, 27, 1, 28, 1, 6, 1, 30, 1, 19, 1, 6, 1, 6, 1, 49, 1, 103, 1, 6, 1, 6, 1, 13, 1, 27, 1, 5, 1, 1, 1, 1, 1, 1, 2, 1, 1, 1, 1, 2, 1, 1, 1, 1, 1, 2, 1, 1, 1, 2, 1, 1, 1, 3, 2, 1, 1, 4, 1, 1, 1, 4, 1, 1, 1, 4, 1, 1, 1, 4, 1, 3, 1, 2, 1, 4, 1, 1, 1, 4, 1, 1, 1, 4, 1, 3, 1, 2, 1, 4, 1, 148, 1, 6, 1, 6, 1, 6, 1, 6, 1, 19, 1, 16, 1, 6, 1, 6, 1, 7, 1, 20, 1, 27, 1, 110, 1, 56, 1, 6, 1, 6, 1, 6, 1, 4, 1, 16, 1, 6, 1, 7, 1, 6, 1, 20, 1, 6, 1, 89, 1, 6, 1, 6, 1, 6, 1, 6, 1, 3, 1, 2, 1, 3, 1, 6, 1, 6, 1, 4, 1, 2, 1, 3, 1, 2, 1, 3, 1, 6, 1, 4, 1, 2, 1, 3, 1, 2, 1, 14, 1, 6, 1, 6, 1, 8, 1, 3, 1, 3, 1, 7, 1, 6, 1, 6, 1, 6, 1, 14, 1, 6, 1, 6, 1, 14, 1, 131, 1, 28, 1, 6, 1, 6, 1, 6, 1, 5, 1, 6, 1, 6, 1, 2, 1, 5, 1, 7, 1, 6, 1, 20, 1, 6, 1, 167, 1, 6, 1, 6, 1, 6, 1, 6, 1, 20, 1, 6, 1, 6, 1, 2, 1, 5, 1, 7, 1, 5, 1, 6, 1, 6, 1, 14, 1, 20, 1, 159, 1, 1, 1, 1, 1, 6, 1, 2, 1, 3, 1, 1, 1, 4, 1, 1, 2, 3, 1, 1, 1, 2, 1, 1, 1, 1, 3, 2, 1, 1, 2, 1, 1, 1, 2, 1, 1, 1, 1, 2, 1, 3, 2, 1, 1, 1, 1, 2, 1, 1, 1, 4, 1, 6, 1, 3, 1, 2, 1, 4, 1, 2, 1, 8, 1, 156, 1, 6, 1, 6, 1, 6, 1, 20, 1, 6, 1, 7, 1, 5, 1, 2, 1, 8, 1, 3, 1, 13, 1, 7, 1, 27, 1, 6, 1, 131, 1, 35, 1, 6, 1, 6, 1, 6, 1, 6, 1, 13, 1, 2, 1, 7, 1, 4, 1, 20, 1, 6, 1, 6, 1, 28, 1, 13, 1, 117, 1, 13, 1, 34, 1, 7, 1, 6, 1, 5, 1, 2, 1, 7, 1, 5, 1, 20, 1, 6, 1, 13, 1, 6, 1, 167, 1, 6, 1, 20, 1, 6, 1, 7, 1, 5, 1, 2, 1, 7, 1, 5, 1, 5, 1, 6, 1, 6, 1, 28, 1, 6, 1, 181, 1, 6, 1, 6, 1, 12, 1, 2, 1, 7, 1, 5, 1, 20, 1, 6, 1, 6, 1, 6, 1, 41, 1, 2, 1, 8, 1, 6, 1, 3, 1, 20, 1, 13, 1, 6, 1, 3, 1, 6, 1, 7, 1, 6, 1, 3, 1, 4, 1, 2, 1, 3, 1, 6, 1, 4, 1, 1, 1, 4, 1, 2, 1, 3, 1, 4, 1, 2, 1, 3, 1, 1, 2, 1, 1, 1, 1, 4, 1, 1, 1, 2, 1, 1, 1, 1, 2, 1, 1, 1, 1, 1, 2, 1, 1, 1, 3, 2, 1, 2, 1, 2, 3, 1, 1, 1, 2, 1, 1, 4, 1, 1, 1, 4, 1, 1, 1, 2, 1, 1, 1, 4, 1, 1, 1, 3, 1, 4, 1, 2, 1, 4, 1, 6, 1, 3, 1, 2, 1, 3, 1, 2, 1, 4, 1, 3, 1, 2, 1, 4, 1, 6, 1, 3, 1, 6, 1, 4, 1, 109, 1, 2, 1, 1, 1, 2, 1, 3, 1, 1, 1, 4, 1, 1, 1, 4, 1, 1, 1, 4, 1, 1, 1, 2, 1, 1, 1, 1, 2, 3, 1, 4, 1, 1, 1, 2, 1, 1, 2, 1, 1, 1, 1, 1, 2, 1, 1, 1, 1, 4, 1, 4, 1, 1, 1, 4, 1, 1, 1, 4, 1, 3, 1, 2, 1, 37, 1, 7, 1, 65, 1, 2, 1, 5, 1, 6, 1, 6, 1, 7, 1, 3, 1, 2, 1, 3, 1, 2, 1, 3, 1, 6, 1, 4, 1, 1, 1, 7, 1, 3, 1, 4, 1, 1, 1, 2, 1, 1, 1, 1, 1, 4, 1, 1, 1, 2, 1, 4, 1, 7, 1, 16, 1, 14, 1, 7, 1, 59, 1, 6, 1, 2, 1, 6, 1, 3, 1, 13, 1, 6, 1, 25, 1, 6, 1, 10, 1, 6, 1, 2, 1, 22, 1, 14, 1, 14, 1, 6, 1, 20, 1, 6, 1, 6, 1, 2, 1, 5, 1, 7, 1, 6, 1, 6, 1, 6, 1, 6, 1, 28, 1, 6, 1, 131, 1, 35, 1, 6, 1, 6, 1, 5, 1, 6, 1, 6, 1, 2, 1, 13, 1, 6, 1, 6, 1, 13, 1, 6, 1, 6, 1, 160, 1, 13, 1, 13, 1, 14, 1, 5, 1, 5, 1, 7, 1, 2, 1, 5, 1, 7, 1, 5, 1, 6, 1, 39, 1, 3, 1, 1, 1, 2, 1, 3, 1, 2, 1, 3, 1, 2, 1, 3, 1, 2, 1, 6, 1, 3, 1, 6, 1, 32, 1, 10, 1, 7, 1, 68, 1, 20, 1, 6, 1, 7, 1, 5, 1, 2, 1, 7, 1, 5, 1, 20, 1, 6, 1, 13, 1, 6, 1, 167, 1, 6, 1, 20, 1, 6, 1, 7, 1, 5, 1, 2, 1, 6, 1, 1, 1, 3, 1, 6, 1, 6, 1, 7, 1, 27, 1, 6, 1, 78, 1, 6, 1, 6, 1, 5, 1, 6, 1, 7, 1, 3, 1, 6, 1, 4, 1, 1, 1, 4, 1, 2, 1, 3, 1, 2, 1, 3, 1, 4, 1, 2, 1, 41, 1, 16, 1, 11, 1, 7, 1, 29, 1, 5, 1, 2, 1, 3, 1, 2, 1, 1, 1, 3, 1, 2, 1, 4, 1, 5, 1, 7, 1, 3, 1, 2, 1, 3, 1, 6, 1, 6, 1, 4, 1, 13, 1, 6, 1, 4, 1, 6, 1, 6, 1, 3, 1, 7, 1, 3, 1, 2, 1, 3, 1, 4, 1, 2, 1, 3, 1, 6, 1, 4, 1, 2, 1, 3, 1, 6, 1, 4, 1, 2, 1, 3, 1, 4, 1, 1, 1, 4, 1, 1, 1, 2, 1, 3, 1, 9, 1, 5, 1, 2, 1, 7, 1, 6, 1, 6, 1, 6, 1, 7, 1, 6, 1, 6, 1, 14, 1, 123, 1, 2, 1, 1, 1, 3, 1, 2, 1, 3, 1, 2, 1, 3, 1, 2, 1, 3, 1, 6, 1, 1, 1, 4, 1, 6, 1, 4, 1, 1, 1, 4, 1, 1, 1, 4, 1, 1, 2, 3, 1, 2, 1, 1, 1, 1, 1, 2, 1, 1, 1, 2, 1, 1, 2, 1, 1, 1, 1, 11, 1, 7, 1, 7, 1, 212, 1, 6, 1, 6, 1, 13, 1, 15, 1, 27, 1, 6, 1, 6, 1, 153, 1, 6, 1, 6, 1, 6, 1, 6, 1, 20, 1, 7, 1, 13, 1, 3, 1, 11, 1, 5, 1, 6, 1, 7, 1, 27, 1, 80, 1, 20, 1, 2775, 3, 20, 1, 16, 1, 2, 1, 17],
                [1, 53, 1, 9, 1, 3, 1, 6, 1, 5, 2, 2, 1, 1, 105, 104, 104, 104, 105, 103, 104, 105, 104, 104, 104, 104, 105, 104, 104, 104, 105, 103, 105, 104, 104, 104, 104, 104, 105, 104, 104, 104, 105, 103, 104, 105, 104, 104, 104, 105, 104, 104, 104, 104, 208, 105, 104, 208, 104, 313, 104, 104, 104, 104, 521, 417, 104, 104, 208, 104, 313, 209, 208, 104, 104, 104, 417],
                [1, 69, 1, 6, 1, 6, 1, 1, 105, 104, 104, 105, 104, 104, 104, 105, 104, 104, 104, 104, 104, 104, 104, 105, 104, 104, 104, 105, 104, 104, 104, 105, 104, 103, 104, 105, 104, 104, 104, 104, 105, 104, 104, 104, 105, 103, 104, 105, 208, 104, 105, 208, 104, 312, 105, 104, 104, 104, 521, 417, 104, 104, 208, 105, 312, 208, 209, 104, 104, 104, 417],
                [1, 66, 1, 9, 1, 3, 1, 4, 105, 104, 105, 104, 104, 104, 104, 105, 104, 104, 104, 104, 105, 103, 105, 104, 104, 104, 104, 105, 104, 104, 104, 104, 104, 104, 104, 105, 104, 104, 104, 105, 104, 104, 104, 104, 105, 103, 104, 105, 208, 105, 104, 208, 104, 312, 105, 104, 104, 104, 521, 417, 104, 104, 208, 104, 313, 208, 209, 104, 104, 105, 416],
                [1, 51, 1, 13, 1, 3, 3, 6, 106, 105, 103, 105, 104, 105, 104, 103, 105, 104, 104, 104, 105, 104, 104, 104, 104, 104, 104, 105, 104, 104, 104, 104, 104, 105, 103, 105, 105, 104, 104, 103, 104, 105, 104, 104, 105, 104, 104, 103, 209, 105, 104],
                [2, 72, 1, 5, 1, 2, 106, 105, 103, 105, 104, 105, 103, 104, 104, 104, 105, 104, 105, 103, 105, 104, 104, 104, 104, 105, 103, 105, 104, 104, 104, 105, 103, 105, 103, 105, 104, 104, 104, 104, 105, 104, 104, 104, 105, 103, 209, 104, 105],
                [1, 78, 3, 1, 106, 104, 104, 104, 104, 105, 104, 104, 104, 104, 104, 105, 104, 104, 105, 103, 104, 104, 104, 105, 104, 105, 104, 103, 105, 104, 104, 105, 104, 104, 104, 104, 104, 104, 104, 105, 104, 104, 105, 103, 208, 105, 103],
                [1, 83, 1, 1, 105, 104, 104, 104, 105, 104, 104, 104, 105, 104, 104, 104, 105, 103, 104, 104, 105, 104, 104, 104, 105, 103, 105, 103, 105, 104, 104, 104, 105, 104, 104, 104, 105, 104, 104, 104, 104, 104, 104, 105, 208, 104, 104, 208, 104, 313, 105, 104, 104, 103, 522, 416, 104, 104, 209, 104, 313, 208, 209, 104, 103, 105, 416],
                [1, 80, 1, 2, 1, 1, 105, 104, 104, 104, 105, 104, 104, 104, 104, 105, 104, 104, 104, 104, 104, 105, 104, 104, 104, 104, 104, 104, 104, 105, 104, 104, 104, 104, 105, 104, 104, 104, 104, 105, 103, 105, 104, 104, 104, 104, 208, 105, 104, 208, 104, 313, 105, 104, 103, 104, 522, 416, 104, 104, 209, 104, 313, 208, 208, 104, 104, 105, 416],
                [1, 73, 1, 2, 1, 9, 105, 104, 104, 104, 105, 103, 104, 105, 104, 104, 104, 105, 104, 104, 104, 104, 105, 103, 105, 104, 104, 104, 104, 105, 104, 104, 104, 104, 104, 104, 104, 105, 104, 104, 104, 105, 104, 104, 104, 104, 208, 105, 104, 208, 104, 313, 104, 104, 104, 104, 522, 416, 104, 104, 208, 105, 312, 209, 208, 104, 104, 105, 416],
                [1, 13, 2, 4, 1, 9, 1, 4, 2, 9, 1, 4, 2, 3, 3, 4, 1, 9, 1, 3, 3, 4, 2, 2, 105, 105, 104, 103, 105, 104, 104, 104, 105, 104, 104, 104, 104, 104, 104, 105, 104, 104, 104, 104, 105, 103, 104, 106, 104, 104, 104, 103, 105, 104, 104, 105, 104, 104, 104, 104, 104, 104, 104, 104, 209, 104, 105],
                [1, 9, 3, 3, 2, 9, 1, 4, 2, 4, 2, 8, 1, 4, 2, 4, 2, 4, 2, 2, 1, 5, 2, 3, 3, 3, 2, 2, 106, 104, 104, 103, 105, 104, 104, 105, 104, 104, 104, 104, 105, 103, 104, 106, 103, 105, 104, 103, 105, 103, 105, 105, 104, 104, 104, 103, 105, 104, 104, 105, 104, 104, 104, 104, 105, 104, 103, 106, 207, 104, 105],]

        found_tolerances = []
        print()
        for i, plateau_lengths in enumerate(data):
            found_tolerances.append(AutoInterpretation.estimate_tolerance_from_plateau_lengths(plateau_lengths))

        print(found_tolerances)
        estimated_tolerance = AutoInterpretation.get_most_frequent_value(found_tolerances)
        self.assertIn(estimated_tolerance, range(4, 7))
Пример #3
0
 def test_merge_plateau_lengths(self):
     self.assertEqual(AutoInterpretation.merge_plateau_lengths([]), [])
     self.assertEqual(AutoInterpretation.merge_plateau_lengths([42]), [42])
     self.assertEqual(AutoInterpretation.merge_plateau_lengths([100, 100, 100]), [100, 100, 100])
     self.assertEqual(self.__run_merge([100, 49, 1, 50, 100]), [100, 100, 100])
     self.assertEqual(self.__run_merge([100, 48, 2, 50, 100]), [100, 100, 100])
     self.assertEqual(self.__run_merge([100, 100, 67, 1, 10, 1, 21]), [100, 100, 100])
     self.assertEqual(self.__run_merge([100, 100, 67, 1, 10, 1, 21, 100, 50, 1, 49]), [100, 100, 100, 100, 100])
Пример #4
0
    def test_ook_detection(self):
        data = np.fromfile(get_path_for_data_file("ask.complex"), dtype=np.complex64)
        mod = AutoInterpretation.detect_modulation(data)
        self.assertEqual(mod, "OOK")

        data = np.fromfile(get_path_for_data_file("ASK_mod.complex"), dtype=np.complex64)
        mod = AutoInterpretation.detect_modulation(data)
        self.assertEqual(mod, "OOK")
Пример #5
0
    def test_ook_detection(self):
        data = np.fromfile(get_path_for_data_file("ask.complex"), dtype=np.complex64)
        mod = AutoInterpretation.detect_modulation(data)
        self.assertEqual(mod, "OOK")

        data = np.fromfile(get_path_for_data_file("ASK_mod.complex"), dtype=np.complex64)
        mod = AutoInterpretation.detect_modulation(data)
        self.assertEqual(mod, "OOK")
Пример #6
0
    def test_get_bit_length_from_plateau_length(self):
        self.assertEqual(
            AutoInterpretation.get_bit_length_from_plateau_lengths([]), 0)
        self.assertEqual(
            AutoInterpretation.get_bit_length_from_plateau_lengths([42]), 42)
        plateau_lengths = [
            2, 1, 2, 73, 1, 26, 100, 40, 1, 59, 100, 47, 1, 52, 67, 1, 10, 1,
            21, 33, 1, 66, 100, 5, 1, 3, 1, 48, 1, 27, 1, 8
        ]
        merged_lengths = AutoInterpretation.merge_plateau_lengths(
            plateau_lengths)
        self.assertEqual(
            AutoInterpretation.get_bit_length_from_plateau_lengths(
                merged_lengths), 100)

        plateau_lengths = [
            1, 292, 331, 606, 647, 286, 645, 291, 334, 601, 339, 601, 338, 602,
            337, 603, 338, 604, 336, 605, 337, 600, 338, 605, 646
        ]
        merged_lengths = AutoInterpretation.merge_plateau_lengths(
            plateau_lengths)
        self.assertEqual(
            AutoInterpretation.get_bit_length_from_plateau_lengths(
                merged_lengths), 300)

        plateau_lengths = [
            3, 8, 8, 8, 8, 8, 8, 8, 8, 16, 8, 8, 16, 32, 8, 8, 8, 8, 8, 24, 8,
            24, 8, 24, 8, 24, 8, 24, 16, 16, 24, 8
        ]
        merged_lengths = AutoInterpretation.merge_plateau_lengths(
            plateau_lengths)
        self.assertEqual(
            AutoInterpretation.get_bit_length_from_plateau_lengths(
                merged_lengths), 8)
Пример #7
0
    def auto_detect(self, emit_update=True, detect_modulation=True, detect_noise=False) -> bool:
        kwargs = {"noise": None if detect_noise else self.noise_threshold,
                  "modulation": None if detect_modulation
                  else "OOK" if self.__modulation_order == 2 and self.__modulation_type == 0
                  else self.modulation_type_str}

        estimated_params = AutoInterpretation.estimate(self.data, **kwargs)
        if estimated_params is None:
            return False

        orig_block = self.block_protocol_update
        self.block_protocol_update = True

        if detect_noise:
            self.noise_threshold = estimated_params["noise"]

        if detect_modulation:
            self.modulation_type_str = estimated_params["modulation_type"]

        self.qad_center = estimated_params["center"]
        self.tolerance = estimated_params["tolerance"]
        self.bit_len = estimated_params["bit_length"]

        self.block_protocol_update = orig_block

        if emit_update and not self.block_protocol_update:
            self.protocol_needs_update.emit()

        return True
Пример #8
0
    def auto_detect(self,
                    emit_update=True,
                    detect_modulation=True,
                    detect_noise=False) -> bool:
        kwargs = {
            "noise":
            None if detect_noise else self.noise_threshold,
            "modulation":
            None if detect_modulation else "OOK" if self.bits_per_symbol == 1
            and self.modulation_type == "ASK" else self.modulation_type
        }

        estimated_params = AutoInterpretation.estimate(self.iq_array, **kwargs)
        if estimated_params is None:
            return False

        orig_block = self.block_protocol_update
        self.block_protocol_update = True

        if detect_noise:
            self.noise_threshold = estimated_params["noise"]

        if detect_modulation:
            self.modulation_type = estimated_params["modulation_type"]

        self.center = estimated_params["center"]
        self.tolerance = estimated_params["tolerance"]
        self.samples_per_symbol = estimated_params["bit_length"]

        self.block_protocol_update = orig_block

        if emit_update and not self.block_protocol_update:
            self.protocol_needs_update.emit()

        return True
Пример #9
0
 def test_get_bit_length_from_merged_plateau_lengths(self):
     merged_lengths = [
         40, 40, 40, 40, 40, 30, 50, 30, 90, 40, 40, 80, 160, 30, 50, 30
     ]
     self.assertEqual(
         AutoInterpretation.get_bit_length_from_plateau_lengths(
             merged_lengths), 40)
Пример #10
0
    def test_audi(self):
        path = self.get_path("audi_auf_sr5m.coco")
        if not path:
            return

        data = Signal(path, "").iq_array

        result = AutoInterpretation.estimate(data)
        mod_type, bit_length = result["modulation_type"], result["bit_length"]
        center, noise, tolerance = result["center"], result["noise"], result[
            "tolerance"]

        self.assertEqual(mod_type, "ASK")
        self.assertGreaterEqual(bit_length, 2400)
        self.assertLessEqual(bit_length, 2500)
        self.assertGreaterEqual(center, 0.005)
        self.assertLessEqual(center, 0.32)

        print("noise", noise, "center", center, "bit length", bit_length,
              "tolerance", tolerance)
        demodulated = demodulate(data, mod_type, bit_length, center, noise,
                                 tolerance)
        print(demodulated)
        self.assertEqual(len(demodulated), 1)
        self.assertTrue(demodulated[0].startswith(
            "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"))
        self.assertTrue(demodulated[0].endswith("cad4c"))
Пример #11
0
    def test_brennenstuhl(self):
        path = self.get_path("brennenstuhl_signal_ABCD_onoff.coco")
        if not path:
            return

        data = Signal(path, "").iq_array

        result = AutoInterpretation.estimate(data)
        mod_type, bit_length = result["modulation_type"], result["bit_length"]
        center, noise, tolerance = result["center"], result["noise"], result[
            "tolerance"]

        self.assertEqual(mod_type, "ASK")
        self.assertEqual(bit_length, 300)

        print("noise", noise, "center", center, "bit length", bit_length,
              "tolerance", tolerance)
        demodulated = demodulate(data,
                                 mod_type,
                                 bit_length,
                                 center,
                                 noise,
                                 tolerance,
                                 pause_threshold=8)
        print(demodulated)
        self.assertEqual(len(demodulated), 64)
        for i in range(64):
            self.assertTrue(demodulated[i].startswith("88888888888"))
            self.assertEqual(len(demodulated[i]), len(demodulated[0]))
Пример #12
0
    def auto_detect(self,
                    emit_update=True,
                    detect_modulation=True,
                    detect_noise=False):
        kwargs = {
            "noise":
            None if detect_noise else self.noise_threshold,
            "modulation":
            None
            if detect_modulation else "OOK" if self.__modulation_order == 2
            and self.__modulation_type == 0 else self.modulation_type_str
        }

        estimated_params = AutoInterpretation.estimate(self.data, **kwargs)
        if estimated_params is None:
            return

        orig_block = self.block_protocol_update
        self.block_protocol_update = True

        if detect_noise:
            self.noise_threshold = estimated_params["noise"]

        if detect_modulation:
            self.modulation_type_str = estimated_params["modulation_type"]

        self.qad_center = estimated_params["center"]
        self.tolerance = estimated_params["tolerance"]
        self.bit_len = estimated_params["bit_length"]

        self.block_protocol_update = orig_block

        if emit_update and not self.block_protocol_update:
            self.protocol_needs_update.emit()
Пример #13
0
    def test_ask50_detection(self):
        message_indices = [(0, 8000), (18000, 26000), (36000, 44000), (54000, 62000), (72000, 80000)]
        data = np.fromfile(get_path_for_data_file("ask50.complex"), dtype=np.complex64)

        for start, end in message_indices:
            mod = AutoInterpretation.detect_modulation(data[start:end])
            self.assertEqual(mod, "ASK", msg="{}/{}".format(start, end))
Пример #14
0
    def test_ask50_detection(self):
        message_indices = [(0, 8000), (18000, 26000), (36000, 44000), (54000, 62000), (72000, 80000)]
        data = np.fromfile(get_path_for_data_file("ask50.complex"), dtype=np.complex64)

        for start, end in message_indices:
            mod = AutoInterpretation.detect_modulation(data[start:end])
            self.assertEqual(mod, "ASK", msg="{}/{}".format(start, end))
Пример #15
0
    def test_auto_interpretation_elektromaten(self):
        data = Signal(get_path_for_data_file("elektromaten.coco"), "").iq_array
        result = AutoInterpretation.estimate(data)

        mod_type, bit_length = result["modulation_type"], result["bit_length"]
        center, noise, tolerance = result["center"], result["noise"], result[
            "tolerance"]

        self.assertEqual(mod_type, "ASK")
        self.assertEqual(bit_length, 600)

        demodulated = demodulate(data,
                                 mod_type,
                                 bit_length,
                                 center,
                                 noise,
                                 tolerance,
                                 pause_threshold=8)
        self.assertEqual(len(demodulated), 11)
        for i in range(11):
            self.assertTrue(demodulated[i].startswith("8"))

        # Test with added 20% noise
        np.random.seed(5)
        noise = np.random.normal(loc=0, scale=1, size=2 * len(data)).astype(
            np.float32).view(np.complex64)
        noised_data = data.as_complex64() + 0.2 * np.mean(
            data.magnitudes) * noise
        result = AutoInterpretation.estimate(noised_data)

        mod_type, bit_length = result["modulation_type"], result["bit_length"]
        center, noise, tolerance = result["center"], result["noise"], result[
            "tolerance"]

        self.assertEqual(mod_type, "ASK")
        self.assertEqual(bit_length, 600)

        demodulated = demodulate(noised_data,
                                 mod_type,
                                 bit_length,
                                 center,
                                 noise,
                                 tolerance,
                                 pause_threshold=8)
        self.assertEqual(len(demodulated), 11)
        for i in range(11):
            self.assertTrue(demodulated[i].startswith("8"))
Пример #16
0
    def test_fsk_detection(self):
        fsk_signal = np.fromfile(get_path_for_data_file("fsk.complex"),
                                 dtype=np.complex64)[5:15000]

        mod = AutoInterpretation.detect_modulation(fsk_signal,
                                                   wavelet_scale=4,
                                                   median_filter_order=7)
        self.assertEqual(mod, "FSK")
Пример #17
0
    def test_psk_detection(self):
        modulator = Modulator("")
        modulator.modulation_type_str = "PSK"
        modulator.param_for_zero = 0
        modulator.param_for_one = 180

        data = modulator.modulate("10101010111000")
        mod = AutoInterpretation.detect_modulation(data)
        self.assertEqual(mod, "PSK")
Пример #18
0
    def test_psk_detection(self):
        modulator = Modulator("")
        modulator.modulation_type_str = "PSK"
        modulator.param_for_zero = 0
        modulator.param_for_one = 180

        data = modulator.modulate("10101010111000")
        mod = AutoInterpretation.detect_modulation(data)
        self.assertEqual(mod, "PSK")
Пример #19
0
    def test_psk_detection(self):
        modulator = Modulator("")
        modulator.modulation_type = "PSK"
        modulator.parameters[0] = 0
        modulator.parameters[1] = 180

        data = modulator.modulate("10101010111000")
        mod = AutoInterpretation.detect_modulation(data)
        self.assertEqual(mod, "PSK")
Пример #20
0
 def test_tolerant_greatest_common_divisor(self):
     self.assertEqual(AutoInterpretation.get_tolerant_greatest_common_divisor([]), 1)
     self.assertEqual(AutoInterpretation.get_tolerant_greatest_common_divisor([22]), 1)
     self.assertEqual(AutoInterpretation.get_tolerant_greatest_common_divisor([10, 5, 5]), 5)
     self.assertEqual(AutoInterpretation.get_tolerant_greatest_common_divisor([100, 100, 100]), 100)
     self.assertEqual(AutoInterpretation.get_tolerant_greatest_common_divisor([100, 100, 200, 300, 100, 400]), 100)
     self.assertEqual(AutoInterpretation.get_tolerant_greatest_common_divisor([100, 101, 100, 100]), 100)
     self.assertEqual(AutoInterpretation.get_tolerant_greatest_common_divisor([100, 101, 202, 301, 100, 500]), 100)
Пример #21
0
 def test_tolerant_greatest_common_divisor(self):
     self.assertEqual(AutoInterpretation.get_tolerant_greatest_common_divisor([]), 1)
     self.assertEqual(AutoInterpretation.get_tolerant_greatest_common_divisor([22]), 1)
     self.assertEqual(AutoInterpretation.get_tolerant_greatest_common_divisor([10, 5, 5]), 5)
     self.assertEqual(AutoInterpretation.get_tolerant_greatest_common_divisor([100, 100, 100]), 100)
     self.assertEqual(AutoInterpretation.get_tolerant_greatest_common_divisor([100, 100, 200, 300, 100, 400]), 100)
     self.assertEqual(AutoInterpretation.get_tolerant_greatest_common_divisor([100, 101, 100, 100]), 100)
     self.assertEqual(AutoInterpretation.get_tolerant_greatest_common_divisor([100, 101, 202, 301, 100, 500]), 100)
Пример #22
0
 def test_merge_plateau_lengths(self):
     self.assertEqual(AutoInterpretation.merge_plateau_lengths([]), [])
     self.assertEqual(AutoInterpretation.merge_plateau_lengths([42]), [42])
     self.assertEqual(AutoInterpretation.merge_plateau_lengths([100, 100, 100]), [100, 100, 100])
     self.assertEqual(AutoInterpretation.merge_plateau_lengths([100, 49, 1, 50, 100]), [100, 100, 100])
     self.assertEqual(AutoInterpretation.merge_plateau_lengths([100, 48, 2, 50, 100]), [100, 100, 100])
     self.assertEqual(AutoInterpretation.merge_plateau_lengths([100, 100, 67, 1, 10, 1, 21]), [100, 100, 100])
     self.assertEqual(AutoInterpretation.merge_plateau_lengths([100, 100, 67, 1, 10, 1, 21, 100, 50, 1, 49]),
                      [100, 100, 100, 100, 100])
    def test_auto_interpretation_ask(self):
        ask_signal = np.fromfile(get_path_for_data_file("ask.complex"), dtype=np.float32)
        result = AutoInterpretation.estimate(ask_signal)
        mod_type, bit_length = result["modulation_type"], result["bit_length"]
        center, noise, tolerance = result["center"], result["noise"], result["tolerance"]
        self.assertEqual(mod_type, "ASK")
        self.assertEqual(bit_length, 300)
        self.assertGreater(tolerance, 0)
        self.assertLessEqual(tolerance, 6)

        self.assertEqual(demodulate(ask_signal, mod_type, bit_length, center, noise, tolerance)[0], "b25b6db6c80")
Пример #24
0
    def __init__(self,
                 filename: str,
                 name="Signal",
                 modulation: str = None,
                 sample_rate: float = 1e6,
                 parent=None):
        super().__init__(parent)
        self.__name = name
        self.__tolerance = 5
        self.__samples_per_symbol = 100
        self.__pause_threshold = 8
        self.__message_length_divisor = 1
        self.__costas_loop_bandwidth = 0.1
        self._qad = None
        self.__center = 0
        self._noise_threshold = 0
        self.__sample_rate = sample_rate
        self.noise_min_plot = 0
        self.noise_max_plot = 0
        self.block_protocol_update = False

        self.iq_array = IQArray(None, np.int8, 1)

        self.wav_mode = filename.endswith(".wav")
        self.__changed = False
        if modulation is None:
            modulation = "FSK"
        self.__modulation_type = modulation
        self.__bits_per_symbol = 1
        self.__center_spacing = 1  # required for higher order modulations

        self.__parameter_cache = {
            mod: {
                "center": None,
                "samples_per_symbol": None
            }
            for mod in self.MODULATION_TYPES
        }

        self.__already_demodulated = False

        if len(filename) > 0:
            if self.wav_mode:
                self.__load_wav_file(filename)
            elif filename.endswith(".coco"):
                self.__load_compressed_complex(filename)
            else:
                self.__load_complex_file(filename)

            self.filename = filename
            self.noise_threshold = AutoInterpretation.detect_noise_level(
                self.iq_array.magnitudes)
        else:
            self.filename = ""
    def test_auto_interpretation_ask(self):
        ask_signal = np.fromfile(get_path_for_data_file("ask.complex"), dtype=np.complex64)
        result = AutoInterpretation.estimate(ask_signal)
        mod_type, bit_length = result["modulation_type"], result["bit_length"]
        center, noise, tolerance = result["center"], result["noise"], result["tolerance"]
        self.assertEqual(mod_type, "ASK")
        self.assertEqual(bit_length, 300)
        self.assertGreater(tolerance, 0)
        self.assertLessEqual(tolerance, 6)

        self.assertEqual(demodulate(ask_signal, mod_type, bit_length, center, noise, tolerance)[0], "b25b6db6c80")
    def test_auto_interpretation_fsk(self):
        fsk_signal = np.fromfile(get_path_for_data_file("fsk.complex"), dtype=np.float32)
        result = AutoInterpretation.estimate(fsk_signal)
        mod_type, bit_length = result["modulation_type"], result["bit_length"]
        center, noise, tolerance = result["center"], result["noise"], result["tolerance"]
        self.assertEqual(mod_type, "FSK")
        self.assertEqual(bit_length, 100)
        self.assertGreater(tolerance, 0)
        self.assertLessEqual(tolerance, 5)

        self.assertEqual(demodulate(fsk_signal, mod_type, bit_length, center, noise, tolerance)[0],
                         "aaaaaaaac626c626f4dc1d98eef7a427999cd239d3f18")
    def test_auto_interpretation_fsk(self):
        fsk_signal = np.fromfile(get_path_for_data_file("fsk.complex"), dtype=np.complex64)
        result = AutoInterpretation.estimate(fsk_signal)
        mod_type, bit_length = result["modulation_type"], result["bit_length"]
        center, noise, tolerance = result["center"], result["noise"], result["tolerance"]
        self.assertEqual(mod_type, "FSK")
        self.assertEqual(bit_length, 100)
        self.assertGreater(tolerance, 0)
        self.assertLessEqual(tolerance, 5)

        self.assertEqual(demodulate(fsk_signal, mod_type, bit_length, center, noise, tolerance)[0],
                         "aaaaaaaac626c626f4dc1d98eef7a427999cd239d3f18")
Пример #28
0
 def test_estimate_tolerance_from_plateau_lengths(self):
     self.assertEqual(AutoInterpretation.estimate_tolerance_from_plateau_lengths([]), None)
     self.assertEqual(AutoInterpretation.estimate_tolerance_from_plateau_lengths([10]), None)
     self.assertEqual(AutoInterpretation.estimate_tolerance_from_plateau_lengths([100, 49, 1, 50, 100]), 1)
     self.assertEqual(AutoInterpretation.estimate_tolerance_from_plateau_lengths([100, 49, 2, 50, 100]), 2)
     self.assertEqual(AutoInterpretation.estimate_tolerance_from_plateau_lengths([100, 49, 2, 50, 100, 1]), 2)
     self.assertEqual(AutoInterpretation.estimate_tolerance_from_plateau_lengths([8, 8, 6, 1, 1]), 1)
Пример #29
0
 def test_estimate_tolerance_from_plateau_lengths(self):
     self.assertEqual(AutoInterpretation.estimate_tolerance_from_plateau_lengths([]), None)
     self.assertEqual(AutoInterpretation.estimate_tolerance_from_plateau_lengths([10]), None)
     self.assertEqual(AutoInterpretation.estimate_tolerance_from_plateau_lengths([100, 49, 1, 50, 100]), 1)
     self.assertEqual(AutoInterpretation.estimate_tolerance_from_plateau_lengths([100, 49, 2, 50, 100]), 2)
     self.assertEqual(AutoInterpretation.estimate_tolerance_from_plateau_lengths([100, 49, 2, 50, 100, 1]), 2)
     self.assertEqual(AutoInterpretation.estimate_tolerance_from_plateau_lengths([8, 8, 6, 1, 1]), 1)
    def test_auto_interpretation_xavax(self):
        signal = Signal(get_path_for_data_file("xavax.coco"), "")
        result = AutoInterpretation.estimate(signal.data)
        mod_type, bit_length = result["modulation_type"], result["bit_length"]
        center, noise, tolerance = result["center"], result["noise"], result["tolerance"]

        self.assertEqual(mod_type, "FSK")
        self.assertEqual(bit_length, 100)
        demod = demodulate(signal.data, mod_type, bit_length, center, noise, tolerance)
        self.assertGreaterEqual(len(demod), 5)

        for i in range(1, len(demod)):
            self.assertTrue(demod[i].startswith("aaaaaaaa"))
    def test_auto_interpretation_xavax(self):
        signal = Signal(get_path_for_data_file("xavax.coco"), "")
        result = AutoInterpretation.estimate(signal.iq_array.data)
        mod_type, bit_length = result["modulation_type"], result["bit_length"]
        center, noise, tolerance = result["center"], result["noise"], result["tolerance"]

        self.assertEqual(mod_type, "FSK")
        self.assertEqual(bit_length, 100)
        demod = demodulate(signal.iq_array.data, mod_type, bit_length, center, noise, tolerance)
        self.assertGreaterEqual(len(demod), 5)

        for i in range(1, len(demod)):
            self.assertTrue(demod[i].startswith("aaaaaaaa"))
Пример #32
0
    def test_get_bit_length_from_plateau_length(self):
        self.assertEqual(AutoInterpretation.get_bit_length_from_plateau_lengths([]), 0)
        self.assertEqual(AutoInterpretation.get_bit_length_from_plateau_lengths([42]), 42)
        plateau_lengths = [2, 1, 2, 73, 1, 26, 100, 40, 1, 59, 100, 47, 1, 52, 67, 1, 10, 1, 21, 33, 1, 66, 100, 5, 1, 3, 1, 48, 1, 27, 1, 8]
        merged_lengths = AutoInterpretation.merge_plateau_lengths(plateau_lengths)
        self.assertEqual(AutoInterpretation.get_bit_length_from_plateau_lengths(merged_lengths), 100)


        plateau_lengths = [1, 292, 331, 606, 647, 286, 645, 291, 334, 601, 339, 601, 338, 602, 337, 603, 338, 604, 336, 605, 337, 600, 338, 605, 646]
        merged_lengths = AutoInterpretation.merge_plateau_lengths(plateau_lengths)
        self.assertEqual(AutoInterpretation.get_bit_length_from_plateau_lengths(merged_lengths), 300)

        plateau_lengths = [3, 8, 8, 8, 8, 8, 8, 8, 8, 16, 8, 8, 16, 32, 8, 8, 8, 8, 8, 24, 8, 24, 8, 24, 8, 24, 8, 24, 16, 16, 24, 8]
        merged_lengths = AutoInterpretation.merge_plateau_lengths(plateau_lengths)
        self.assertEqual(AutoInterpretation.get_bit_length_from_plateau_lengths(merged_lengths), 8)
    def test_auto_interpretation_homematic(self):
        data = Signal(get_path_for_data_file("homematic.complex32s"), "").iq_array

        result = AutoInterpretation.estimate(data)
        mod_type, bit_length = result["modulation_type"], result["bit_length"]
        center, noise, tolerance = result["center"], result["noise"], result["tolerance"]

        self.assertEqual(mod_type, "FSK")
        self.assertEqual(bit_length, 100)

        demodulated = demodulate(data, mod_type, bit_length, center, noise, tolerance)
        self.assertEqual(len(demodulated), 2)
        for i in range(2):
            self.assertTrue(demodulated[i].startswith("aaaaaaaa"))
    def test_auto_interpretation_elektromaten(self):
        data = Signal(get_path_for_data_file("elektromaten.complex16s"), "").iq_array
        result = AutoInterpretation.estimate(data)

        mod_type, bit_length = result["modulation_type"], result["bit_length"]
        center, noise, tolerance = result["center"], result["noise"], result["tolerance"]

        self.assertEqual(mod_type, "ASK")
        self.assertEqual(bit_length, 600)

        demodulated = demodulate(data, mod_type, bit_length, center, noise, tolerance, pause_threshold=8)
        self.assertEqual(len(demodulated), 11)
        for i in range(11):
            self.assertTrue(demodulated[i].startswith("8"))
    def test_auto_interpretation_homematic(self):
        data = Signal(get_path_for_data_file("homematic.coco"), "").data

        result = AutoInterpretation.estimate(data)
        mod_type, bit_length = result["modulation_type"], result["bit_length"]
        center, noise, tolerance = result["center"], result["noise"], result["tolerance"]

        self.assertEqual(mod_type, "FSK")
        self.assertEqual(bit_length, 100)

        demodulated = demodulate(data, mod_type, bit_length, center, noise, tolerance)
        self.assertEqual(len(demodulated), 2)
        for i in range(2):
            self.assertTrue(demodulated[i].startswith("aaaaaaaa"))
Пример #36
0
    def __demodulate_data(self, data):
        """
        Demodulates received IQ data and adds demodulated bits to messages
        :param data:
        :return:
        """
        if len(data) == 0:
            return

        power_spectrum = data.real ** 2 + data.imag ** 2
        is_above_noise = np.sqrt(np.mean(power_spectrum)) > self.signal.noise_threshold

        if self.adaptive_noise and not is_above_noise:
            self.signal.noise_threshold = 0.9 * self.signal.noise_threshold + 0.1 * np.sqrt(np.max(power_spectrum))

        if is_above_noise:
            self.__add_to_buffer(data)
            self.pause_length = 0
            if not self.__buffer_is_full():
                return
        else:
            self.pause_length += len(data)
            if self.pause_length < 10 * self.signal.bit_len:
                self.__add_to_buffer(data)
                if not self.__buffer_is_full():
                    return

        if self.__current_buffer_index == 0:
            return

        # clear cache and start a new message
        self.signal._fulldata = self.__buffer[0:self.__current_buffer_index]
        self.__clear_buffer()
        self.signal._qad = None

        bit_len = self.signal.bit_len
        if self.automatic_center:
            self.signal.qad_center = AutoInterpretation.detect_center(self.signal.qad, max_size=150*self.signal.bit_len)

        ppseq = grab_pulse_lens(self.signal.qad, self.signal.qad_center,
                                self.signal.tolerance, self.signal.modulation_type, self.signal.bit_len)

        bit_data, pauses, bit_sample_pos = self._ppseq_to_bits(ppseq, bit_len, write_bit_sample_pos=False)

        for bits, pause in zip(bit_data, pauses):
            message = Message(bits, pause, bit_len=bit_len, message_type=self.default_message_type,
                              decoder=self.decoder)
            self.messages.append(message)
            self.message_sniffed.emit(len(self.messages) - 1)
Пример #37
0
    def __init__(self,
                 filename: str,
                 name="Signal",
                 modulation: str = None,
                 sample_rate: float = 1e6,
                 parent=None):
        super().__init__(parent)
        self.__name = name
        self.__tolerance = 5
        self.__bit_len = 100
        self.__pause_threshold = 8
        self.__message_length_divisor = 1
        self._qad = None
        self.__qad_center = 0
        self._noise_threshold = 0
        self.__sample_rate = sample_rate
        self.noise_min_plot = 0
        self.noise_max_plot = 0
        self.block_protocol_update = False

        self.wav_mode = filename.endswith(".wav")
        self.__changed = False
        if modulation is None:
            modulation = "FSK"
        self.__modulation_type = self.MODULATION_TYPES.index(modulation)
        self.__modulation_order = 2

        self.__parameter_cache = {
            mod: {
                "qad_center": None,
                "bit_len": None
            }
            for mod in self.MODULATION_TYPES
        }

        if len(filename) > 0:
            if self.wav_mode:
                self.__load_wav_file(filename)
            elif filename.endswith(".coco"):
                self.__load_compressed_complex(filename)
            else:
                self.__load_complex_file(filename)

            self.filename = filename
            self.noise_threshold = AutoInterpretation.detect_noise_level(
                self.iq_array.magnitudes)
        else:
            self.filename = ""
    def test_auto_interpretation_enocean(self):
        enocean_signal = np.fromfile(get_path_for_data_file("enocean.complex"), dtype=np.float32)
        result = AutoInterpretation.estimate(enocean_signal)
        mod_type, bit_length = result["modulation_type"], result["bit_length"]
        center, noise, tolerance = result["center"], result["noise"], result["tolerance"]
        self.assertEqual(mod_type, "ASK")
        self.assertGreaterEqual(center, 0.0077)
        self.assertLessEqual(center, 0.0465)
        self.assertLessEqual(tolerance, 5)
        self.assertEqual(bit_length, 40)

        demod = demodulate(enocean_signal, mod_type, bit_length, center, noise, tolerance,
                           decoding=Encoding(["WSP", settings.DECODING_ENOCEAN]))
        self.assertEqual(len(demod), 3)
        self.assertEqual(demod[0], demod[2])
        self.assertEqual(demod[0], "aa9610002c1c024b")
    def test_auto_interpretation_enocean(self):
        enocean_signal = np.fromfile(get_path_for_data_file("enocean.complex"), dtype=np.complex64)
        result = AutoInterpretation.estimate(enocean_signal)
        mod_type, bit_length = result["modulation_type"], result["bit_length"]
        center, noise, tolerance = result["center"], result["noise"], result["tolerance"]
        self.assertEqual(mod_type, "ASK")
        self.assertGreaterEqual(center, 0.04)
        self.assertLessEqual(center, 0.066)
        self.assertLessEqual(tolerance, 5)
        self.assertEqual(bit_length, 40)

        demod = demodulate(enocean_signal, mod_type, bit_length, center, noise, tolerance,
                           decoding=Encoding(["WSP", constants.DECODING_ENOCEAN]))
        self.assertEqual(len(demod), 3)
        self.assertEqual(demod[0], demod[2])
        self.assertEqual(demod[0], "aa9610002c1c024b")
Пример #40
0
    def test_vw(self):
        path = self.get_path("vw_auf.complex")
        if not path:
            return

        data = Signal(path, "").data

        result = AutoInterpretation.estimate(data)
        mod_type, bit_length = result["modulation_type"], result["bit_length"]
        center, noise, tolerance = result["center"], result["noise"], result["tolerance"]

        self.assertEqual(mod_type, "ASK")
        self.assertGreaterEqual(bit_length, 2000)
        self.assertLessEqual(bit_length, 3000)

        demodulated = demodulate(data, mod_type, bit_length, center, noise, tolerance)
        print(demodulated)
        self.assertEqual(len(demodulated), 1)
        self.assertTrue(demodulated[0].startswith("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"))
Пример #41
0
    def test_esaver(self):
        path = self.get_path("esaver_test4on.complex")
        if not path:
            return

        data = Signal(path, "").data

        result = AutoInterpretation.estimate(data)
        mod_type, bit_length = result["modulation_type"], result["bit_length"]
        center, noise, tolerance = result["center"], result["noise"], result["tolerance"]

        print(center, noise)
        self.assertEqual(mod_type, "FSK")
        self.assertEqual(bit_length, 100)

        print("noise", noise, "center", center, "bit length", bit_length, "tolerance", tolerance)
        demodulated = demodulate(data, mod_type, bit_length, center, noise, tolerance)
        print(demodulated)
        self.assertEqual(len(demodulated), 12)
        for i in range(12):
            self.assertTrue(demodulated[i].startswith("aaaaaaaa"))
Пример #42
0
    def test_brennenstuhl(self):
        path = self.get_path("brennenstuhl_signal_ABCD_onoff.coco")
        if not path:
            return

        data = Signal(path, "").data

        result = AutoInterpretation.estimate(data)
        mod_type, bit_length = result["modulation_type"], result["bit_length"]
        center, noise, tolerance = result["center"], result["noise"], result["tolerance"]

        self.assertEqual(mod_type, "ASK")
        self.assertEqual(bit_length, 300)

        print("noise", noise, "center", center, "bit length", bit_length, "tolerance", tolerance)
        demodulated = demodulate(data, mod_type, bit_length, center, noise, tolerance, pause_threshold=8)
        print(demodulated)
        self.assertEqual(len(demodulated), 64)
        for i in range(64):
            self.assertTrue(demodulated[i].startswith("88888888888"))
            self.assertEqual(len(demodulated[i]), len(demodulated[0]))
Пример #43
0
    def test_action(self):
        path = self.get_path("action_FB_A_B_C_D.coco")
        if not path:
            return

        data = Signal(path, "").data

        result = AutoInterpretation.estimate(data)
        mod_type, bit_length = result["modulation_type"], result["bit_length"]
        center, noise, tolerance = result["center"], result["noise"], result["tolerance"]

        self.assertEqual(mod_type, "ASK")
        self.assertGreaterEqual(bit_length, 400)
        self.assertLessEqual(bit_length, 500)

        print("noise", noise, "center", center, "bit length", bit_length, "tolerance", tolerance)
        demodulated = demodulate(data, mod_type, bit_length, center, noise, tolerance)
        print(demodulated)
        self.assertEqual(len(demodulated), 19)
        for i in range(2):
            self.assertTrue(demodulated[i].startswith("8e8eeeeeee8"))
Пример #44
0
    def test_scislo(self):
        path = self.get_path("scislo.complex")
        if not path:
            return

        data = Signal(path, "").data

        result = AutoInterpretation.estimate(data)
        mod_type, bit_length = result["modulation_type"], result["bit_length"]
        center, noise, tolerance = result["center"], result["noise"], result["tolerance"]

        self.assertEqual(mod_type, "FSK")
        self.assertEqual(bit_length, 200)
        self.assertGreaterEqual(noise, 0.0120)

        print("noise", noise, "center", center, "bit length", bit_length, "tolerance", tolerance)
        demodulated = demodulate(data, mod_type, bit_length, center, noise, tolerance)
        print(demodulated)
        self.assertEqual(len(demodulated), 8)
        for i in range(8):
            self.assertTrue(demodulated[i].startswith("000000000000aaaaaa"))
Пример #45
0
    def test_audi(self):
        path = self.get_path("audi_auf_sr5m.coco")
        if not path:
            return

        data = Signal(path, "").data

        result = AutoInterpretation.estimate(data)
        mod_type, bit_length = result["modulation_type"], result["bit_length"]
        center, noise, tolerance = result["center"], result["noise"], result["tolerance"]

        self.assertEqual(mod_type, "ASK")
        self.assertGreaterEqual(bit_length, 2400)
        self.assertLessEqual(bit_length, 2500)
        self.assertGreaterEqual(center, 0.005)
        self.assertLessEqual(center, 0.32)

        print("noise", noise, "center", center, "bit length", bit_length, "tolerance", tolerance)
        demodulated = demodulate(data, mod_type, bit_length, center, noise, tolerance)
        print(demodulated)
        self.assertEqual(len(demodulated), 1)
        self.assertTrue(demodulated[0].startswith("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"))
        self.assertTrue(demodulated[0].endswith("cad4c"))
Пример #46
0
    def __init__(self, filename: str, name: str, modulation: str = None, sample_rate: float = 1e6, parent=None):
        super().__init__(parent)
        self.__name = name
        self.__tolerance = 5
        self.__bit_len = 100
        self.__pause_threshold = 8
        self.__message_length_divisor = 1
        self._qad = None
        self.__qad_center = 0
        self._noise_threshold = 0
        self.__sample_rate = sample_rate
        self.noise_min_plot = 0
        self.noise_max_plot = 0
        self.block_protocol_update = False

        self.wav_mode = filename.endswith(".wav")
        self.__changed = False
        if modulation is None:
            modulation = "FSK"
        self.__modulation_type = self.MODULATION_TYPES.index(modulation)
        self.__modulation_order = 2

        self.__parameter_cache = {mod: {"qad_center": None, "bit_len": None} for mod in self.MODULATION_TYPES}

        if len(filename) > 0:
            if self.wav_mode:
                self.__load_wav_file(filename)
            elif filename.endswith(".coco"):
                self.__load_compressed_complex(filename)
            else:
                self.__load_complex_file(filename)

            self.filename = filename
            self.noise_threshold = AutoInterpretation.detect_noise_level(np.abs(self.data))
        else:
            self.filename = ""
Пример #47
0
    def test_fsk_detection(self):
        fsk_signal = np.fromfile(get_path_for_data_file("fsk.complex"), dtype=np.complex64)[5:15000]

        mod = AutoInterpretation.detect_modulation(fsk_signal, wavelet_scale=4, median_filter_order=7)
        self.assertEqual(mod, "FSK")
Пример #48
0
 def test_get_bit_length_from_merged_plateau_lengths(self):
     merged_lengths = [40, 40, 40, 40, 40, 30, 50, 30, 90, 40, 40, 80, 160, 30, 50, 30]
     self.assertEqual(AutoInterpretation.get_bit_length_from_plateau_lengths(merged_lengths), 40)
Пример #49
0
 def __run_merge(self, data):
     return list(AutoInterpretation.merge_plateau_lengths(np.array(data, dtype=np.uint64)))
Пример #50
0
    def test_tolerance_estimation(self):
        data = [
            [
                40, 4, 3, 8, 12, 3, 4, 3, 2, 9, 10, 4, 7, 12, 7, 5, 11, 4, 8,
                10, 1, 1, 1, 1, 4, 4, 10, 7, 7, 1, 17, 1, 1, 5, 3, 2, 1, 3, 17,
                1, 1, 1, 1, 3, 3, 7, 18, 1, 3, 1, 1, 8, 7, 6, 6, 14, 6, 5, 8,
                14, 2, 6, 10, 16, 1, 1, 16, 7, 2, 6, 18, 3, 1, 4, 1, 5, 15, 1,
                3, 1, 2, 1, 1, 9, 18, 15, 6, 3, 9, 13, 1, 1, 4, 4, 10, 15, 2,
                1, 1, 1, 13, 5, 7, 3, 17, 1, 1, 1, 1, 2, 3, 2, 1, 4, 22, 2, 2,
                7, 18, 15, 6, 4, 8, 15, 4, 3, 11, 15, 2, 4, 12, 8, 2, 2, 1, 2,
                18, 3, 1, 3, 2, 6, 15, 1, 3, 1, 2, 4, 1, 6, 19, 2, 2, 10, 10,
                2, 6, 15, 18, 15, 18, 15, 1, 3, 14, 4, 7, 4, 16, 1, 8, 8, 12,
                1, 8, 1, 3, 8, 8, 5, 5, 15, 6, 5, 7, 15, 4, 4, 10, 15, 1, 5,
                12, 7, 1, 7, 18, 3, 1, 3, 2, 6, 14, 1, 3, 3, 1, 11, 9, 2, 7,
                15, 6, 6, 6, 15, 4, 6, 8, 15, 1, 7, 8, 7, 3, 1, 2, 4, 1, 2, 15,
                3, 6, 6, 11, 1, 3, 1, 8, 8, 12, 1, 9, 1, 1, 10, 5, 7, 6, 15, 1,
                1, 1, 7, 8, 15, 1, 6, 9, 22, 3, 1, 3, 4, 1, 1, 13, 1, 3, 3, 2,
                3, 1, 5, 24, 9, 10, 3, 6, 1, 1, 12, 3, 8, 7, 15, 2, 14, 2, 7,
                8, 10, 1, 10, 10, 1, 1, 1, 1, 3, 7, 4, 15, 1, 1, 1, 1, 3, 3, 2,
                1, 5, 3, 1, 1, 12, 9, 1, 8, 2, 1, 9, 7, 8, 6, 15, 2, 7, 7, 17,
                1, 21, 8, 11, 1, 8, 12, 3, 1, 1, 1, 1, 1, 12, 3, 1, 3, 10, 10,
                2, 11, 9, 7, 5, 7, 15, 1, 23, 7, 24, 5, 22, 1, 7, 1, 8, 12, 3,
                1, 1, 1, 1, 1, 12, 12, 3, 4, 1, 1, 12, 8, 4, 7, 15, 1, 24, 8,
                22, 6, 31, 1, 8, 11, 4, 1, 3, 1, 3, 2, 6, 9, 6, 3, 2, 2, 10, 2,
                15, 7, 4, 3, 19, 1, 32, 1, 23, 3, 26, 8, 3, 2, 1, 1, 14, 2, 2,
                3, 11, 8, 3, 1, 2, 4, 1, 2, 11, 2, 11, 1, 2, 7, 26, 2, 55, 6,
                20, 1, 1, 9, 3, 1, 3, 1, 13, 3, 1, 2, 12, 8, 5, 5, 1, 2, 11, 2,
                10, 2, 2, 4, 11, 2, 16, 2, 32, 1, 22, 7, 19, 2, 2, 3, 2, 1, 7,
                8, 7, 3, 1, 3, 11, 7, 5, 6, 2, 1, 9, 1, 1, 2, 15, 2, 11, 4, 16,
                1, 24, 6, 24, 6, 21, 3, 1, 2, 3, 1, 7, 8, 7, 4, 1, 2, 11, 2,
                13, 7, 4, 1, 2, 4, 16, 2, 12, 1, 41, 7, 37, 8, 1, 2, 4, 1, 1,
                1, 1, 2, 12, 3, 1, 3, 6, 5, 1, 2, 11, 3, 10, 1, 1, 7, 8, 3, 17,
                1, 23, 7, 24, 5, 30, 2, 7, 7, 3, 1, 4, 2, 1, 3, 12, 2, 13, 7,
                7, 2, 1, 1, 1, 1, 12, 4, 1, 2, 51, 6, 57, 2, 2, 2, 7, 2, 15, 6,
                1, 2, 7, 2, 12, 1, 1, 3, 1, 1, 9, 1, 2, 3, 7, 7, 26, 1, 88, 10,
                6, 3, 13, 3, 1, 2, 11, 3, 2, 2, 7, 3, 1, 1, 1, 1, 12, 2, 8, 7,
                181, 1, 16, 1, 9, 2, 1, 4, 7, 1, 2, 3, 2, 1, 8, 3, 12, 1, 9, 1,
                3, 7, 13, 1, 8, 2, 1, 1, 1, 2, 3, 1, 54, 1, 16, 1, 15, 3
            ],
            [
                1, 1, 2, 3660, 1, 634, 1, 465, 1, 50, 1, 66, 1, 16, 1, 815, 1,
                522, 1, 97, 1, 14, 1, 78, 1, 21, 1, 142, 1, 28, 1, 57, 1, 129,
                1, 129, 1, 7, 1, 14, 1, 28, 1, 34, 1, 196, 1, 14, 1, 22, 1,
                159, 1, 68, 1, 88, 1, 51, 1, 25, 1, 119, 1, 370
            ],
            [
                4, 2, 2, 1, 8, 1, 1, 1, 6, 2, 6, 2, 2, 1, 1, 1, 6, 1, 1, 2, 1,
                1, 2, 2, 1, 1, 3, 2, 3, 1, 6, 1, 4, 2, 2, 1, 4, 2, 3, 2, 1, 2
            ],
            [
                1, 66, 1, 13, 1, 2, 1, 2, 104, 104, 104, 105, 104, 104, 104,
                105, 104, 104, 104, 104, 104, 104, 104, 105, 104, 104, 104,
                104, 105, 104, 104, 104, 104, 104, 104, 105, 104, 104, 104,
                104, 105, 104, 104, 104, 104, 104, 104, 104, 209, 104, 105,
                208, 104, 312, 105, 104, 104, 104, 521, 416, 105, 104, 208,
                104, 313, 208, 209, 104, 104, 104, 417
            ],
            [
                1, 73, 1, 2, 1, 6, 1, 1, 105, 104, 104, 105, 104, 104, 104,
                105, 104, 104, 104, 104, 104, 104, 104, 105, 104, 104, 104,
                105, 104, 104, 104, 104, 104, 104, 104, 105, 104, 104, 104,
                104, 105, 104, 104, 104, 105, 103, 104, 105, 208, 104, 104,
                209, 104, 312, 105, 104, 104, 104, 521, 417, 104, 104, 208,
                104, 313, 208, 209, 104, 104, 104, 416
            ],
            [
                1, 76, 1, 2, 1, 3, 1, 1, 105, 104, 104, 104, 105, 104, 104,
                104, 105, 103, 104, 105, 104, 104, 104, 105, 104, 104, 104,
                104, 105, 103, 104, 105, 104, 104, 104, 104, 105, 104, 104,
                104, 105, 103, 104, 105, 104, 104, 104, 105, 208, 104, 104,
                209, 103, 313, 105, 103, 104, 105, 521, 416, 104, 105, 208,
                104, 313, 208, 209, 103, 104, 105, 416
            ],
            [
                1, 11, 1, 10, 1, 10, 1, 10, 1, 5, 1, 4, 1, 5, 1, 4, 2, 4, 1, 3,
                3, 3, 3, 2, 104, 105, 104, 104, 105, 104, 103, 104, 105, 104,
                104, 104, 105, 104, 104, 104, 104, 105, 104, 104, 104, 104,
                104, 104, 105, 104, 104, 104, 104, 105, 104, 104, 103, 105,
                104, 104, 105, 104, 104, 104, 208, 104, 105
            ],
            [
                1, 12, 1, 22, 1, 10, 1, 3, 1, 1, 1, 4, 1, 5, 1, 3, 2, 4, 2, 4,
                2, 3, 2, 3, 104, 104, 105, 104, 104, 104, 105, 104, 104, 104,
                104, 104, 105, 104, 104, 104, 104, 104, 105, 104, 105, 103,
                104, 104, 104, 105, 104, 104, 104, 105, 104, 103, 105, 104,
                104, 104, 105, 104, 104, 104, 209, 103, 105
            ],
            [
                1, 12, 1, 22, 1, 10, 1, 5, 1, 3, 2, 5, 1, 3, 2, 4, 2, 3, 3, 3,
                2, 3, 104, 105, 104, 104, 105, 103, 104, 105, 104, 104, 104,
                104, 105, 104, 104, 104, 104, 105, 104, 103, 105, 104, 104,
                104, 104, 105, 104, 104, 104, 104, 105, 103, 105, 104, 104,
                104, 104, 105, 104, 104, 208, 104, 104
            ],
            [
                1, 66, 1, 2, 1, 6, 1, 6, 1, 1, 105, 104, 104, 104, 105, 104,
                104, 104, 105, 103, 105, 104, 104, 104, 104, 105, 104, 104,
                104, 104, 105, 103, 105, 104, 104, 104, 104, 104, 105, 104,
                104, 104, 105, 103, 104, 105, 104, 104, 104, 105, 208, 104,
                104, 209, 104, 312, 105, 104, 104, 104, 521, 417, 103, 104,
                209, 104, 313, 208, 209, 103, 104, 105, 416
            ],
            [
                1, 66, 1, 13, 1, 2, 1, 2, 105, 103, 104, 105, 104, 104, 104,
                105, 104, 104, 104, 104, 105, 103, 104, 105, 104, 104, 104,
                104, 105, 104, 104, 104, 105, 104, 103, 105, 104, 104, 104,
                105, 104, 104, 104, 105, 104, 104, 104, 104, 208, 105, 104,
                208, 104, 312, 105, 104, 104, 104, 521, 417, 104, 104, 208,
                105, 312, 208, 209, 104, 104, 105, 416
            ],
            [
                1, 66, 1, 6, 1, 6, 1, 2, 1, 2, 105, 104, 104, 104, 105, 103,
                104, 105, 104, 104, 104, 104, 105, 104, 104, 105, 104, 103,
                104, 105, 104, 104, 104, 104, 105, 104, 104, 104, 104, 104,
                105, 104, 104, 104, 104, 104, 105, 104, 104, 104, 208, 105,
                104, 208, 104, 312, 105, 104, 104, 104, 521, 417, 104, 105,
                207, 104, 314, 208, 208, 104, 104, 105, 416
            ],
            [
                2, 3, 13, 1, 5, 1, 1, 1, 26, 1, 2, 1, 2, 1, 6, 1, 5, 1, 2, 1,
                5, 1, 3, 1, 6, 1, 3, 1, 3, 1, 7, 1, 1, 1, 3, 1, 19, 1, 7, 1,
                26, 1, 26, 1, 2, 1, 5, 1, 2, 1, 3, 1, 7, 1, 12, 1, 6, 1, 24, 1,
                4, 1, 6, 1, 6, 1, 4, 1, 1, 1, 27, 1, 6, 1, 7, 1, 13, 1, 6, 1,
                7, 1, 6, 1, 16, 1, 1, 1, 11, 1, 6, 1, 1, 1, 3, 1, 2, 1, 1, 1,
                4, 1, 6, 1, 3, 1, 2, 1, 3, 1, 2, 1, 6, 1, 3, 1, 2, 1, 1, 1, 2,
                1, 3, 1, 2, 1, 3, 1, 6, 1, 2, 1, 3, 1, 4, 1, 112, 1, 2, 1, 5,
                1, 1, 1, 4, 1, 1, 1, 4, 1, 1, 1, 4, 1, 1, 2, 3, 1, 1, 1, 2, 1,
                1, 1, 1, 3, 4, 2, 1, 1, 2, 1, 1, 1, 1, 1, 2, 1, 3, 2, 1, 1, 1,
                1, 4, 1, 4, 1, 1, 1, 4, 1, 6, 1, 28, 1, 83, 1, 1, 1, 5, 1, 6,
                1, 6, 1, 4, 1, 2, 1, 3, 1, 2, 1, 6, 1, 3, 1, 2, 1, 3, 1, 2, 1,
                3, 1, 4, 1, 1, 1, 4, 1, 2, 1, 3, 1, 4, 1, 1, 1, 4, 1, 1, 1, 5,
                1, 9, 1, 6, 1, 4, 1, 11, 1, 13, 1, 7, 1, 6, 1, 40, 1, 3, 1, 1,
                1, 2, 1, 6, 1, 3, 1, 2, 1, 3, 1, 13, 1, 6, 1, 6, 1, 25, 1, 6,
                1, 4, 1, 6, 1, 45, 1, 14, 1, 6, 1, 6, 1, 14, 1, 16, 1, 1, 1, 3,
                2, 1, 1, 1, 1, 1, 1, 1, 2, 1, 1, 1, 1, 4, 1, 6, 1, 1, 1, 1, 1,
                2, 1, 4, 1, 1, 1, 3, 1, 2, 1, 4, 1, 1, 1, 4, 1, 6, 1, 3, 1, 2,
                1, 4, 1, 6, 1, 10, 1, 112, 1, 1, 1, 1, 1, 4, 1, 1, 1, 4, 1, 2,
                1, 3, 1, 1, 1, 4, 1, 1, 1, 4, 1, 1, 2, 3, 1, 1, 2, 1, 1, 1, 1,
                1, 4, 1, 1, 1, 2, 1, 1, 2, 1, 1, 1, 2, 1, 1, 1, 4, 1, 1, 1, 4,
                1, 4, 1, 1, 1, 4, 1, 3, 1, 24, 1, 78, 1, 7, 1, 20, 1, 7, 1, 6,
                1, 3, 1, 2, 1, 3, 1, 2, 1, 3, 1, 4, 1, 2, 1, 3, 1, 2, 1, 3, 1,
                6, 1, 4, 1, 1, 1, 11, 1, 7, 1, 7, 1, 25, 1, 11, 1, 7, 1, 27, 1,
                9, 1, 1, 1, 2, 1, 1, 1, 3, 1, 2, 1, 3, 1, 2, 1, 3, 1, 2, 1, 3,
                1, 2, 1, 3, 1, 6, 1, 25, 1, 13, 1, 11, 1, 65, 1, 13, 1, 7, 1,
                6, 1, 6, 1, 3, 1, 4, 1, 1, 1, 2, 1, 1, 1, 1, 1, 1, 1, 2, 1, 1,
                1, 1, 2, 1, 1, 1, 1, 2, 1, 1, 1, 4, 1, 1, 1, 4, 1, 1, 1, 4, 1,
                1, 1, 4, 1, 6, 1, 3, 1, 2, 1, 4, 1, 1, 1, 1, 1, 2, 1, 6, 1, 3,
                1, 2, 1, 3, 1, 108, 1, 3, 1, 1, 1, 2, 1, 3, 1, 2, 1, 3, 1, 1,
                1, 4, 1, 1, 1, 4, 1, 2, 1, 3, 1, 2, 1, 3, 1, 4, 1, 1, 1, 1, 2,
                1, 1, 1, 1, 4, 1, 1, 1, 2, 1, 1, 1, 2, 1, 1, 1, 1, 1, 2, 1, 1,
                1, 2, 1, 1, 1, 2, 1, 1, 1, 4, 1, 10, 1, 7, 1, 6, 1, 14, 1, 66,
                1, 8, 1, 6, 1, 6, 1, 6, 1, 10, 1, 6, 1, 6, 1, 6, 1, 7, 1, 3, 1,
                6, 1, 4, 1, 1, 1, 4, 1, 2, 1, 3, 1, 19, 1, 7, 1, 14, 1, 18, 1,
                10, 1, 7, 1, 6, 1, 13, 1, 7, 1, 1, 1, 6, 1, 1, 1, 4, 1, 5, 1,
                2, 1, 3, 1, 7, 1, 6, 1, 6, 1, 3, 1, 6, 1, 6, 1, 18, 1, 11, 1,
                57, 1, 14, 1, 13, 1, 6, 1, 11, 1, 1, 1, 1, 1, 4, 1, 1, 1, 1, 2,
                1, 1, 1, 1, 2, 1, 1, 1, 1, 2, 1, 1, 1, 1, 1, 2, 1, 1, 4, 1, 1,
                1, 4, 1, 1, 1, 4, 1, 1, 1, 4, 1, 3, 1, 2, 1, 4, 1, 1, 1, 4, 1,
                3, 1, 2, 1, 3, 1, 2, 1, 4, 1, 13, 1, 97, 1, 1, 1, 2, 1, 3, 1,
                2, 1, 3, 1, 1, 1, 4, 1, 2, 1, 3, 1, 2, 1, 3, 1, 4, 1, 1, 1, 4,
                1, 1, 1, 4, 1, 1, 1, 4, 1, 6, 1, 1, 2, 1, 1, 1, 1, 1, 2, 1, 1,
                1, 2, 1, 1, 1, 1, 2, 4, 1, 1, 1, 2, 12, 1, 6, 1, 7, 1, 21, 1,
                14, 1, 13, 1, 26, 1, 8, 1, 5, 1, 6, 1, 13, 1, 10, 1, 6, 1, 7,
                1, 6, 1, 3, 1, 6, 1, 4, 1, 2, 1, 3, 1, 2, 1, 3, 1, 31, 1, 7, 1,
                14, 1, 3, 1, 25, 1, 7, 1, 16, 1, 8, 1, 1, 1, 4, 1, 1, 1, 4, 1,
                1, 1, 4, 1, 6, 1, 1, 1, 4, 1, 6, 1, 3, 1, 2, 1, 3, 1, 6, 1, 7,
                1, 3, 1, 13, 1, 52, 1, 21, 1, 21, 1, 6, 1, 5, 1, 2, 1, 6, 1, 1,
                1, 1, 2, 3, 1, 1, 2, 1, 1, 1, 1, 1, 2, 1, 1, 1, 1, 2, 1, 1, 1,
                1, 2, 1, 1, 1, 2, 1, 1, 1, 1, 4, 1, 1, 1, 4, 1, 4, 1, 1, 1, 4,
                1, 1, 1, 4, 1, 3, 1, 2, 1, 3, 1, 2, 1, 4, 1, 3, 1, 108, 1, 1,
                1, 5, 1, 6, 1, 2, 1, 3, 1, 6, 1, 4, 1, 1, 1, 6, 1, 4, 1, 2, 1,
                3, 1, 2, 1, 3, 1, 1, 2, 3, 1, 4, 1, 1, 1, 4, 1, 1, 2, 1, 1, 1,
                1, 1, 2, 1, 1, 1, 1, 1, 1, 15, 1, 3, 1, 6, 1, 7, 1, 29, 1, 46,
                1, 2, 1, 8, 1, 12, 1, 25, 1, 13, 1, 11, 1, 3, 1, 6, 1, 6, 1,
                21, 1, 7, 1, 14, 1, 6, 1, 7, 1, 6, 1, 5, 1, 4, 1, 11, 1, 6, 1,
                7, 1, 6, 1, 20, 1, 6, 1, 6, 1, 13, 1, 57, 1, 1, 1, 6, 1, 6, 1,
                6, 1, 6, 1, 6, 1, 6, 1, 3, 1, 2, 1, 3, 1, 2, 1, 3, 1, 6, 1, 4,
                1, 2, 1, 3, 1, 6, 1, 4, 1, 2, 1, 1, 1, 6, 1, 15, 1, 5, 1, 7, 1,
                7, 1, 3, 1, 4, 1, 7, 1, 5, 1, 21, 1, 6, 1, 9, 1, 3, 1, 1, 1, 2,
                1, 3, 1, 2, 1, 6, 1, 6, 1, 6, 1, 3, 1, 2, 1, 3, 1, 2, 1, 3, 1,
                11, 1, 6, 1, 6, 1, 11, 1, 6, 1, 6, 1, 11, 1, 3, 1, 6, 1, 4, 1,
                2, 1, 3, 1, 6, 1, 4, 1, 2, 1, 3, 1, 2, 1, 1, 1, 1, 1, 4, 1, 2,
                1, 3, 1, 2, 1, 1, 1, 1, 1, 4, 1, 4, 1, 1, 1, 1, 2, 1, 1, 9, 1,
                25, 1, 7, 1, 6, 1, 14, 1, 6, 1, 28, 1, 6, 1, 2, 1, 1, 1, 6, 1,
                6, 1, 6, 1, 10, 1, 13, 1, 6, 1, 10, 1, 7, 1, 6, 1, 3, 1, 7, 1,
                6, 1, 3, 1, 6, 1, 4, 1, 2, 1, 3, 1, 2, 1, 4, 1, 3, 1, 2, 1, 3,
                1, 2, 1, 1, 1, 1, 1, 4, 1, 2, 1, 3, 1, 1, 2, 1, 1, 1, 1, 4, 1,
                1, 2, 1, 1, 1, 1, 1, 2, 1, 1, 2, 1, 1, 1, 1, 1, 2, 1, 1, 2, 1,
                1, 1, 1, 2, 1, 1, 1, 3, 2, 1, 1, 4, 1, 1, 1, 4, 1, 4, 1, 1, 1,
                4, 1, 1, 1, 4, 1, 4, 1, 6, 1, 3, 1, 2, 1, 4, 1, 3, 1, 2, 1, 3,
                1, 7, 1, 3, 1, 2, 1, 3, 1, 4, 1, 82, 1, 21, 1, 3, 1, 5, 1, 1,
                1, 4, 1, 1, 1, 6, 1, 4, 1, 1, 1, 4, 1, 1, 1, 4, 1, 1, 1, 2, 1,
                1, 1, 1, 1, 4, 1, 1, 2, 1, 1, 1, 2, 1, 1, 1, 1, 1, 2, 1, 1, 1,
                2, 1, 1, 1, 1, 2, 1, 1, 1, 4, 1, 1, 1, 1, 2, 1, 1, 3, 1, 4, 1,
                8, 1, 22, 1, 71, 1, 8, 1, 6, 1, 5, 1, 7, 1, 6, 1, 3, 1, 2, 1,
                3, 1, 6, 1, 2, 1, 3, 1, 4, 1, 1, 1, 4, 1, 2, 1, 3, 1, 4, 1, 1,
                1, 4, 1, 1, 1, 4, 1, 5, 1, 7, 1, 6, 1, 8, 1, 7, 1, 8, 1, 5, 1,
                6, 1, 14, 1, 6, 1, 28, 1, 103, 1, 42, 1, 6, 1, 6, 1, 6, 1, 20,
                1, 5, 1, 8, 1, 2, 1, 4, 1, 7, 1, 6, 1, 12, 1, 6, 1, 28, 1, 6,
                1, 153, 1, 6, 1, 6, 1, 20, 1, 5, 1, 7, 1, 2, 1, 13, 1, 5, 1, 8,
                1, 5, 1, 2, 1, 6, 1, 1, 1, 1, 1, 2, 1, 3, 1, 2, 1, 6, 1, 3, 1,
                2, 1, 6, 1, 4, 1, 6, 1, 6, 1, 3, 1, 6, 1, 7, 1, 10, 1, 18, 1,
                6, 1, 11, 1, 3, 1, 2, 1, 6, 1, 3, 1, 7, 1, 3, 1, 2, 1, 4, 1, 3,
                1, 2, 1, 3, 1, 4, 1, 2, 1, 3, 1, 2, 1, 1, 1, 3, 1, 8, 1, 7, 1,
                14, 1, 22, 1, 14, 1, 6, 1, 21, 1, 6, 1, 6, 1, 96, 1, 1, 1, 5,
                1, 7, 1, 6, 1, 5, 1, 6, 1, 4, 1, 2, 1, 3, 1, 2, 1, 3, 1, 6, 1,
                4, 1, 1, 1, 4, 1, 2, 1, 3, 1, 1, 2, 3, 1, 1, 2, 1, 1, 1, 1, 4,
                1, 6, 1, 8, 1, 2, 1, 14, 1, 6, 1, 13, 1, 7, 1, 6, 1, 28, 1, 6,
                1, 104, 1, 2, 1, 5, 1, 2, 1, 6, 1, 5, 1, 4, 1, 2, 1, 3, 1, 2,
                1, 3, 1, 2, 1, 3, 1, 1, 2, 1, 1, 1, 1, 1, 2, 1, 1, 1, 1, 4, 1,
                1, 1, 4, 1, 1, 2, 1, 1, 1, 1, 2, 1, 1, 1, 1, 2, 1, 4, 1, 1, 2,
                1, 22, 1, 6, 1, 162, 1, 6, 1, 35, 1, 6, 1, 6, 1, 5, 1, 7, 1, 3,
                1, 3, 1, 8, 1, 5, 1, 20, 1, 4, 1, 4, 1, 1, 1, 1, 1, 4, 1, 1, 1,
                3, 1, 2, 1, 3, 1, 2, 1, 4, 1, 6, 1, 6, 1, 6, 1, 10, 1, 18, 1,
                6, 1, 6, 1, 11, 1, 11, 1, 5, 1, 7, 1, 3, 1, 6, 1, 4, 1, 2, 1,
                3, 1, 4, 1, 1, 1, 4, 1, 2, 1, 4, 1, 3, 1, 6, 1, 4, 1, 1, 1, 4,
                1, 22, 1, 17, 1, 6, 1, 7, 1, 6, 1, 21, 1, 6, 1, 28, 1, 98, 1,
                2, 1, 3, 1, 2, 1, 3, 1, 2, 1, 3, 1, 2, 1, 3, 1, 2, 1, 3, 1, 6,
                1, 4, 1, 1, 1, 4, 1, 2, 1, 3, 1, 1, 1, 4, 1, 1, 2, 1, 1, 1, 1,
                4, 1, 1, 1, 4, 1, 1, 2, 1, 1, 1, 1, 4, 1, 10, 1, 5, 1, 14, 1,
                14, 1, 35, 1, 21, 1, 1, 1, 5, 1, 7, 1, 5, 1, 6, 1, 6, 1, 24, 1,
                7, 1, 3, 1, 2, 1, 3, 1, 7, 1, 3, 1, 2, 1, 33, 1, 14, 1, 6, 1,
                6, 1, 14, 1, 2, 1, 1, 1, 11, 1, 5, 1, 6, 1, 6, 1, 28, 1, 146,
                1, 6, 1, 6, 1, 34, 1, 6, 1, 7, 1, 5, 1, 2, 1, 8, 1, 4, 1, 5, 1,
                6, 1, 6, 1, 7, 1, 17, 1, 1, 1, 5, 1, 2, 1, 3, 1, 2, 1, 6, 1, 6,
                1, 6, 1, 3, 1, 2, 1, 3, 1, 13, 1, 11, 1, 6, 1, 48, 1, 36, 1,
                13, 1, 6, 1, 7, 1, 6, 1, 2, 1, 1, 1, 1, 2, 3, 1, 2, 1, 1, 1, 1,
                1, 2, 1, 1, 1, 1, 2, 1, 1, 1, 1, 1, 2, 1, 1, 1, 1, 4, 1, 1, 1,
                4, 1, 3, 2, 1, 1, 4, 1, 1, 1, 4, 1, 1, 1, 4, 1, 3, 1, 2, 1, 3,
                1, 2, 1, 4, 1, 3, 1, 2, 1, 3, 1, 2, 1, 4, 1, 10, 1, 6, 1, 11,
                1, 11, 1, 13, 1, 11, 1, 3, 1, 6, 1, 7, 1, 3, 1, 37, 1, 6, 1,
                22, 1, 6, 1, 6, 1, 11, 1, 3, 1, 7, 1, 3, 1, 6, 1, 1, 1, 1, 1,
                4, 1, 1, 1, 4, 1, 1, 1, 4, 1, 1, 1, 4, 1, 1, 1, 4, 1, 6, 1, 4,
                1, 1, 1, 3, 1, 7, 1, 3, 1, 2, 1, 3, 1, 2, 1, 3, 1, 7, 1, 3, 1,
                82, 1, 6, 1, 20, 1, 14, 1, 6, 1, 6, 1, 6, 1, 29, 1, 6, 1, 6, 1,
                6, 1, 6, 1, 8, 1, 6, 1, 1, 1, 3, 1, 2, 1, 3, 1, 2, 1, 3, 1, 2,
                1, 6, 1, 3, 1, 2, 1, 3, 1, 6, 1, 6, 1, 7, 1, 10, 1, 18, 1, 41,
                1, 57, 1, 7, 1, 16, 1, 18, 1, 6, 1, 7, 1, 6, 1, 20, 1, 6, 1, 6,
                1, 153, 1, 6, 1, 20, 1, 21, 1, 13, 1, 1, 1, 1, 1, 1, 1, 1, 1,
                2, 1, 1, 1, 2, 1, 1, 1, 6, 1, 1, 1, 1, 1, 2, 1, 4, 1, 1, 1, 3,
                1, 2, 1, 4, 1, 1, 1, 3, 1, 7, 1, 3, 1, 2, 1, 3, 1, 2, 1, 3, 1,
                7, 1, 3, 1, 107, 1, 4, 1, 2, 1, 5, 1, 2, 1, 3, 1, 1, 1, 4, 1,
                1, 1, 4, 1, 1, 1, 4, 1, 1, 2, 3, 1, 1, 1, 4, 1, 1, 2, 3, 1, 1,
                2, 1, 1, 1, 1, 2, 1, 1, 1, 2, 1, 1, 1, 2, 1, 1, 1, 4, 1, 1, 1,
                4, 1, 3, 2, 1, 1, 43, 1, 21, 1, 111, 1, 6, 1, 21, 1, 6, 1, 6,
                1, 6, 1, 6, 1, 6, 1, 10, 1, 1, 1, 2, 1, 7, 1, 5, 1, 6, 1, 6, 1,
                6, 1, 13, 1, 6, 1, 6, 1, 8, 1, 3, 1, 2, 1, 5, 1, 7, 1, 6, 1, 6,
                1, 5, 1, 4, 1, 6, 1, 11, 1, 13, 1, 48, 1, 14, 1, 6, 1, 21, 1,
                6, 1, 6, 1, 7, 1, 6, 1, 15, 1, 5, 1, 6, 1, 6, 1, 28, 1, 167, 1,
                6, 1, 13, 1, 6, 1, 6, 1, 30, 1, 5, 1, 6, 1, 6, 1, 6, 1, 28, 1,
                6, 1, 13, 1, 110, 1, 27, 1, 28, 1, 6, 1, 30, 1, 19, 1, 6, 1, 6,
                1, 49, 1, 103, 1, 6, 1, 6, 1, 13, 1, 27, 1, 5, 1, 1, 1, 1, 1,
                1, 2, 1, 1, 1, 1, 2, 1, 1, 1, 1, 1, 2, 1, 1, 1, 2, 1, 1, 1, 3,
                2, 1, 1, 4, 1, 1, 1, 4, 1, 1, 1, 4, 1, 1, 1, 4, 1, 3, 1, 2, 1,
                4, 1, 1, 1, 4, 1, 1, 1, 4, 1, 3, 1, 2, 1, 4, 1, 148, 1, 6, 1,
                6, 1, 6, 1, 6, 1, 19, 1, 16, 1, 6, 1, 6, 1, 7, 1, 20, 1, 27, 1,
                110, 1, 56, 1, 6, 1, 6, 1, 6, 1, 4, 1, 16, 1, 6, 1, 7, 1, 6, 1,
                20, 1, 6, 1, 89, 1, 6, 1, 6, 1, 6, 1, 6, 1, 3, 1, 2, 1, 3, 1,
                6, 1, 6, 1, 4, 1, 2, 1, 3, 1, 2, 1, 3, 1, 6, 1, 4, 1, 2, 1, 3,
                1, 2, 1, 14, 1, 6, 1, 6, 1, 8, 1, 3, 1, 3, 1, 7, 1, 6, 1, 6, 1,
                6, 1, 14, 1, 6, 1, 6, 1, 14, 1, 131, 1, 28, 1, 6, 1, 6, 1, 6,
                1, 5, 1, 6, 1, 6, 1, 2, 1, 5, 1, 7, 1, 6, 1, 20, 1, 6, 1, 167,
                1, 6, 1, 6, 1, 6, 1, 6, 1, 20, 1, 6, 1, 6, 1, 2, 1, 5, 1, 7, 1,
                5, 1, 6, 1, 6, 1, 14, 1, 20, 1, 159, 1, 1, 1, 1, 1, 6, 1, 2, 1,
                3, 1, 1, 1, 4, 1, 1, 2, 3, 1, 1, 1, 2, 1, 1, 1, 1, 3, 2, 1, 1,
                2, 1, 1, 1, 2, 1, 1, 1, 1, 2, 1, 3, 2, 1, 1, 1, 1, 2, 1, 1, 1,
                4, 1, 6, 1, 3, 1, 2, 1, 4, 1, 2, 1, 8, 1, 156, 1, 6, 1, 6, 1,
                6, 1, 20, 1, 6, 1, 7, 1, 5, 1, 2, 1, 8, 1, 3, 1, 13, 1, 7, 1,
                27, 1, 6, 1, 131, 1, 35, 1, 6, 1, 6, 1, 6, 1, 6, 1, 13, 1, 2,
                1, 7, 1, 4, 1, 20, 1, 6, 1, 6, 1, 28, 1, 13, 1, 117, 1, 13, 1,
                34, 1, 7, 1, 6, 1, 5, 1, 2, 1, 7, 1, 5, 1, 20, 1, 6, 1, 13, 1,
                6, 1, 167, 1, 6, 1, 20, 1, 6, 1, 7, 1, 5, 1, 2, 1, 7, 1, 5, 1,
                5, 1, 6, 1, 6, 1, 28, 1, 6, 1, 181, 1, 6, 1, 6, 1, 12, 1, 2, 1,
                7, 1, 5, 1, 20, 1, 6, 1, 6, 1, 6, 1, 41, 1, 2, 1, 8, 1, 6, 1,
                3, 1, 20, 1, 13, 1, 6, 1, 3, 1, 6, 1, 7, 1, 6, 1, 3, 1, 4, 1,
                2, 1, 3, 1, 6, 1, 4, 1, 1, 1, 4, 1, 2, 1, 3, 1, 4, 1, 2, 1, 3,
                1, 1, 2, 1, 1, 1, 1, 4, 1, 1, 1, 2, 1, 1, 1, 1, 2, 1, 1, 1, 1,
                1, 2, 1, 1, 1, 3, 2, 1, 2, 1, 2, 3, 1, 1, 1, 2, 1, 1, 4, 1, 1,
                1, 4, 1, 1, 1, 2, 1, 1, 1, 4, 1, 1, 1, 3, 1, 4, 1, 2, 1, 4, 1,
                6, 1, 3, 1, 2, 1, 3, 1, 2, 1, 4, 1, 3, 1, 2, 1, 4, 1, 6, 1, 3,
                1, 6, 1, 4, 1, 109, 1, 2, 1, 1, 1, 2, 1, 3, 1, 1, 1, 4, 1, 1,
                1, 4, 1, 1, 1, 4, 1, 1, 1, 2, 1, 1, 1, 1, 2, 3, 1, 4, 1, 1, 1,
                2, 1, 1, 2, 1, 1, 1, 1, 1, 2, 1, 1, 1, 1, 4, 1, 4, 1, 1, 1, 4,
                1, 1, 1, 4, 1, 3, 1, 2, 1, 37, 1, 7, 1, 65, 1, 2, 1, 5, 1, 6,
                1, 6, 1, 7, 1, 3, 1, 2, 1, 3, 1, 2, 1, 3, 1, 6, 1, 4, 1, 1, 1,
                7, 1, 3, 1, 4, 1, 1, 1, 2, 1, 1, 1, 1, 1, 4, 1, 1, 1, 2, 1, 4,
                1, 7, 1, 16, 1, 14, 1, 7, 1, 59, 1, 6, 1, 2, 1, 6, 1, 3, 1, 13,
                1, 6, 1, 25, 1, 6, 1, 10, 1, 6, 1, 2, 1, 22, 1, 14, 1, 14, 1,
                6, 1, 20, 1, 6, 1, 6, 1, 2, 1, 5, 1, 7, 1, 6, 1, 6, 1, 6, 1, 6,
                1, 28, 1, 6, 1, 131, 1, 35, 1, 6, 1, 6, 1, 5, 1, 6, 1, 6, 1, 2,
                1, 13, 1, 6, 1, 6, 1, 13, 1, 6, 1, 6, 1, 160, 1, 13, 1, 13, 1,
                14, 1, 5, 1, 5, 1, 7, 1, 2, 1, 5, 1, 7, 1, 5, 1, 6, 1, 39, 1,
                3, 1, 1, 1, 2, 1, 3, 1, 2, 1, 3, 1, 2, 1, 3, 1, 2, 1, 6, 1, 3,
                1, 6, 1, 32, 1, 10, 1, 7, 1, 68, 1, 20, 1, 6, 1, 7, 1, 5, 1, 2,
                1, 7, 1, 5, 1, 20, 1, 6, 1, 13, 1, 6, 1, 167, 1, 6, 1, 20, 1,
                6, 1, 7, 1, 5, 1, 2, 1, 6, 1, 1, 1, 3, 1, 6, 1, 6, 1, 7, 1, 27,
                1, 6, 1, 78, 1, 6, 1, 6, 1, 5, 1, 6, 1, 7, 1, 3, 1, 6, 1, 4, 1,
                1, 1, 4, 1, 2, 1, 3, 1, 2, 1, 3, 1, 4, 1, 2, 1, 41, 1, 16, 1,
                11, 1, 7, 1, 29, 1, 5, 1, 2, 1, 3, 1, 2, 1, 1, 1, 3, 1, 2, 1,
                4, 1, 5, 1, 7, 1, 3, 1, 2, 1, 3, 1, 6, 1, 6, 1, 4, 1, 13, 1, 6,
                1, 4, 1, 6, 1, 6, 1, 3, 1, 7, 1, 3, 1, 2, 1, 3, 1, 4, 1, 2, 1,
                3, 1, 6, 1, 4, 1, 2, 1, 3, 1, 6, 1, 4, 1, 2, 1, 3, 1, 4, 1, 1,
                1, 4, 1, 1, 1, 2, 1, 3, 1, 9, 1, 5, 1, 2, 1, 7, 1, 6, 1, 6, 1,
                6, 1, 7, 1, 6, 1, 6, 1, 14, 1, 123, 1, 2, 1, 1, 1, 3, 1, 2, 1,
                3, 1, 2, 1, 3, 1, 2, 1, 3, 1, 6, 1, 1, 1, 4, 1, 6, 1, 4, 1, 1,
                1, 4, 1, 1, 1, 4, 1, 1, 2, 3, 1, 2, 1, 1, 1, 1, 1, 2, 1, 1, 1,
                2, 1, 1, 2, 1, 1, 1, 1, 11, 1, 7, 1, 7, 1, 212, 1, 6, 1, 6, 1,
                13, 1, 15, 1, 27, 1, 6, 1, 6, 1, 153, 1, 6, 1, 6, 1, 6, 1, 6,
                1, 20, 1, 7, 1, 13, 1, 3, 1, 11, 1, 5, 1, 6, 1, 7, 1, 27, 1,
                80, 1, 20, 1, 2775, 3, 20, 1, 16, 1, 2, 1, 17
            ],
            [
                1, 53, 1, 9, 1, 3, 1, 6, 1, 5, 2, 2, 1, 1, 105, 104, 104, 104,
                105, 103, 104, 105, 104, 104, 104, 104, 105, 104, 104, 104,
                105, 103, 105, 104, 104, 104, 104, 104, 105, 104, 104, 104,
                105, 103, 104, 105, 104, 104, 104, 105, 104, 104, 104, 104,
                208, 105, 104, 208, 104, 313, 104, 104, 104, 104, 521, 417,
                104, 104, 208, 104, 313, 209, 208, 104, 104, 104, 417
            ],
            [
                1, 69, 1, 6, 1, 6, 1, 1, 105, 104, 104, 105, 104, 104, 104,
                105, 104, 104, 104, 104, 104, 104, 104, 105, 104, 104, 104,
                105, 104, 104, 104, 105, 104, 103, 104, 105, 104, 104, 104,
                104, 105, 104, 104, 104, 105, 103, 104, 105, 208, 104, 105,
                208, 104, 312, 105, 104, 104, 104, 521, 417, 104, 104, 208,
                105, 312, 208, 209, 104, 104, 104, 417
            ],
            [
                1, 66, 1, 9, 1, 3, 1, 4, 105, 104, 105, 104, 104, 104, 104,
                105, 104, 104, 104, 104, 105, 103, 105, 104, 104, 104, 104,
                105, 104, 104, 104, 104, 104, 104, 104, 105, 104, 104, 104,
                105, 104, 104, 104, 104, 105, 103, 104, 105, 208, 105, 104,
                208, 104, 312, 105, 104, 104, 104, 521, 417, 104, 104, 208,
                104, 313, 208, 209, 104, 104, 105, 416
            ],
            [
                1, 51, 1, 13, 1, 3, 3, 6, 106, 105, 103, 105, 104, 105, 104,
                103, 105, 104, 104, 104, 105, 104, 104, 104, 104, 104, 104,
                105, 104, 104, 104, 104, 104, 105, 103, 105, 105, 104, 104,
                103, 104, 105, 104, 104, 105, 104, 104, 103, 209, 105, 104
            ],
            [
                2, 72, 1, 5, 1, 2, 106, 105, 103, 105, 104, 105, 103, 104, 104,
                104, 105, 104, 105, 103, 105, 104, 104, 104, 104, 105, 103,
                105, 104, 104, 104, 105, 103, 105, 103, 105, 104, 104, 104,
                104, 105, 104, 104, 104, 105, 103, 209, 104, 105
            ],
            [
                1, 78, 3, 1, 106, 104, 104, 104, 104, 105, 104, 104, 104, 104,
                104, 105, 104, 104, 105, 103, 104, 104, 104, 105, 104, 105,
                104, 103, 105, 104, 104, 105, 104, 104, 104, 104, 104, 104,
                104, 105, 104, 104, 105, 103, 208, 105, 103
            ],
            [
                1, 83, 1, 1, 105, 104, 104, 104, 105, 104, 104, 104, 105, 104,
                104, 104, 105, 103, 104, 104, 105, 104, 104, 104, 105, 103,
                105, 103, 105, 104, 104, 104, 105, 104, 104, 104, 105, 104,
                104, 104, 104, 104, 104, 105, 208, 104, 104, 208, 104, 313,
                105, 104, 104, 103, 522, 416, 104, 104, 209, 104, 313, 208,
                209, 104, 103, 105, 416
            ],
            [
                1, 80, 1, 2, 1, 1, 105, 104, 104, 104, 105, 104, 104, 104, 104,
                105, 104, 104, 104, 104, 104, 105, 104, 104, 104, 104, 104,
                104, 104, 105, 104, 104, 104, 104, 105, 104, 104, 104, 104,
                105, 103, 105, 104, 104, 104, 104, 208, 105, 104, 208, 104,
                313, 105, 104, 103, 104, 522, 416, 104, 104, 209, 104, 313,
                208, 208, 104, 104, 105, 416
            ],
            [
                1, 73, 1, 2, 1, 9, 105, 104, 104, 104, 105, 103, 104, 105, 104,
                104, 104, 105, 104, 104, 104, 104, 105, 103, 105, 104, 104,
                104, 104, 105, 104, 104, 104, 104, 104, 104, 104, 105, 104,
                104, 104, 105, 104, 104, 104, 104, 208, 105, 104, 208, 104,
                313, 104, 104, 104, 104, 522, 416, 104, 104, 208, 105, 312,
                209, 208, 104, 104, 105, 416
            ],
            [
                1, 13, 2, 4, 1, 9, 1, 4, 2, 9, 1, 4, 2, 3, 3, 4, 1, 9, 1, 3, 3,
                4, 2, 2, 105, 105, 104, 103, 105, 104, 104, 104, 105, 104, 104,
                104, 104, 104, 104, 105, 104, 104, 104, 104, 105, 103, 104,
                106, 104, 104, 104, 103, 105, 104, 104, 105, 104, 104, 104,
                104, 104, 104, 104, 104, 209, 104, 105
            ],
            [
                1, 9, 3, 3, 2, 9, 1, 4, 2, 4, 2, 8, 1, 4, 2, 4, 2, 4, 2, 2, 1,
                5, 2, 3, 3, 3, 2, 2, 106, 104, 104, 103, 105, 104, 104, 105,
                104, 104, 104, 104, 105, 103, 104, 106, 103, 105, 104, 103,
                105, 103, 105, 105, 104, 104, 104, 103, 105, 104, 104, 105,
                104, 104, 104, 104, 105, 104, 103, 106, 207, 104, 105
            ],
        ]

        found_tolerances = []
        print()
        for i, plateau_lengths in enumerate(data):
            found_tolerances.append(
                AutoInterpretation.estimate_tolerance_from_plateau_lengths(
                    plateau_lengths))

        print(found_tolerances)
        estimated_tolerance = AutoInterpretation.get_most_frequent_value(
            found_tolerances)
        self.assertIn(estimated_tolerance, range(4, 7))
 def test_auto_interpretation_overshoot_ook(self):
     data = Signal(get_path_for_data_file("ook_overshoot.coco"), "").data
     result = AutoInterpretation.estimate(data)
     self.assertEqual(result["modulation_type"], "ASK")
     self.assertEqual(result["bit_length"], 500)