def test_002_t(self): #OQPSK, no frequency offset mod = dsss_modulator() mod.shr_goldcode_reset_per_symbol = True mod.shr_goldcode_seed = np.random.randint(500, 500000) mod.shr_spreading_factor = 8 mod.sfd_present = False mod.preamble_size = 32 mod.init() sps = 2 sf = 2**mod.shr_spreading_factor #init preamble block self.preamble_search = dsss_preamble_search_cc( sf, mod.shr_goldcode_seed, 0, 0, [0], mod.preamble_size, False, sps, 0, 1000000, 'oqpsk', [0]) #generate data with preamble only preamble = mod.oqpsk(mod.encode_header()) n = 6 data_in = [] positions = [] for i in range(n): data_in = np.append(data_in, np.zeros(np.random.randint(10000, 20000))) data_in = np.append(data_in, preamble) positions = np.append(positions, len(data_in) + self.preamble_search.rx_delay - 1) #delay in data signal in filterbank data_in = np.append(data_in, np.zeros(np.random.randint(10000, 20000))) data_in = data_in + np.random.randn(len(data_in)) * 5 # set up fg self.src = blocks.vector_source_c_make(data_in, False, 1, []) self.snk_corr = blocks.vector_sink_c_make(1) self.snk_data = blocks.vector_sink_c_make(1) self.tb.connect(self.src, self.preamble_search) self.tb.connect((self.preamble_search, 0), self.snk_data) self.tb.connect((self.preamble_search, 1), self.snk_corr) self.tb.run() # check data tags = self.snk_data.tags() searched_positions = np.array([]) for i in range(len(tags)): searched_positions = np.append(searched_positions, tags[i].offset + sf) found = np.in1d(positions, searched_positions.astype(int)) self.assertTrue(np.all(found))
def test_006_t(self): #OQPSK, frequency offset, multiple frequency paths mod = dsss_modulator() mod.shr_goldcode_reset_per_symbol = True mod.shr_goldcode_seed = np.random.randint(500, 500000) mod.shr_spreading_factor = 8 mod.sfd_present = False mod.preamble_size = 32 mod.init() sps = 2 sf = 2**mod.shr_spreading_factor chiprate = 2000000 fo = 8000 # Hz #init preamble block self.preamble_search = dsss_preamble_search_cc( sf, mod.shr_goldcode_seed, 0, 0, [0, 7900, -7900], mod.preamble_size, False, sps, 0, chiprate, 'oqpsk', [0]) #generate data with preamble only preamble = mod.oqpsk(mod.encode_header()) n = 20 data_in = [] positions = [] for i in range(n): data_in = np.append(data_in, np.zeros(np.random.randint(10000, 20000))) data_in = np.append(data_in, preamble) positions = np.append(positions, len(data_in) + self.preamble_search.rx_delay - 1) #delay in data signal in filterbank data_in = np.append(data_in, np.zeros(np.random.randint(10000, 20000))) #frequency offset data_in = data_in * np.exp( 1j * 2.0 * np.pi * fo / chiprate * np.arange(0, len(data_in))) #add some noise data_in = data_in + np.random.randn(len(data_in)) * 1 # set up fg self.src = blocks.vector_source_c_make(data_in, False, 1, []) self.snk_corr = blocks.vector_sink_c_make(1) self.snk_data = blocks.vector_sink_c_make(1) self.tb.connect(self.src, self.preamble_search) self.tb.connect((self.preamble_search, 0), self.snk_data) self.tb.connect((self.preamble_search, 1), self.snk_corr) self.tb.run() # check data #time offset estimation tags = self.snk_data.tags() searched_positions = np.array([]) for i in range(len(tags)): searched_positions = np.append(searched_positions, tags[i].offset + sf) found = np.in1d(positions, searched_positions.astype(int)) self.assertTrue(np.all(found)) #freq offset estimation mask = np.in1d(searched_positions.astype(int), positions) v = np.asarray(tags)[mask] for t in v: self.assertTrue(pmt.to_python(t.value)['fo_est'] < fo * 1.2) self.assertTrue(pmt.to_python(t.value)['fo_est'] > fo * 0.8)