def test_010_sync_block(self): np.set_printoptions(precision=4) print 'GR block sync!' alpha = .5 M = 33 K = 32 L = 2 cp_len = K ramp_len = cp_len / 2 frame_len = 2 * K + cp_len + M * K test_cfo = -.2 snr_dB = 10.0 n_reps = 4 signal, preamble, pn_symbols = generate_test_sync_samples(M, K, L, alpha, cp_len, ramp_len, snr_dB, test_cfo) signal *= .001 kernel = gfdm.improved_sync_algorithm_kernel_cc(K, cp_len, preamble, 4000) nc, cfo, abs_corr_vals, corr_vals, napcc, apcc = find_frame_start(signal, np.array(kernel.preamble()), K, cp_len) print 'Python frame start: ', nc signal = np.tile(signal, n_reps) src = blocks.vector_source_c(signal) sync = gfdm.sync_cc(K, cp_len, frame_len, preamble, 'gfdm_block') snk = blocks.vector_sink_c() self.tb.connect(src, sync, snk) self.tb.run() ref = signal[nc:nc + frame_len] ref = np.tile(ref, n_reps) res = np.array(snk.data()) print 'res length:', len(res) / n_reps print 'frame size:', frame_len self.assertComplexTuplesAlmostEqual(ref, res)
def test_009_step_window(self): print 'long windowed test' alpha = .5 M = 33 K = 32 L = 2 cp_len = K ramp_len = cp_len / 2 test_cfo = -.2 snr_dB = 10.0 signal, preamble = generate_test_sync_samples(M, K, L, alpha, cp_len, ramp_len, snr_dB, test_cfo) signal *= .001 kernel = gfdm.improved_sync_algorithm_kernel_cc( K, cp_len, preamble, 4000) preamble = np.array(kernel.preamble()) nc, cfo, abs_corr_vals, corr_vals, napcc, apcc = find_frame_start( signal, preamble, K, cp_len) slen = len(signal) n_rep = 10 signal = np.tile(signal, n_rep) nc_vec = (np.arange(0, n_rep) * slen) + nc step_size = nc + 4 window_nc = np.array([], dtype=int) dumped = np.array([], dtype=int) for i in range(0, len(signal), step_size): w = signal[i:i + step_size + 3 * K] if len(w) > 4 * K: # it = i // step_size # print 'PROCESS WINDOW ', it snc = int(kernel.find_preamble(w)) if not snc == -2 * len(w): abs_nc = i + snc n_frame = len(window_nc) prev_pos = nc_vec[n_frame - 1] if abs_nc == prev_pos: print 'found:', abs_nc, 'previous:', prev_pos elif not abs_nc == nc_vec[n_frame]: print 'FAIL STATUS: reps', n_rep, 'detected frames:', n_frame, 'avail_frames:', len( nc_vec) print '#frame', n_frame, 'expected:', nc_vec[ n_frame], 'found:', abs_nc, 'diff:', abs_nc - nc_vec[ n_frame] print 'step_size:', step_size, 'step_start:', i, 'snc:', snc print nc_vec[n_frame - 3:n_frame + 3] print window_nc[-3:] self.assertEqual(abs_nc, nc_vec[n_frame]) else: # print 'SUCCESSFULLY detected frame @', abs_nc window_nc = np.append(window_nc, abs_nc) else: dumped = np.append(dumped, snc) self.assertTupleEqual(tuple(nc_vec), tuple(window_nc))
def test_007_frame(self): print 'find frame test' alpha = .5 M = 33 K = 32 L = 2 cp_len = K ramp_len = cp_len / 2 test_cfo = -.2 snr_dB = 20.0 signal, preamble = generate_test_sync_samples(M, K, L, alpha, cp_len, ramp_len, snr_dB, test_cfo) # print 'preamble size:', len(preamble), len(preamble) == 2 * K # print 'init kernel' kernel = gfdm.improved_sync_algorithm_kernel_cc( K, cp_len, preamble, 4000) preamble = np.array(kernel.preamble()) nc, cfo, auto_corr_vals, corr_vals, napcc, apcc = find_frame_start( signal, preamble, K, cp_len) # print 'kernel.find_preamble' knc = np.array(kernel.find_preamble(signal)) print knc, nc self.assertEqual(nc, knc)
def test_009_step_window(self): print 'long windowed test' alpha = .5 M = 33 K = 32 L = 2 cp_len = K ramp_len = cp_len / 2 test_cfo = -.2 snr_dB = 10.0 signal, preamble, pn_symbols = generate_test_sync_samples(M, K, L, alpha, cp_len, ramp_len, snr_dB, test_cfo) signal *= .001 kernel = gfdm.improved_sync_algorithm_kernel_cc(K, cp_len, preamble, 4000) preamble = np.array(kernel.preamble()) nc, cfo, abs_corr_vals, corr_vals, napcc, apcc = find_frame_start(signal, preamble, K, cp_len) slen = len(signal) n_rep = 10 signal = np.tile(signal, n_rep) nc_vec = (np.arange(0, n_rep) * slen) + nc step_size = nc + 4 window_nc = np.array([], dtype=int) dumped = np.array([], dtype=int) for i in range(0, len(signal), step_size): w = signal[i:i + step_size + 3 * K] if len(w) > 4 * K: # it = i // step_size # print 'PROCESS WINDOW ', it snc = int(kernel.find_preamble(w)) if not snc == -2 * len(w): abs_nc = i + snc n_frame = len(window_nc) prev_pos = nc_vec[n_frame - 1] if abs_nc == prev_pos: print 'found:', abs_nc, 'previous:', prev_pos elif not abs_nc == nc_vec[n_frame]: print 'FAIL STATUS: reps', n_rep, 'detected frames:', n_frame, 'avail_frames:', len(nc_vec) print '#frame', n_frame, 'expected:', nc_vec[n_frame], 'found:', abs_nc, 'diff:', abs_nc - nc_vec[n_frame] print 'step_size:', step_size, 'step_start:', i, 'snc:', snc print nc_vec[n_frame-3:n_frame+3] print window_nc[-3:] self.assertEqual(abs_nc, nc_vec[n_frame]) else: # print 'SUCCESSFULLY detected frame @', abs_nc window_nc = np.append(window_nc, abs_nc) else: dumped = np.append(dumped, snc) self.assertTupleEqual(tuple(nc_vec), tuple(window_nc))
def preamble_sync_test(): seed = 4711 timeslots = 9 subcarriers = 32 active_subcarriers = 20 cp_len = 16 filter_len = 8 overlap = 2 subcarrier_map = np.concatenate( (np.arange(0, active_subcarriers // 2), np.arange(subcarriers - active_subcarriers // 2, subcarriers))) print subcarrier_map snr_db = 5. offset = 1000 preamble, x_preamble = mapped_preamble(seed, 'rrc', .5, active_subcarriers, subcarriers, subcarrier_map, overlap, cp_len, filter_len) noise_variance = calculate_awgn_noise_variance(preamble, snr_db) rx = get_complex_noise_vector(len(preamble) + 2 * offset, noise_variance) rx[offset:offset + len(preamble)] += preamble print('frame offset', offset, 'with cp_len', cp_len) xc = np.correlate(rx, x_preamble, 'valid') # xc *= np.max(np.abs(rx)) / np.max(np.abs(xc)) # xc /= calculate_average_signal_energy(tx) peak = np.argmax(np.abs(xc)) print('frame located @{}'.format(peak)) nc, cfo, abs_corr_vals, corr_vals, napcc, apcc = find_frame_start( rx, x_preamble, subcarriers, cp_len) print('find frame start res @{} and cfo: {}'.format(nc, cfo)) s_nm, s_cfo, simple_ac = simplified_sync_algo(rx, x_preamble, subcarriers, cp_len) print('simple algo res @{} and cfo: {}'.format(s_nm, s_cfo)) sync_kernel = cgfdm.py_auto_cross_corr_multicarrier_sync_cc( subcarriers, cp_len, x_preamble) kpos, kcfo = sync_kernel.detect_frame(rx.astype(dtype=np.complex64)) print('kernel: nc={}, cfo={}'.format(kpos, kcfo)) assert (kpos == s_nm) assert (np.abs(s_cfo - kcfo) < 1e-7)
def test_008_auto_correlation_stepped(self): print 'test window buffering for auto correlation' alpha = .5 M = 33 K = 32 L = 2 cp_len = K ramp_len = cp_len / 2 test_cfo = -.2 snr_dB = 10.0 signal, preamble = generate_test_sync_samples(M, K, L, alpha, cp_len, ramp_len, snr_dB, test_cfo) signal *= .001 kernel = gfdm.improved_sync_algorithm_kernel_cc( K, cp_len, preamble, 4000) preamble = np.array(kernel.preamble()) nc, cfo, abs_corr_vals, corr_vals, napcc, apcc = find_frame_start( signal, preamble, K, cp_len) step_size = 1088 for i in range(0, len(signal), step_size): w = signal[i:i + step_size + 3 * K] a = abs_corr_vals[i:i + step_size] ref_buf = abs_corr_vals[i + step_size - 2 * K:i + step_size] cref_buf = corr_vals[i + step_size - 2 * K:i + step_size] inref_buf = signal[i + step_size - 2 * K:i + step_size] if len(w) > 4 * K and len(ref_buf) == 2 * K: bi_buf = np.array(kernel.integration_buffer()) kbuf = np.concatenate((bi_buf, a)) print 'KBEF argmax', np.argmax(kbuf) snc = int(kernel.find_preamble( w)) # necessary to update kernel state! ai_buf = np.array(kernel.integration_buffer()) self.assertFloatTuplesAlmostEqual(ref_buf, ai_buf, 5) c_buf = np.array(kernel.auto_corr_buffer()) self.assertComplexTuplesAlmostEqual(cref_buf, c_buf, 5) in_buf = np.array(kernel.input_buffer()) self.assertComplexTuplesAlmostEqual(inref_buf, in_buf)
def test_010_sync_block(self): np.set_printoptions(precision=4) print 'GR block sync!' alpha = .5 M = 33 K = 32 L = 2 cp_len = K ramp_len = cp_len / 2 frame_len = 2 * K + cp_len + M * K test_cfo = -.2 snr_dB = 10.0 n_reps = 4 signal, preamble = generate_test_sync_samples(M, K, L, alpha, cp_len, ramp_len, snr_dB, test_cfo) signal *= .001 kernel = gfdm.improved_sync_algorithm_kernel_cc( K, cp_len, preamble, 4000) nc, cfo, abs_corr_vals, corr_vals, napcc, apcc = find_frame_start( signal, np.array(kernel.preamble()), K, cp_len) print 'Python frame start: ', nc signal = np.tile(signal, n_reps) src = blocks.vector_source_c(signal) sync = gfdm.sync_cc(K, cp_len, frame_len, preamble, 'gfdm_block') snk = blocks.vector_sink_c() self.tb.connect(src, sync, snk) self.tb.run() ref = signal[nc:nc + frame_len] ref = np.tile(ref, n_reps) res = np.array(snk.data()) print 'res length:', len(res) / n_reps print 'frame size:', frame_len self.assertComplexTuplesAlmostEqual(ref, res)
def preamble_sync_test(): seed = 4711 timeslots = 9 subcarriers = 32 active_subcarriers = 20 cp_len = 16 filter_len = 8 overlap = 2 subcarrier_map = np.concatenate((np.arange(0, active_subcarriers // 2), np.arange(subcarriers - active_subcarriers // 2, subcarriers))) print subcarrier_map snr_db = 5. offset = 1000 preamble, x_preamble = mapped_preamble(seed, 'rrc', .5, active_subcarriers, subcarriers, subcarrier_map, overlap, cp_len, filter_len) noise_variance = calculate_awgn_noise_variance(preamble, snr_db) rx = get_complex_noise_vector(len(preamble) + 2 * offset, noise_variance) rx[offset:offset + len(preamble)] += preamble print('frame offset', offset, 'with cp_len', cp_len) xc = np.correlate(rx, x_preamble, 'valid') # xc *= np.max(np.abs(rx)) / np.max(np.abs(xc)) # xc /= calculate_average_signal_energy(tx) peak = np.argmax(np.abs(xc)) print('frame located @{}'.format(peak)) nc, cfo, abs_corr_vals, corr_vals, napcc, apcc = find_frame_start(rx, x_preamble, subcarriers, cp_len) print('find frame start res @{} and cfo: {}'.format(nc, cfo)) s_nm, s_cfo, simple_ac = simplified_sync_algo(rx, x_preamble, subcarriers, cp_len) print('simple algo res @{} and cfo: {}'.format(s_nm, s_cfo)) sync_kernel = cgfdm.py_auto_cross_corr_multicarrier_sync_cc(subcarriers, cp_len, x_preamble) kpos, kcfo = sync_kernel.detect_frame(rx.astype(dtype=np.complex64)) print('kernel: nc={}, cfo={}'.format(kpos, kcfo)) assert(kpos == s_nm) assert(np.abs(s_cfo - kcfo) < 1e-7)
def test_007_frame(self): print 'find frame test' alpha = .5 M = 33 K = 32 L = 2 cp_len = K ramp_len = cp_len / 2 test_cfo = -.2 snr_dB = 20.0 signal, preamble, pn_symbols = generate_test_sync_samples(M, K, L, alpha, cp_len, ramp_len, snr_dB, test_cfo) # print 'preamble size:', len(preamble), len(preamble) == 2 * K # print 'init kernel' kernel = gfdm.improved_sync_algorithm_kernel_cc(K, cp_len, preamble, 4000) preamble = np.array(kernel.preamble()) nc, cfo, auto_corr_vals, corr_vals, napcc, apcc = find_frame_start(signal, preamble, K, cp_len) # print 'kernel.find_preamble' knc = np.array(kernel.find_preamble(signal)) print knc, nc self.assertEqual(nc, knc)
def test_008_auto_correlation_stepped(self): print 'test window buffering for auto correlation' alpha = .5 M = 33 K = 32 L = 2 cp_len = K ramp_len = cp_len / 2 test_cfo = -.2 snr_dB = 10.0 signal, preamble, pn_symbols = generate_test_sync_samples(M, K, L, alpha, cp_len, ramp_len, snr_dB, test_cfo) signal *= .001 kernel = gfdm.improved_sync_algorithm_kernel_cc(K, cp_len, preamble, 4000) preamble = np.array(kernel.preamble()) nc, cfo, abs_corr_vals, corr_vals, napcc, apcc = find_frame_start(signal, preamble, K, cp_len) step_size = 1088 for i in range(0, len(signal), step_size): w = signal[i:i + step_size + 3 * K] a = abs_corr_vals[i:i + step_size] ref_buf = abs_corr_vals[i + step_size - 2 * K:i + step_size] cref_buf = corr_vals[i + step_size - 2 * K:i + step_size] inref_buf = signal[i + step_size - 2 * K:i + step_size] if len(w) > 4 * K and len(ref_buf) == 2 * K: bi_buf = np.array(kernel.integration_buffer()) kbuf = np.concatenate((bi_buf, a)) print 'KBEF argmax', np.argmax(kbuf) snc = int(kernel.find_preamble(w)) # necessary to update kernel state! ai_buf = np.array(kernel.integration_buffer()) self.assertFloatTuplesAlmostEqual(ref_buf, ai_buf, 5) c_buf = np.array(kernel.auto_corr_buffer()) self.assertComplexTuplesAlmostEqual(cref_buf, c_buf, 5) in_buf = np.array(kernel.input_buffer()) self.assertComplexTuplesAlmostEqual(inref_buf, in_buf)