示例#1
0
    def test_001_t(self):
        alpha = .5
        M = 8
        K = 4
        L = 2
        taps = get_frequency_domain_filter('rrc', alpha, M, K, L)
        taps /= np.sqrt(calculate_signal_energy(taps) / M)
        # data = np.repeat(np.arange(1, K + 1), M)
        data = get_random_qpsk(M * K)
        D = get_data_matrix(data, K, group_by_subcarrier=False)

        src = blocks.vector_source_c(data)
        mod = gfdm.simple_modulator_cc(M, K, L, taps)
        dst = blocks.vector_sink_c()

        self.tb.connect(src, mod, dst)
        # set up fg
        self.tb.run()
        # check data
        res = np.array(dst.data())
        # res /= M * K

        # F = gfdm_transform_subcarriers_to_fd(D, M)
        # F = gfdm_upsample_subcarriers_in_fd(F, K, L)
        # F = gfdm_filter_subcarriers_in_fd(F, taps, M, K, L)

        ref = gfdm_modulate_block(D, taps, M, K, L, False)

        self.assertComplexTuplesAlmostEqual(ref, res, 5)
示例#2
0
    def test_002_big_data(self):
        print("big data test")
        reps = 5
        alpha = .5
        M = 127
        K = 16
        L = 4
        taps = get_frequency_domain_filter('rrc', alpha, M, K, L)
        taps /= np.sqrt(calculate_signal_energy(taps) / M)
        data = np.array([], dtype=complex)
        ref = np.array([], dtype=complex)
        for i in range(reps):
            d = get_random_qpsk(M * K)
            D = get_data_matrix(d, K, group_by_subcarrier=False)
            ref = np.append(ref, gfdm_modulate_block(D, taps, M, K, L, False))
            data = np.append(data, d)

        src = blocks.vector_source_c(data)
        mod = gfdm.simple_modulator_cc(M, K, L, taps)
        dst = blocks.vector_sink_c()

        self.tb.connect(src, mod, dst)
        # set up fg
        self.tb.run()
        # check data
        res = np.array(dst.data())
        # res /= M * K

        self.assertComplexTuplesAlmostEqual(ref, res, 2)
    def test_002_big_data(self):
        print "big data test"
        reps = 5
        alpha = .5
        M = 127
        K = 16
        L = 4
        taps = get_frequency_domain_filter('rrc', alpha, M, K, L)
        data = np.array([], dtype=np.complex)
        ref = np.array([], dtype=np.complex)
        for i in range(reps):
            d = get_random_qpsk(M * K)
            D = get_data_matrix(d, K, group_by_subcarrier=False)
            ref = np.append(ref, gfdm_modulate_block(D, taps, M, K, L, False))
            data = np.append(data, d)
        # print data
        # print ref
        # print "MAXIMUM ref value: ", np.max(abs(ref))

        src = blocks.vector_source_c(data)
        mod = gfdm.simple_modulator_cc(M, K, L, taps)
        dst = blocks.vector_sink_c()

        self.tb.connect(src, mod, dst)
        # set up fg
        self.tb.run()
        # check data
        res = np.array(dst.data())
        # res /= M * K
        # print "MAXIMUM result value: ", np.max(abs(res))

        self.assertComplexTuplesAlmostEqual(ref, res, 2)
示例#4
0
    def test_001_t(self):
        nsubcarrier = 4
        ntimeslots = 16
        filter_alpha = 0.35
        tag_key = "frame_len"
        fft_length = nsubcarrier * ntimeslots
        taps = get_frequency_domain_filter('rrc', filter_alpha, ntimeslots,
                                           nsubcarrier, 2)

        data = get_random_qpsk(nsubcarrier * ntimeslots)
        D = get_data_matrix(data, nsubcarrier, group_by_subcarrier=False)
        print D

        md = gfdms.modulator_cc(nsubcarrier, ntimeslots, filter_alpha,
                                fft_length, 1, tag_key)
        tagger = blocks.stream_to_tagged_stream(gr.sizeof_gr_complex, 1,
                                                fft_length, tag_key)
        src = blocks.vector_source_c(data)
        dst = blocks.vector_sink_c()
        self.tb.connect(src, tagger, md, dst)
        self.tb.run()

        res = np.array(dst.data())
        print res
        ref = gfdm_modulate_block(D, taps, ntimeslots, nsubcarrier, 2, True)
        print ref

        self.assertComplexTuplesAlmostEqual(ref, res, 2)
示例#5
0
    def test_001_t(self):
        nsubcarrier = 4
        ntimeslots = 16
        filter_alpha = 0.35
        tag_key = "frame_len"
        fft_length = nsubcarrier * ntimeslots
        taps = get_frequency_domain_filter('rrc', filter_alpha, ntimeslots, nsubcarrier, 2)

        data = get_random_qpsk(nsubcarrier * ntimeslots)
        # data = np.zeros(nsubcarrier)
        # data[0] = 1
        # data = np.repeat(data, ntimeslots)
        D = get_data_matrix(data, nsubcarrier, group_by_subcarrier=False)
        print D

        md = gfdms.modulator_cc(nsubcarrier, ntimeslots, filter_alpha, fft_length, 1, tag_key)
        tagger = blocks.stream_to_tagged_stream(gr.sizeof_gr_complex, 1, fft_length, tag_key)
        src = blocks.vector_source_c(data)
        dst = blocks.vector_sink_c()
        self.tb.connect(src, tagger, md, dst)
        self.tb.run()

        res = np.array(dst.data())
        print res
        ref = gfdm_modulate_block(D, taps, ntimeslots, nsubcarrier, 2, True)
        print ref

        self.assertComplexTuplesAlmostEqual(ref, res, 2)
    def validate_parameter_set(self, K, Kon, M, tolerance=5e-4):
        self.params.K = K
        self.params.Kon = Kon
        self.params.M = self.params.Mon = M
        self.params.Non = self.params.Kon * self.params.Mon
        self.params.N = self.params.K * self.params.M
        self.params.pulse = 'rc_fd'

        self.subcarrier_map = get_subcarrier_map(self.params.K,
                                                 self.params.Kon, dc_free=True)
        self.params.Kset = self.subcarrier_map
        # vtaps = vc.gfdmutil.get_transmitter_pulse(self.params)
        # vtaps = vtaps[::self.params.K // self.params.L]
        # taps = np.fft.fft(vtaps)
        # taps = get_frequency_domain_filter(self.params.pulse, self.params.a,
        #                                    self.params.M, self.params.K,
        #                                    self.params.L)
        taps = vc.gfdmutil.get_transmitter_pulse(self.params)
        g2 = taps[::self.params.K // self.params.L]
        taps = np.fft.fft(g2)

        mod = vc.DefaultModulator(self.params)

        d = np.random.randn(self.params.Non) + 1.j * np.random.randn(self.params.Non)
        dframe = map_to_waveform_resource_grid(d, self.params.Kon,
                                               self.params.K,
                                               self.subcarrier_map, True)

        vdata = mod.modulate(dframe)
        vdata *= 1. / np.linalg.norm(vdata)
        gdata = gfdm_modulate_block(dframe.T, taps, self.params.M,
                                    self.params.K, self.params.L, False)
        gdata *= 1. / np.linalg.norm(gdata)
        print(np.max(np.abs(vdata - gdata)))
        self.assertTrue(np.all(np.abs(vdata - gdata) < tolerance))
    def test_001_t(self):
        alpha = .5
        M = 8
        K = 4
        L = 2
        taps = get_frequency_domain_filter('rrc', alpha, M, K, L)
        # data = np.repeat(np.arange(1, K + 1), M)
        data = get_random_qpsk(M * K)
        D = get_data_matrix(data, K, group_by_subcarrier=False)
        # print data
        # print D
        src = blocks.vector_source_c(data)
        mod = gfdm.simple_modulator_cc(M, K, L, taps)
        dst = blocks.vector_sink_c()

        self.tb.connect(src, mod, dst)
        # set up fg
        self.tb.run()
        # check data
        res = np.array(dst.data())
        # res /= M * K

        # F = gfdm_transform_subcarriers_to_fd(D, M)
        # F = gfdm_upsample_subcarriers_in_fd(F, K, L)
        # F = gfdm_filter_subcarriers_in_fd(F, taps, M, K, L)

        ref = gfdm_modulate_block(D, taps, M, K, L, False)

        self.assertComplexTuplesAlmostEqual(ref, res, 5)
示例#8
0
    def test_005_steps(self):
        timeslots = 5
        subcarriers = 32
        overlap = 2
        filter_alpha = 0.35

        taps = get_frequency_domain_filter('rrc', filter_alpha,
                                           timeslots, subcarriers,
                                           overlap)

        data = get_random_qpsk(timeslots * subcarriers)
        D = get_data_matrix(data, subcarriers, group_by_subcarrier=False)
        frame = gfdm_modulate_block(D, taps, timeslots, subcarriers,
                                    overlap, False)
        ref = gfdm_demodulate_block(
            frame, taps, subcarriers, timeslots, overlap)

        demod = Demodulator(timeslots, subcarriers, overlap, taps)
        fd_res = demod.fft_filter_downsample(frame)
        res = demod.transform_subcarriers_to_td(fd_res)

        self.assertComplexTuplesAlmostEqual(ref, res, 5)

        for _ in range(2):
            ic_res = demod.cancel_sc_interference(data, fd_res)
            res = demod.transform_subcarriers_to_td(ic_res)

        self.assertComplexTuplesAlmostEqual(data, res, 1)
示例#9
0
    def test_001_t(self):
        np.set_printoptions(precision=2)
        n_frames = 3
        alpha = .5
        active = 8
        M = 8
        K = 16
        L = 2
        cp_len = 8
        cs_len = 4
        ramp_len = 4
        block_len = M * K
        window_len = get_window_len(cp_len, M, K, cs_len)
        taps = get_frequency_domain_filter('rrc', alpha, M, K, L)
        taps /= np.sqrt(calculate_signal_energy(taps) / M)
        window_taps = get_raised_cosine_ramp(ramp_len, window_len)
        pn_symbols = get_random_qpsk(K)
        H_preamble = get_frequency_domain_filter('rrc', alpha, 2, K, L)
        preamble = get_sync_symbol(pn_symbols, H_preamble, K, L, cp_len,
                                   ramp_len)[0]
        smap = get_subcarrier_map(K, active, dc_free=True)

        ref = np.array([], dtype=complex)
        data = np.array([], dtype=complex)
        frame_len = window_len + len(preamble)
        frame_gap = np.zeros(frame_len)
        for i in range(n_frames):
            d = get_random_qpsk(active * M)
            dd = map_to_waveform_resources(d, active, K, smap)
            D = get_data_matrix(dd, K, group_by_subcarrier=False)
            b = gfdm_modulate_block(D, taps, M, K, L, False)
            b = add_cyclic_starfix(b, cp_len, cs_len)
            b = pinch_block(b, window_taps)
            ref = np.concatenate((ref, frame_gap, preamble, b))
            data = np.concatenate((data, d))

        src = blocks.vector_source_c(data)
        mapper = gfdm.resource_mapper_cc(active, K, M, smap, True)
        mod = gfdm.simple_modulator_cc(M, K, L, taps)
        prefixer = gfdm.cyclic_prefixer_cc(block_len, cp_len, cs_len, ramp_len,
                                           window_taps)
        preambler = blocks.vector_insert_c(preamble,
                                           window_len + len(preamble), 0)
        gapper = blocks.vector_insert_c(frame_gap, frame_len + len(frame_gap),
                                        0)
        dst = blocks.vector_sink_c()

        self.tb.connect(src, mapper, mod, prefixer, preambler, gapper, dst)
        # self.tb.connect(src, mapper, dst)
        self.tb.run()
        res = np.array(dst.data())[0:len(ref)]

        self.assertComplexTuplesAlmostEqual(ref, res, 5)
示例#10
0
    def test_001_t(self):
        np.set_printoptions(precision=2)
        n_frames = 7
        alpha = .5
        active_subcarriers = 52
        timeslots = 9
        subcarriers = 64
        overlap = 2
        cp_len = 8
        cs_len = 4
        ramp_len = 4

        window_len = get_window_len(cp_len, timeslots, subcarriers, cs_len)
        taps = get_frequency_domain_filter('rrc', alpha, timeslots,
                                           subcarriers, overlap)
        # taps /= np.sqrt(calculate_signal_energy(taps) / time)
        window_taps = get_raised_cosine_ramp(ramp_len, window_len)
        pn_symbols = get_random_qpsk(subcarriers)
        H_preamble = get_frequency_domain_filter('rrc', alpha, 2,
                                                 subcarriers, overlap)
        preamble = get_sync_symbol(pn_symbols, H_preamble, subcarriers,
                                   overlap, cp_len, ramp_len)[0]
        smap = get_subcarrier_map(subcarriers, active_subcarriers, True)

        ref = np.array([], dtype=np.complex)
        data = np.array([], dtype=np.complex)

        for i in range(n_frames):
            d = get_random_qpsk(active_subcarriers * timeslots)
            dd = map_to_waveform_resources(d, active_subcarriers,
                                           subcarriers, smap)
            D = get_data_matrix(dd, subcarriers, group_by_subcarrier=False)
            b = gfdm_modulate_block(D, taps, timeslots, subcarriers,
                                    overlap, False)
            b = add_cyclic_starfix(b, cp_len, cs_len)
            b = pinch_block(b, window_taps)
            ref = np.concatenate((ref, preamble, b))
            data = np.concatenate((data, d))

        src = blocks.vector_source_c(data)
        dut = gfdm.transmitter_cc(timeslots, subcarriers, active_subcarriers,
                                  cp_len, cs_len, ramp_len, smap, True,
                                  overlap, taps, window_taps, preamble, "packet_len")
        dst = blocks.vector_sink_c()

        self.tb.connect(src, dut, dst)
        self.tb.run()
        res = np.array(dst.data())[0:len(ref)]
        self.assertComplexTuplesAlmostEqual(ref, res, 5)

        tags = dst.tags()
        for t in tags:
            print(t.offset, t.value)
示例#11
0
def generate_reference_frame(symbols, timeslots, subcarriers, active_subcarriers, subcarrier_map,
                             taps, overlap, cp_len, cs_len, window_taps, cyclic_shifts, preambles):
    dd = map_to_waveform_resources(symbols, active_subcarriers,
                                   subcarriers, subcarrier_map)
    D = get_data_matrix(dd, subcarriers, group_by_subcarrier=False)
    b = gfdm_modulate_block(D, taps, timeslots, subcarriers,
                            overlap, False)
    frame = []
    for cs, p in zip(cyclic_shifts, preambles):
        data = np.roll(b, cs)
        data = add_cyclic_starfix(data, cp_len, cs_len)
        data = pinch_block(data, window_taps)
        frame.append(np.concatenate((p, data)))
    return frame
示例#12
0
    def test_001_t(self):
        np.set_printoptions(precision=2)
        n_frames = 3
        alpha = .5
        active = 8
        M = 8
        K = 16
        L = 2
        cp_len = 8
        cs_len = 4
        ramp_len = 4
        block_len = M * K
        window_len = get_window_len(cp_len, M, K, cs_len)
        taps = get_frequency_domain_filter('rrc', alpha, M, K, L)
        taps /= np.sqrt(calculate_signal_energy(taps) / M)
        window_taps = get_raised_cosine_ramp(ramp_len, window_len)
        pn_symbols = get_random_qpsk(K)
        H_preamble = get_frequency_domain_filter('rrc', alpha, 2, K, L)
        preamble = get_sync_symbol(pn_symbols, H_preamble, K, L, cp_len, ramp_len)[0]
        smap = get_subcarrier_map(K, active, dc_free=True)

        ref = np.array([], dtype=np.complex)
        data = np.array([], dtype=np.complex)
        frame_len = window_len + len(preamble)
        frame_gap = np.zeros(frame_len)
        for i in range(n_frames):
            d = get_random_qpsk(active * M)
            dd = map_to_waveform_resources(d, active, K, smap)
            D = get_data_matrix(dd, K, group_by_subcarrier=False)
            b = gfdm_modulate_block(D, taps, M, K, L, False)
            b = add_cyclic_starfix(b, cp_len, cs_len)
            b = pinch_block(b, window_taps)
            ref = np.concatenate((ref, frame_gap, preamble, b))
            data = np.concatenate((data, d))

        src = blocks.vector_source_c(data)
        mapper = gfdm.resource_mapper_cc(active, K, M, smap, True)
        mod = gfdm.simple_modulator_cc(M, K, L, taps)
        prefixer = gfdm.cyclic_prefixer_cc(block_len, cp_len, cs_len, ramp_len, window_taps)
        preambler = blocks.vector_insert_c(preamble, window_len + len(preamble), 0)
        gapper = blocks.vector_insert_c(frame_gap, frame_len + len(frame_gap), 0)
        dst = blocks.vector_sink_c()

        self.tb.connect(src, mapper, mod, prefixer, preambler, gapper, dst)
        # self.tb.connect(src, mapper, dst)
        self.tb.run()
        res = np.array(dst.data())[0:len(ref)]

        self.assertComplexTuplesAlmostEqual(ref, res, 5)
示例#13
0
    def test_002_big(self):
        timeslots = 21
        subcarriers = 128
        overlap = 2
        filter_alpha = 0.35

        taps = get_frequency_domain_filter("rrc", filter_alpha, timeslots,
                                           subcarriers, overlap)

        data = get_random_qpsk(timeslots * subcarriers)
        D = get_data_matrix(data, subcarriers, group_by_subcarrier=False)

        ref = gfdm_modulate_block(D, taps, timeslots, subcarriers, overlap,
                                  False)

        mod = Modulator(timeslots, subcarriers, overlap, taps)
        res = mod.modulate(data)

        self.assertComplexTuplesAlmostEqual(ref, res, 5)
示例#14
0
    def test_002_small(self):
        timeslots = 16
        subcarriers = 4
        overlap = 2
        filter_alpha = 0.35

        taps = get_frequency_domain_filter("rrc", filter_alpha, timeslots,
                                           subcarriers, overlap)

        data = get_random_qpsk(timeslots * subcarriers)
        D = get_data_matrix(data, subcarriers, group_by_subcarrier=False)
        frame = gfdm_modulate_block(D, taps, timeslots, subcarriers, overlap,
                                    False)
        ref = gfdm_demodulate_block(frame, taps, subcarriers, timeslots,
                                    overlap)

        demod = Demodulator(timeslots, subcarriers, overlap, taps)
        res = demod.demodulate(frame)

        self.assertComplexTuplesAlmostEqual(ref, res, 6)
示例#15
0
    def test_004_big_equalize(self):
        timeslots = 21
        subcarriers = 128
        overlap = 2
        filter_alpha = 0.35

        taps = get_frequency_domain_filter("rrc", filter_alpha, timeslots,
                                           subcarriers, overlap)

        data = get_random_qpsk(timeslots * subcarriers)
        D = get_data_matrix(data, subcarriers, group_by_subcarrier=False)
        frame = gfdm_modulate_block(D, taps, timeslots, subcarriers, overlap,
                                    False)
        ref = gfdm_demodulate_block(frame, taps, subcarriers, timeslots,
                                    overlap)
        eq_vals = np.ones(ref.size, ref.dtype) * np.exp(1.0j)

        demod = Demodulator(timeslots, subcarriers, overlap, taps)
        res = demod.demodulate_equalize(frame * np.exp(1.0j), eq_vals)

        self.assertComplexTuplesAlmostEqual(ref, res, 5)
示例#16
0
    def test_001_t(self):
        np.set_printoptions(precision=2)
        n_frames = 3
        alpha = .5
        M = 8
        K = 4
        L = 2
        cp_len = 8
        ramp_len = 4
        block_len = M * K
        window_len = get_window_len(cp_len, M, K)
        taps = get_frequency_domain_filter('rrc', alpha, M, K, L)
        window_taps = get_raised_cosine_ramp(ramp_len, window_len)
        pn_symbols = get_random_qpsk(K)
        H_preamble = get_frequency_domain_filter('rrc', alpha, 2, K, L)
        preamble = get_sync_symbol(pn_symbols, H_preamble, K, L, cp_len, ramp_len)

        ref = np.array([], dtype=np.complex)
        data = np.array([], dtype=np.complex)
        for i in range(n_frames):
            d = get_random_qpsk(block_len)
            D = get_data_matrix(d, K, group_by_subcarrier=False)
            b = gfdm_modulate_block(D, taps, M, K, L, False)
            b = add_cyclic_prefix(b, cp_len)
            b = pinch_block(b, window_taps)
            ref = np.concatenate((ref, preamble, b))
            data = np.concatenate((data, d))

        src = blocks.vector_source_c(data)
        mod = gfdm.simple_modulator_cc(M, K, L, taps)
        prefixer = gfdm.cyclic_prefixer_cc(cp_len, ramp_len, block_len, window_taps)
        preambler = blocks.vector_insert_c(preamble, window_len + len(preamble), 0)
        dst = blocks.vector_sink_c()

        self.tb.connect(src, mod, prefixer, preambler, dst)
        self.tb.run()
        res = np.array(dst.data())[0:len(ref)]

        self.assertComplexTuplesAlmostEqual(ref, res, 5)
示例#17
0
    def validate_parameter_set(self, K, Kon, M, tolerance=5e-4):
        self.params.K = K
        self.params.Kon = Kon
        self.params.M = self.params.Mon = M
        self.params.Non = self.params.Kon * self.params.Mon
        self.params.N = self.params.K * self.params.M
        self.params.pulse = 'rc_fd'

        self.subcarrier_map = get_subcarrier_map(self.params.K,
                                                 self.params.Kon,
                                                 dc_free=True)
        self.params.Kset = self.subcarrier_map
        # vtaps = vc.gfdmutil.get_transmitter_pulse(self.params)
        # vtaps = vtaps[::self.params.K // self.params.L]
        # taps = np.fft.fft(vtaps)
        # taps = get_frequency_domain_filter(self.params.pulse, self.params.a,
        #                                    self.params.M, self.params.K,
        #                                    self.params.L)
        taps = vc.gfdmutil.get_transmitter_pulse(self.params)
        g2 = taps[::self.params.K // self.params.L]
        taps = np.fft.fft(g2)

        mod = vc.DefaultModulator(self.params)

        d = np.random.randn(
            self.params.Non) + 1.j * np.random.randn(self.params.Non)
        dframe = map_to_waveform_resource_grid(d, self.params.Kon,
                                               self.params.K,
                                               self.subcarrier_map, True)

        vdata = mod.modulate(dframe)
        vdata *= 1. / np.linalg.norm(vdata)
        gdata = gfdm_modulate_block(dframe.T, taps, self.params.M,
                                    self.params.K, self.params.L, False)
        gdata *= 1. / np.linalg.norm(gdata)
        print(np.max(np.abs(vdata - gdata)))
        self.assertTrue(np.all(np.abs(vdata - gdata) < tolerance))
示例#18
0
    def test_006_steps_equalize(self):
        timeslots = 5
        subcarriers = 32
        overlap = 2
        filter_alpha = 0.35

        taps = get_frequency_domain_filter('rrc', filter_alpha,
                                           timeslots, subcarriers,
                                           overlap)

        data = get_random_qpsk(timeslots * subcarriers)
        D = get_data_matrix(data, subcarriers, group_by_subcarrier=False)
        frame = gfdm_modulate_block(D, taps, timeslots, subcarriers,
                                    overlap, False)
        ref = gfdm_demodulate_block(
            frame, taps, subcarriers, timeslots, overlap)
        eq_vals = np.ones(ref.size, ref.dtype) * np.exp(1.j)

        demod = Demodulator(timeslots, subcarriers, overlap, taps)
        fd_res = demod.fft_equalize_filter_downsample(
            frame * np.exp(1.j), eq_vals)
        res = demod.transform_subcarriers_to_td(fd_res)

        self.assertComplexTuplesAlmostEqual(ref, res, 5)