Пример #1
0
    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)
Пример #2
0
    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))
Пример #3
0
    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)
Пример #4
0
    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))
Пример #5
0
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)
Пример #6
0
    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)
Пример #7
0
    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)
Пример #8
0
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)
Пример #9
0
    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)
Пример #10
0
    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)