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])
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)
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"))
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")
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)
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])
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])