def test_016_system_mu_STOfrac_quarter_overlap(self): print("test_016_system_mu_STOfrac_quarter_overlap") self.maxDiff = None P1_dB = -10 #too high power leads to false detection P2_dB = -7 R = 8 tau = int(15 * R * N + 17 * R + 3) S1 = (5, 10, 20, 30, 40, 50, 60, 70) * 3 S2 = (42, 101, 89, 15, 127, 0, 74, 94) * 3 p1 = lora.gen_packet(SF, S1, R=R) p2 = lora.gen_packet(SF, S2, R=R) x1 = np.sqrt(10**(P1_dB / 10.0)) * np.concatenate( [np.zeros(6), p1, np.zeros(tau)]) x2 = np.sqrt(10**(P2_dB / 10.0)) * np.concatenate( [np.zeros(tau), p2, np.zeros(6)]) x = np.concatenate([x1 + x2, np.zeros(20 * N * R)]) S1_out, S2_out = self._feed_system(x, R=R, Nsyms=len(S1)) self.assertEqual(S1, S1_out) self.assertEqual(S2, S2_out)
def system_mu(self, STO, CFO): print "test_system_mu ", STO, CFO self.maxDiff = None P1_dB = -12 #too high power leads to false detection P2_dB = -9 tau = int(15 * R * N + STO * R) S1 = (5, 10, 20, 30, 40, 50, 60, 70) * 3 S2 = (42, 101, 89, 15, 127, 0, 74, 94) * 3 p1 = lora.gen_packet(SF, S1, R=R) p2 = lora.gen_packet(SF, S2, R=R) x1 = np.sqrt(10**(P1_dB / 10.0)) * np.concatenate( [np.zeros(0), p1, np.zeros(tau)]) x2 = np.sqrt(10**(P2_dB / 10.0)) * np.concatenate( [np.zeros(tau), p2, np.zeros(0)]) x2 = lora.add_cfo(SF, x2, CFO, R=R) x = np.concatenate([x1 + x2, np.zeros(20 * N * R)]) S1_out, S2_out = self._feed_system(x, R=R, Nsyms=len(S1)) self.assertEqual(S1, S1_out) self.assertEqual(S2, S2_out)
def test_015_system_mu_STOfrac_quarter_inside( self ): #very unstable can work or not between tw0 consecutive executions print("test_015_system_mu_STOfrac_quarter_inside") self.maxDiff = None P1_dB = -10 #too high power leads to false detection P2_dB = -7 R = 8 tau = int(15 * R * N + 32 * R + 1) S1 = (5, 10, 20, 30, 40, 50, 60, 70) * 3 S2 = (42, 101, 89, 15, 127, 0, 74, 94) * 3 p1 = lora.gen_packet(SF, S1, R=R) p2 = lora.gen_packet(SF, S2, R=R) x1 = np.sqrt(10**(P1_dB / 10.0)) * np.concatenate( [np.zeros(0), p1, np.zeros(tau)]) x2 = np.sqrt(10**(P2_dB / 10.0)) * np.concatenate( [np.zeros(tau), p2, np.zeros(0)]) x = np.concatenate([x1 + x2, np.zeros(20 * N * R)]) S1_out, S2_out = self._feed_system(x, R=R, Nsyms=len(S1)) self.assertEqual(S1, S1_out) self.assertEqual(S2, S2_out)
def test_001_simple_packet(self): print("test_001_simple_packet") S = np.arange(Nsyms) x = np.concatenate([lora.gen_packet(SF, S, R=R), np.zeros(10 * N * R)]) user_tags = { 0: ('new_user', { 'power': 1.0, 'sto_int': 0, 'sto_frac': 0.0, 'cfo_int': 0, 'cfo_frac': 0.0 }) } y, window_tags = self._feed_synchro(x, user_tags) self.assertEqual(len(window_tags), 13 + Nsyms) self.check_preamble(window_tags) # Payload for i, w in enumerate(window_tags[13:13 + Nsyms]): self.assertEqual(w.offset, N * 12 + N / 4 + N * i) self.assertEqual(w.value['power1'], 1) self.assertEqual(w.value['win_len'], N) self.assertEqual(w.value['Tu'], SYNC_TYPE_PAYLOAD) self.assertEqual(w.value['Ti1'], SYNC_TYPE_VOID) self.assertEqual(w.value['Ti2'], SYNC_TYPE_VOID)
def test_052_full_packet(self): S = [0, 64, 32, 96, 0, 64, 24, 100] * 4 x = np.concatenate([lora.gen_packet(SF, S, R=R), np.zeros(15 * N * R)]) y, detects = self._feed_detector(x) self.assertEqual(len(detects), 1) d = detects[0] self.assertEqual(d.offset, BUFFER_LEN)
def test_001_system_su(self): print("test_001_system_su") R = 8 S1 = (0, 10, 20, 30, 40, 50, 60, 70) x = np.concatenate( [lora.gen_packet(SF, S1, R=R), np.zeros(15 * N * R)]) S1_out, S2_out = self._feed_system(x, R=R, Nsyms=len(S1)) self.assertEqual(S1, S1_out) self.assertEqual(len(S2_out), 0)
def test_005_system_su_twice(self): print("test_005_system_su_twice") R = 8 S1 = (0, 10, 20, 30, 40, 50, 60, 70, 80) p = lora.gen_packet(SF, S1, R=R) n_z = 6 * N * R + 3 * N / 4 * R x = np.concatenate([p, np.zeros(n_z), p, np.zeros(20 * N * R)]) S1_out, S2_out = self._feed_system(x, R=R, Nsyms=len(S1)) self.assertEqual(S1 * 2, S1_out) self.assertEqual(len(S2_out), 0)
def test_002_system_su_cfo(self): print("test_002_system_su_cfo") R = 8 S1 = (0, 10, 20, 30, 40, 50, 60, 70, 80) cfo = 10.5 # Should trigger an integer offset of 1 in the detection bock x = np.concatenate( [lora.gen_packet(SF, S1, R=R), np.zeros(15 * N * R)]) x = lora.add_cfo(SF, x, cfo, R=R) S1_out, S2_out = self._feed_system(x, R=R, Nsyms=len(S1)) self.assertEqual(S1, S1_out) self.assertEqual(len(S2_out), 0)
def test_010_system_mu_sync(self): print("test_010_system_mu_sync") P1_dB = 0 P2_dB = 3 R = 8 tau = int(14.0 * R * N) R = 8 S1 = (5, 10, 20, 30, 40, 50, 60, 70) * 2 S2 = (42, 101, 89, 15, 127, 0, 74, 94) * 2 p1 = lora.gen_packet(SF, S1, R=R) p2 = lora.gen_packet(SF, S2, R=R) x1 = np.sqrt(10**(P1_dB / 10.0)) * np.concatenate([p1, np.zeros(tau)]) x2 = np.sqrt(10**(P2_dB / 10.0)) * np.concatenate([np.zeros(tau), p2]) x = np.concatenate([x1 + x2, np.zeros(20 * N * R)]) S1_out, S2_out = self._feed_system(x, R=R, Nsyms=len(S1)) self.assertEqual(S1, S1_out) self.assertEqual(S2, S2_out)
def test_003_system_su_sto(self): print("test_003_system_su_sto") R = 8 S1 = (0, 10, 20, 30, 40, 50, 60, 70, 80) tau = 30.5 tau_samples = int(round(tau * R)) x = np.concatenate([ np.zeros(tau_samples), lora.gen_packet(SF, S1, R=R), np.zeros(15 * N * R) ]) S1_out, S2_out = self._feed_system(x, R=R, Nsyms=len(S1)) self.assertEqual(S1, S1_out) self.assertEqual(len(S2_out), 0)
def test_004_system_su_powers(self): print("test_004_system_su_powers") R = 8 S1 = (0, 10, 20, 30, 40, 50, 60, 70, 80) theta_u = np.pi / 4 P1 = [0, 1, 2, 3, 4, 6, 20] # TODO more powers for P in P1: P_lin = 10**(P / 10.0) x = np.sqrt(P_lin) * np.exp(1j * theta_u) * np.concatenate( [lora.gen_packet(SF, S1, R=R), np.zeros(15 * N * R)]) S1_out, S2_out = self._feed_system(x, R=R, Nsyms=len(S1)) self.assertEqual(S1, S1_out) self.assertEqual(len(S2_out), 0) theta_u += np.pi / 4
def test_002_two_packets(self): print("test_003_two_packets") S = np.arange(Nsyms) p = lora.gen_packet(SF, S, R=R) print(len(p)) n_z = 6 * N * R + 3 * N / 4 * R x = np.concatenate([p, np.zeros(n_z), p, np.zeros(10 * N * R)]) i1 = 0 i2 = len(p) + n_z assert i2 % N * R == 0 user_tags = {} user_tags[i1] = ('new_user', { 'power': 1.0, 'sto_int': 0, 'sto_frac': 0.0, 'cfo_int': 0, 'cfo_frac': 0.0 }) user_tags[i2] = ('new_user', { 'power': 1.0, 'sto_int': 0, 'sto_frac': 0.0, 'cfo_int': 0, 'cfo_frac': 0.0 }) y, window_tags = self._feed_synchro(x, user_tags) self.assertEqual(len(window_tags), (13 + Nsyms) * 2) # First user self.check_preamble(window_tags, start_offset=0) for i, w in enumerate(window_tags[13:13 + Nsyms]): self.assertEqual(w.offset, N * 12 + N / 4 + N * i) self.assertEqual(w.value['power1'], 1) self.assertEqual(w.value['win_len'], N) self.assertEqual(w.value['Tu'], SYNC_TYPE_PAYLOAD) self.assertEqual(w.value['Ti1'], SYNC_TYPE_VOID) self.assertEqual(w.value['Ti2'], SYNC_TYPE_VOID) self.assertFloatTuplesAlmostEqual(y[0:len(p) / R], x[0:len(p):R]) window_tags = window_tags[13 + Nsyms:] # Second user off = len(p) / R self.check_preamble(window_tags, start_offset=off) for i, w in enumerate(window_tags[13:13 + Nsyms]): self.assertEqual(w.offset, off + N * 12 + N / 4 + N * i) self.assertEqual(w.value['power1'], 1) self.assertEqual(w.value['win_len'], N) self.assertEqual(w.value['Tu'], SYNC_TYPE_PAYLOAD) self.assertEqual(w.value['Ti1'], SYNC_TYPE_VOID) self.assertEqual(w.value['Ti2'], SYNC_TYPE_VOID) # for i in range(13): # print(i, "y[{}:{}], x[{}:{}]".format(len(p)+N*i, len(p)+N*i+N, i2+N*i, i2+N*i+N)) # a = y[len(p)+N*i : len(p)+N*i+N] # b = x[i2+N*i : i2+N*i+N] # for c,d in zip(a,b): # print(c,d) # self.assertFloatTuplesAlmostEqual(y[len(p)+N*i : len(p)+N*i+N], x[i2+N*i : i2+N*i+N]) self.assertFloatTuplesAlmostEqual(y[len(p) / R:2 * len(p) / R], x[i2:i2 + len(p):R], places=5)