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_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"))
예제 #3
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]))
예제 #4
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"))
    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_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")
    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")
    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_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"))
    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_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.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_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"))
    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")
예제 #16
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"))
예제 #17
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"))
예제 #18
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]))
예제 #19
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"))
예제 #20
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"))
예제 #21
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"))