Example #1
0
 def generate_preamble(self, subcarriers, active_subcarriers, cp_len,
                       ramp_len, cyclic_shift):
     subcarrier_map = get_subcarrier_map(subcarriers, active_subcarriers,
                                         dc_free=True)
     return mapped_preamble(self.seed, self.filtertype, self.filteralpha,
                            active_subcarriers, subcarriers,
                            subcarrier_map, self.overlap, cp_len, ramp_len,
                            use_zadoff_chu=True, cyclic_shift=cyclic_shift)
Example #2
0
    def test_003_snr(self):
        nframes = 30
        timeslots = 5
        subcarriers = 1024
        active_subcarriers = 936
        overlap = 2
        cp_len = subcarriers // 2
        ramp_len = cp_len // 2
        active_ratio = subcarriers / active_subcarriers

        subcarrier_map = get_subcarrier_map(subcarriers, active_subcarriers,
                                            dc_free=True)
        preambles = mapped_preamble(self.seed, self.filtertype, self.filteralpha,
                                    active_subcarriers, subcarriers,
                                    subcarrier_map, overlap, cp_len, ramp_len)

        core_preamble = preambles[1]

        sigenergy = calculate_energy(core_preamble)

        data = np.copy(core_preamble)
        snrs = np.arange(3, 3 * nframes, 3, dtype=np.float)
        snrs_lin = 10. ** (snrs / 10.)
        expected_snrs_lin = np.concatenate(((np.inf,), snrs_lin))

        for i, snr_lin in enumerate(snrs_lin):
            nscale = calculate_noise_scale(
                snr_lin, sigenergy, active_ratio, core_preamble.size)
            noise = get_noise_vector(core_preamble.size, nscale)

            d = core_preamble + noise
            data = np.concatenate((data, d))

        dut = gfdm.channel_estimator_cc(
            timeslots, subcarriers, active_subcarriers, True, 1, core_preamble)
        src = blocks.vector_source_c(data)
        snk = blocks.vector_sink_c()
        self.tb.connect(src, dut, snk)
        self.tb.run()

        res = np.array(snk.data())
        self.assertEqual(res.size, nframes * timeslots * subcarriers)

        tags = snk.tags()
        snr_tags = [t for t in tags if pmt.eq(t.key, pmt.mp("snr_lin"))]

        for i, t in enumerate(snr_tags):
            self.assertEqual(t.offset, i * timeslots * subcarriers)
            res_lin = pmt.to_float(t.value)
            res_db = 10. * np.log10(res_lin)
            ref_db = 10. * np.log10(expected_snrs_lin[i])
            # print(f"Reference: {ref_db:6.3f}dB\t{res_db:6.3f}dB")

            if np.isfinite(ref_db):
                self.assertTrue(np.abs(res_db - ref_db) < 1.)
Example #3
0
def get_full_preambles(filtertype, alpha, active_subcarriers, subcarriers,
                       subcarrier_map, overlap, cp_len, ramp_len,
                       cyclic_shifts):
    seed = 4711
    preambles = []
    for cs in cyclic_shifts:
        p = mapped_preamble(seed, filtertype, alpha, active_subcarriers, subcarriers,
                            subcarrier_map, overlap, cp_len, ramp_len,
                            use_zadoff_chu=True, cyclic_shift=cs)
        preambles.append(p[0])
    return preambles
    def test_001_t(self):
        n_frames = 20
        timeslots = 9
        subcarriers = 128
        active_subcarriers = 110
        cp_len = subcarriers // 2
        smap = get_subcarrier_map(subcarriers, active_subcarriers)
        seed = 4711
        ftype = 'rrc'
        falpha = .5

        preamble, x_preamble = mapped_preamble(seed, ftype, falpha,
                                               active_subcarriers, subcarriers,
                                               smap, 2, cp_len, cp_len // 2)
        frame_len = len(preamble) + timeslots * subcarriers + cp_len
        frame_gap = np.zeros(frame_len, dtype=np.complex)
        data = frame_gap
        ref = np.array([], dtype=np.complex)
        for i in range(n_frames):
            d_block = modulate_mapped_gfdm_block(
                get_random_qpsk(timeslots * active_subcarriers), timeslots,
                subcarriers, active_subcarriers, 2, falpha)
            frame = pinch_cp_add_block(d_block, timeslots, subcarriers, cp_len,
                                       cp_len // 2)
            frame = np.concatenate((preamble, frame))
            ref = np.concatenate((ref, frame))
            data = np.concatenate((data, frame, frame_gap))

        # print np.sum(np.abs(x_preamble) ** 2)
        # import matplotlib.pyplot as plt
        # plt.plot(data.real)
        # plt.plot(data.imag)
        # plt.show()
        backoff = 80

        src = blocks.vector_source_c(data)
        e_detector = gfdm.frame_energy_detector_cc(10., 32, frame_len, backoff,
                                                   'energy')
        detector = gfdm.simple_preamble_sync_cc(frame_len, subcarriers, cp_len,
                                                x_preamble, 'energy', 'frame')
        snk = blocks.vector_sink_c()

        self.tb.connect(src, e_detector, detector, snk)
        self.tb.run()
        # check data
        res = np.array(snk.data())
        tags = snk.tags()
        for t in tags:
            print 'srcid {}, key {}, offset {}, value {}'.format(
                t.srcid, t.key, t.offset, t.value)

        self.assertComplexTuplesAlmostEqual(res, ref[0:len(res)], 5)
Example #5
0
    def test_001_t(self):
        n_frames = 20
        timeslots = 9
        subcarriers = 128
        active_subcarriers = 110
        cp_len = subcarriers // 2
        smap = get_subcarrier_map(subcarriers, active_subcarriers)
        seed = 4711
        ftype = 'rrc'
        falpha = .5
        tag_key = 'frame_start'

        preamble, x_preamble = mapped_preamble(seed, ftype, falpha,
                                               active_subcarriers, subcarriers,
                                               smap, 2, cp_len, cp_len // 2)
        block_len = timeslots * subcarriers
        offset = len(preamble) + cp_len
        frame_len = len(preamble) + timeslots * subcarriers + cp_len

        data = np.array([], dtype=np.complex)
        ref = np.array([], dtype=np.complex)
        tags = []
        print 'frame_len: ', frame_len
        for i in range(n_frames):
            d_block = modulate_mapped_gfdm_block(
                get_random_qpsk(timeslots * active_subcarriers), timeslots,
                subcarriers, active_subcarriers, 2, falpha)
            frame = pinch_cp_add_block(d_block, timeslots, subcarriers, cp_len,
                                       cp_len // 2)
            frame = np.concatenate((preamble, frame))
            r = frame[offset:offset + block_len]
            ref = np.concatenate((ref, r))
            tag = gr.tag_t()
            tag.key = pmt.string_to_symbol(tag_key)
            tag.offset = len(data)
            tag.srcid = pmt.string_to_symbol('qa')
            tag.value = pmt.from_long(block_len)
            tags.append(tag)
            data = np.concatenate((data, frame))

        src = blocks.vector_source_c(data, False, 1, tags)
        cp_rm = gfdm.remove_prefix_cc(frame_len, block_len, offset, tag_key)
        snk = blocks.vector_sink_c()
        self.tb.connect(src, cp_rm, snk)
        self.tb.run()

        # # check data
        res = np.array(snk.data())
        tags = snk.tags()
        self.assertTrue(len(tags) == 0)  # propagation policy is TPP_DONT
        self.assertComplexTuplesAlmostEqual(res, ref, 5)
Example #6
0
    def test_001_selective(self):
        timeslots = 5
        subcarriers = 64
        active_subcarriers = 52
        overlap = 2
        cp_len = subcarriers // 2
        ramp_len = cp_len // 2
        active_symbols = timeslots * active_subcarriers

        subcarrier_map = get_subcarrier_map(subcarriers,
                                            active_subcarriers,
                                            dc_free=True)
        preambles = mapped_preamble(
            self.seed,
            self.filtertype,
            self.filteralpha,
            active_subcarriers,
            subcarriers,
            subcarrier_map,
            overlap,
            cp_len,
            ramp_len,
        )
        full_preamble = preambles[0]
        core_preamble = preambles[1]
        h = np.array([1.0, 0.5, 0.1j, 0.1 + 0.05j], dtype=complex)
        data = np.convolve(full_preamble, h, "full")[0:full_preamble.size]
        data = data[cp_len:-ramp_len]
        self.assertEqual(data.size, core_preamble.size)

        estimator = Preamble_channel_estimator(timeslots, subcarriers,
                                               active_subcarriers, True, 1,
                                               core_preamble)
        self.assertEqual(estimator.timeslots(), timeslots)
        self.assertEqual(estimator.subcarriers(), subcarriers)
        self.assertEqual(estimator.active_subcarriers(), active_subcarriers)
        self.assertEqual(estimator.frame_len(), timeslots * subcarriers)
        self.assertEqual(estimator.is_dc_free(), True)

        res = estimator.estimate_frame(data)
        lowres = res[0:active_symbols // 2]
        hires = res[-active_symbols // 2:]

        fh = np.fft.fft(h, timeslots * subcarriers)
        lowfh = fh[0:active_symbols // 2]
        hifh = fh[-active_symbols // 2:]

        self.assertComplexTuplesAlmostEqual(lowres, lowfh, 1)
        self.assertComplexTuplesAlmostEqual(hires, hifh, 1)
    def test_002_selective(self):
        timeslots = 5
        subcarriers = 64
        active_subcarriers = 52
        overlap = 2
        cp_len = subcarriers // 2
        ramp_len = cp_len // 2
        active_symbols = timeslots * active_subcarriers

        subcarrier_map = get_subcarrier_map(subcarriers,
                                            active_subcarriers,
                                            dc_free=True)
        preambles = mapped_preamble(
            self.seed,
            self.filtertype,
            self.filteralpha,
            active_subcarriers,
            subcarriers,
            subcarrier_map,
            overlap,
            cp_len,
            ramp_len,
        )
        full_preamble = preambles[0]
        core_preamble = preambles[1]
        h = np.array([1.0, 0.5, 0.1j, 0.1 + 0.05j], dtype=complex)
        data = np.convolve(full_preamble, h, "full")[0:full_preamble.size]
        data = data[cp_len:-ramp_len]
        self.assertEqual(data.size, core_preamble.size)

        dut = gfdm.channel_estimator_cc(timeslots, subcarriers,
                                        active_subcarriers, True, 1,
                                        core_preamble)
        src = blocks.vector_source_c(data)
        snk = blocks.vector_sink_c()
        self.tb.connect(src, dut, snk)
        self.tb.run()

        res = np.array(snk.data())
        lowres = res[0:active_symbols // 2]
        hires = res[-active_symbols // 2:]

        fh = np.fft.fft(h, timeslots * subcarriers)
        lowfh = fh[0:active_symbols // 2]
        hifh = fh[-active_symbols // 2:]

        self.assertComplexTuplesAlmostEqual(lowres, lowfh, 1)
        self.assertComplexTuplesAlmostEqual(hires, hifh, 1)
Example #8
0
    def test_002_snr(self):
        timeslots = 5
        subcarriers = 1024
        active_subcarriers = 936
        overlap = 2
        cp_len = subcarriers // 2
        ramp_len = cp_len // 2
        active_ratio = subcarriers / active_subcarriers

        subcarrier_map = get_subcarrier_map(subcarriers,
                                            active_subcarriers,
                                            dc_free=True)
        preambles = mapped_preamble(
            self.seed,
            self.filtertype,
            self.filteralpha,
            active_subcarriers,
            subcarriers,
            subcarrier_map,
            overlap,
            cp_len,
            ramp_len,
        )

        core_preamble = preambles[1]

        sigenergy = calculate_energy(core_preamble)

        data = np.copy(core_preamble)
        snr = 4.0
        snr_lin = 10.0**(snr / 10.0)

        nscale = calculate_noise_scale(snr_lin, sigenergy, active_ratio,
                                       core_preamble.size)
        noise = get_noise_vector(core_preamble.size, nscale)

        data = core_preamble + noise

        estimator = Preamble_channel_estimator(timeslots, subcarriers,
                                               active_subcarriers, True, 1,
                                               core_preamble)

        res = estimator.estimate_snr(data)
        res_db = 10.0 * np.log10(res)

        print(res, snr_lin)
        print(res_db, snr)
        self.assertTrue(np.abs(res_db - snr) < 1.0)
Example #9
0
    def test_001_t(self):
        n_frames = 20
        timeslots = 9
        subcarriers = 128
        active_subcarriers = 110
        cp_len = subcarriers // 2
        smap = get_subcarrier_map(subcarriers, active_subcarriers)
        seed = 4711
        ftype = 'rrc'
        falpha = .5
        tag_key = 'frame_start'

        preamble, x_preamble = mapped_preamble(seed, ftype, falpha, active_subcarriers, subcarriers, smap, 2, cp_len, cp_len // 2)
        block_len = timeslots * subcarriers
        offset = len(preamble) + cp_len
        frame_len = len(preamble) + timeslots * subcarriers + cp_len

        data = np.array([], dtype=np.complex)
        ref = np.array([], dtype=np.complex)
        tags = []
        print 'frame_len: ', frame_len
        for i in range(n_frames):
            d_block = modulate_mapped_gfdm_block(get_random_qpsk(timeslots * active_subcarriers), timeslots, subcarriers, active_subcarriers, 2, falpha)
            frame = pinch_cp_add_block(d_block, timeslots, subcarriers, cp_len, cp_len // 2)
            frame = np.concatenate((preamble, frame))
            r = frame[offset:offset + block_len]
            ref = np.concatenate((ref, r))
            tag = gr.tag_t()
            tag.key = pmt.string_to_symbol(tag_key)
            tag.offset = len(data)
            tag.srcid = pmt.string_to_symbol('qa')
            tag.value = pmt.from_long(block_len)
            tags.append(tag)
            data = np.concatenate((data, frame))

        src = blocks.vector_source_c(data, False, 1, tags)
        cp_rm = gfdm.remove_prefix_cc(frame_len, block_len, offset, tag_key)
        snk = blocks.vector_sink_c()
        self.tb.connect(src, cp_rm, snk)
        self.tb.run()

        # # check data
        res = np.array(snk.data())
        tags = snk.tags()
        self.assertTrue(len(tags) == 0)  # propagation policy is TPP_DONT
        self.assertComplexTuplesAlmostEqual(res, ref, 5)
    def test_001_t(self):
        n_frames = 20
        timeslots = 9
        subcarriers = 128
        active_subcarriers = 110
        cp_len = subcarriers // 2
        smap = get_subcarrier_map(subcarriers, active_subcarriers)
        seed = 4711
        ftype = 'rrc'
        falpha = .5

        preamble, x_preamble = mapped_preamble(seed, ftype, falpha, active_subcarriers, subcarriers, smap, 2, cp_len, cp_len // 2)
        frame_len = len(preamble) + timeslots * subcarriers + cp_len
        frame_gap = np.zeros(frame_len, dtype=np.complex)
        data = frame_gap
        ref = np.array([], dtype=np.complex)
        for i in range(n_frames):
            d_block = modulate_mapped_gfdm_block(get_random_qpsk(timeslots * active_subcarriers), timeslots, subcarriers, active_subcarriers, 2, falpha)
            frame = pinch_cp_add_block(d_block, timeslots, subcarriers, cp_len, cp_len // 2)
            frame = np.concatenate((preamble, frame))
            ref = np.concatenate((ref, frame))
            data = np.concatenate((data, frame, frame_gap))

        # print np.sum(np.abs(x_preamble) ** 2)
        # import matplotlib.pyplot as plt
        # plt.plot(data.real)
        # plt.plot(data.imag)
        # plt.show()
        backoff = 80

        src = blocks.vector_source_c(data)
        e_detector = gfdm.frame_energy_detector_cc(10., 32, frame_len, backoff, 'energy')
        detector = gfdm.simple_preamble_sync_cc(frame_len, subcarriers, cp_len, x_preamble, 'energy', 'frame')
        snk = blocks.vector_sink_c()

        self.tb.connect(src, e_detector, detector, snk)
        self.tb.run()
        # check data
        res = np.array(snk.data())
        tags = snk.tags()
        for t in tags:
            print 'srcid {}, key {}, offset {}, value {}'.format(t.srcid, t.key, t.offset, t.value)

        self.assertComplexTuplesAlmostEqual(res, ref[0:len(res)], 5)
Example #11
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)
Example #12
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)
Example #13
0
    def test_001_simple(self):
        timeslots = 3
        subcarriers = 32
        active_subcarriers = 24
        overlap = 2
        cp_len = subcarriers // 2
        ramp_len = cp_len // 2

        subcarrier_map = get_subcarrier_map(subcarriers,
                                            active_subcarriers,
                                            dc_free=True)
        preambles = mapped_preamble(
            self.seed,
            self.filtertype,
            self.filteralpha,
            active_subcarriers,
            subcarriers,
            subcarrier_map,
            overlap,
            cp_len,
            ramp_len,
        )
        core_preamble = preambles[1]

        dut = gfdm.channel_estimator_cc(timeslots, subcarriers,
                                        active_subcarriers, True, 1,
                                        core_preamble)
        src = blocks.vector_source_c(core_preamble)
        snk = blocks.vector_sink_c()
        self.tb.connect(src, dut, snk)
        self.tb.run()

        res = np.array(snk.data())
        self.assertComplexTuplesAlmostEqual(res,
                                            np.ones(res.size, dtype=res.dtype),
                                            6)