示例#1
0
 def test_c_modulation_method_oqpsk(self):
     bits = array.array("B",
                        [0, 0, 0, 0, 1, 0, 1, 0, 1, 1, 0, 0, 1, 1, 0, 1])
     parameters = array.array(
         "f", [np.pi / 4, 3 * np.pi / 4, 5 * np.pi / 4, 7 * np.pi / 4])
     result = modulate_c(bits, 100, "OQPSK", parameters, 2, 1, 40e3, 0, 1e6,
                         1000, 0, parameters[0])
示例#2
0
    def modulate(self, data=None, pause=0, start=0) -> IQArray:
        assert pause >= 0
        if data is None:
            data = self.data
        else:
            self.data = data

        if isinstance(data, str):
            data = array.array("B", map(int, data))
        elif isinstance(data, list):
            data = array.array("B", data)

        if len(data) == 0:
            return IQArray(None, np.float32, 0)

        dtype = self.get_dtype()
        a = self.carrier_amplitude * IQArray.min_max_for_dtype(dtype)[1]

        type_code = "b" if dtype == np.int8 else "h" if dtype == np.int16 else "f"
        type_val = array.array(type_code, [0])[0]

        parameters = self.parameters
        if self.modulation_type == "ASK":
            parameters = array.array("f", [a * p / 100 for p in parameters])
        elif self.modulation_type == "PSK":
            parameters = array.array("f",
                                     [p * (math.pi / 180) for p in parameters])

        result = signal_functions.modulate_c(
            data, self.samples_per_symbol, self.modulation_type, parameters,
            self.bits_per_symbol, a, self.carrier_freq_hz,
            self.carrier_phase_deg * (np.pi / 180), self.sample_rate, pause,
            start, type_val, self.gauss_bt, self.gauss_filter_width)
        return IQArray(result)
示例#3
0
    def test_4_psk(self):
        bits = array.array("B", [1, 0, 1, 0, 1, 0, 1, 0, 1, 1, 0, 0, 0, 1, 0, 1])
        angles_degree = [-135, -45, 45, 135]

        parameters = array.array("f", [np.pi*a/180 for a in angles_degree])
        result = modulate_c(bits, 100, "PSK", parameters, 2, 1, 40e3, 0, 1e6, 1000, 0)

        signal = Signal("")
        signal.iq_array = IQArray(result)
        signal.bits_per_symbol = 2
        signal.center = 0
        signal.center_spacing = 1
        signal.modulation_type = "PSK"

        proto_analyzer = ProtocolAnalyzer(signal)
        proto_analyzer.get_protocol_from_signal()
        demod_bits = proto_analyzer.plain_bits_str[0]
        self.assertEqual(len(demod_bits), len(bits))
        self.assertTrue(demod_bits.startswith("10101010"))

        np.random.seed(42)
        noised = result + 0.1 * np.random.normal(loc=0, scale=np.sqrt(2)/2, size=(len(result), 2))
        signal.iq_array = IQArray(noised.astype(np.float32))
        signal.center_spacing = 1.5
        signal.noise_threshold = 0.2
        signal._qad = None
        proto_analyzer.get_protocol_from_signal()
        demod_bits = proto_analyzer.plain_bits_str[0]
        self.assertEqual(len(demod_bits), len(bits))
        self.assertTrue(demod_bits.startswith("10101010"))
示例#4
0
    def test_4_fsk(self):
        bits = array.array("B", [1, 0, 1, 0, 1, 1, 0, 0, 0, 1])
        parameters = array.array("f", [-20e3, -10e3, 10e3, 20e3])
        result = modulate_c(bits, 100, "FSK", parameters, 2, 1, 40e3, 0, 1e6, 1000, 0, parameters[0])

        signal = Signal("")
        signal.iq_array = IQArray(result)
        signal.bits_per_symbol = 2
        signal.qad_center = 0

        proto_analyzer = ProtocolAnalyzer(signal)
        proto_analyzer.get_protocol_from_signal()
        self.assertEqual(proto_analyzer.plain_bits_str[0], "1010110001")
示例#5
0
    def test_fsk_short_bit_length(self):
        bits_str = "101010"
        bits = array.array("B", list(map(int, bits_str)))
        parameters = array.array("f", [-10e3, 10e3])
        result = modulate_c(bits, 8, "FSK", parameters, 1, 1, 40e3, 0, 1e6, 1000, 0)

        signal = Signal("")
        signal.iq_array = IQArray(result)

        # Ensure we have no spikes
        self.assertLess(np.max(signal.qad), 1)

        signal.qad_center = 0
        signal.samples_per_symbol = 8

        proto_analyzer = ProtocolAnalyzer(signal)
        proto_analyzer.get_protocol_from_signal()
        self.assertEqual(proto_analyzer.plain_bits_str[0], bits_str)
示例#6
0
 def test_c_modulation_method_ask(self):
     bits = array.array("B", [1, 0, 1, 0, 1, 1, 0, 0, 0, 1])
     parameters = array.array("f", [0, 0.25, 0.5, 1])
     result = modulate_c(bits, 100, "ASK", parameters, 2, 1, 40e3, 0, 1e6,
                         1000, 0, parameters[0])
示例#7
0
 def test_c_modulation_method_gfsk(self):
     bits = array.array("B", [1, 0, 1, 0, 1, 1, 0, 0, 0, 1])
     parameters = array.array("f", [-10e3, 10e3])
     result = modulate_c(bits, 100, "GFSK", parameters, 1, 1, 40e3, 0, 1e6,
                         1000, 0, parameters[0])