예제 #1
0
def generate_integrated_frame(timeslots, subcarriers, active_subcarriers, cp_len, cs_len, alpha=.2):
    p_seed = utils.generate_seed('awesome preamble')
    f_seed = utils.generate_seed('awesome frame')
    subcarrier_map = mapping.get_subcarrier_map(subcarriers, active_subcarriers, dc_free=True)
    overlap = 2
    p, p_vals = preamble.symmetric_mapped_preamble(p_seed, 'rrc', alpha, active_subcarriers, subcarriers, subcarrier_map, overlap, cp_len, cs_len)
    frame_preamble, x_preamble = p
    p = gfdm_modulation.modulate_mapped_gfdm_block(np.concatenate((p_vals, p_vals, np.zeros((timeslots - 2) * active_subcarriers))), timeslots, subcarriers, active_subcarriers, overlap, alpha, dc_free=True)
    x_preamble = p[0:len(x_preamble)]

    d = utils.get_random_qpsk((timeslots - 4) * active_subcarriers, f_seed)
    d = np.tile(p_vals, timeslots)
    # d = np.concatenate((p_vals, p_vals, d, p_vals, p_vals))
    # d = utils.get_random_qpsk((timeslots - 2) * active_subcarriers, f_seed)
    # d = np.concatenate((p_vals, p_vals, d))


    d_frame = mod_frame = gfdm_modulation.modulate_mapped_gfdm_block(d, timeslots, subcarriers, active_subcarriers, overlap, alpha, dc_free=True)

    symbol = cyclic_prefix.add_cyclic_starfix(d_frame, cp_len, cs_len)

    window_ramp = cyclic_prefix.get_raised_cosine_ramp(cs_len, cyclic_prefix.get_window_len(cp_len, timeslots, subcarriers, cs_len))
    # d_frame = cyclic_prefix.pinch_block(symbol, window_ramp)

    H = filters.get_frequency_domain_filter('rrc', alpha, timeslots, subcarriers, overlap)
    return p, mod_frame, x_preamble, d, H
예제 #2
0
def implementation_validation():
    M = 33
    K = 32
    alpha = .5
    overlap = 2
    H = get_frequency_domain_filter('rrc', alpha, M, K, overlap)
    taps = gfdm_filter_taps('rrc', alpha, M, K, 1)
    A = gfdm_modulation_matrix(taps, M, K)

    tests = 100
    max_rel_error = 0.0
    for t in range(tests):
        d = get_random_samples(M * K)
        xmat = A.dot(d) / np.sqrt(len(d))
        D = get_data_matrix(d, K, group_by_subcarrier=True)
        xfft = gfdm_modulate_block(D, H, M, K, overlap, False) / np.sqrt(
            len(d))
        rel_err = np.linalg.norm(xmat - xfft) / np.linalg.norm(xmat)
        if rel_err > max_rel_error:
            max_rel_error = rel_err
        if rel_err > 1e-3:
            raise RuntimeError(
                'Relative error between FFT and Matrix implementation is above 1e-3!'
            )
    print 'maximum relative error is:', max_rel_error
예제 #3
0
def gfdm_modulate_fft(data, alpha, M, K, overlap):
    # this function aims to reproduce [0] Section IIIA

    H = get_frequency_domain_filter('rrc', alpha, M, K, overlap)
    D = get_data_matrix(data, K, group_by_subcarrier=False)
    return gfdm_modulate_block(D, H, M, K, overlap, False)
    return x
예제 #4
0
def generate_reference_frame(timeslots,
                             subcarriers,
                             active_subcarriers,
                             cp_len,
                             cs_len,
                             alpha=.2):
    p_seed = utils.generate_seed('awesome preamble')
    f_seed = utils.generate_seed('awesome frame')
    subcarrier_map = mapping.get_subcarrier_map(subcarriers,
                                                active_subcarriers,
                                                dc_free=True)
    overlap = 2
    frame_preamble, x_preamble = preamble.mapped_preamble(
        p_seed, 'rrc', alpha, active_subcarriers, subcarriers, subcarrier_map,
        overlap, cp_len, cs_len)
    d = utils.get_random_qpsk(timeslots * active_subcarriers, f_seed)
    d_frame = mod_frame = gfdm_modulation.modulate_mapped_gfdm_block(
        d,
        timeslots,
        subcarriers,
        active_subcarriers,
        overlap,
        alpha,
        dc_free=True)
    symbol = cyclic_prefix.add_cyclic_starfix(d_frame, cp_len, cs_len)
    window_ramp = cyclic_prefix.get_raised_cosine_ramp(
        cs_len,
        cyclic_prefix.get_window_len(cp_len, timeslots, subcarriers, cs_len))
    d_frame = cyclic_prefix.pinch_block(symbol, window_ramp)

    H = filters.get_frequency_domain_filter('rrc', alpha, timeslots,
                                            subcarriers, overlap)
    return np.concatenate(
        (frame_preamble, d_frame)), mod_frame, x_preamble, d, H
예제 #5
0
def gfdm_gr_modulator(x, filtertype, alpha, M, K, L, compat_mode=True):
    # this function aims to reproduce [0] Section IIIA
    H = get_frequency_domain_filter(filtertype, alpha, M, K, L)

    # compare [0]: D holds symbols grouped by subcarrier in each column.
    D = get_data_matrix(x, K, group_by_subcarrier=compat_mode)

    return gfdm_modulate_block(D, H, M, K, L, compat_mode=compat_mode)
예제 #6
0
def gfdm_modulate_fft(data, alpha, M, K, overlap):
    # this function aims to reproduce [0] Section IIIA

    H = get_frequency_domain_filter('rrc', alpha, M, K, overlap)
    filter_energy = calculate_signal_energy(H)
    scaling_factor = 1. / np.sqrt(filter_energy / M)
    H *= scaling_factor
    D = get_data_matrix(data, K, group_by_subcarrier=False)
    return gfdm_modulate_block(D, H, M, K, overlap, False)
예제 #7
0
def modulate_mapped_gfdm_block(data, ts, sc, active_sc, overlap, alpha, dc_free=False):
    # const gfdm_complex scaling_factor = gfdm_complex(1. / std::sqrt(std::abs(res) / n_timeslots), 0.0f);
    smap = get_subcarrier_map(sc, active_sc, dc_free=dc_free)
    dm = map_to_waveform_resource_grid(data, active_sc, sc, smap).T
    H = get_frequency_domain_filter('rrc', alpha, ts, sc, overlap)
    filter_energy = calculate_signal_energy(H)
    scaling_factor = 1. / np.sqrt(filter_energy / ts)
    H = H * scaling_factor
    # print filter_energy, scaling_factor, calculate_signal_energy(H)
    return gfdm_modulate_block(dm, H, ts, sc, overlap, False)
예제 #8
0
def generate_integrated_frame(timeslots,
                              subcarriers,
                              active_subcarriers,
                              cp_len,
                              cs_len,
                              alpha=.2):
    p_seed = utils.generate_seed('awesome preamble')
    f_seed = utils.generate_seed('awesome frame')
    subcarrier_map = mapping.get_subcarrier_map(subcarriers,
                                                active_subcarriers,
                                                dc_free=True)
    overlap = 2
    p, p_vals = preamble.symmetric_mapped_preamble(p_seed, 'rrc', alpha,
                                                   active_subcarriers,
                                                   subcarriers, subcarrier_map,
                                                   overlap, cp_len, cs_len)
    frame_preamble, x_preamble = p
    p = gfdm_modulation.modulate_mapped_gfdm_block(np.concatenate(
        (p_vals, p_vals, np.zeros((timeslots - 2) * active_subcarriers))),
                                                   timeslots,
                                                   subcarriers,
                                                   active_subcarriers,
                                                   overlap,
                                                   alpha,
                                                   dc_free=True)
    x_preamble = p[0:len(x_preamble)]

    d = utils.get_random_qpsk((timeslots - 4) * active_subcarriers, f_seed)
    d = np.tile(p_vals, timeslots)
    # d = np.concatenate((p_vals, p_vals, d, p_vals, p_vals))
    # d = utils.get_random_qpsk((timeslots - 2) * active_subcarriers, f_seed)
    # d = np.concatenate((p_vals, p_vals, d))

    d_frame = mod_frame = gfdm_modulation.modulate_mapped_gfdm_block(
        d,
        timeslots,
        subcarriers,
        active_subcarriers,
        overlap,
        alpha,
        dc_free=True)

    symbol = cyclic_prefix.add_cyclic_starfix(d_frame, cp_len, cs_len)

    window_ramp = cyclic_prefix.get_raised_cosine_ramp(
        cs_len,
        cyclic_prefix.get_window_len(cp_len, timeslots, subcarriers, cs_len))
    # d_frame = cyclic_prefix.pinch_block(symbol, window_ramp)

    H = filters.get_frequency_domain_filter('rrc', alpha, timeslots,
                                            subcarriers, overlap)
    return p, mod_frame, x_preamble, d, H
예제 #9
0
def generate_reference_frame(timeslots, subcarriers, active_subcarriers, cp_len, cs_len, alpha=.2):
    p_seed = utils.generate_seed('awesome preamble')
    f_seed = utils.generate_seed('awesome frame')
    subcarrier_map = mapping.get_subcarrier_map(subcarriers, active_subcarriers, dc_free=True)
    overlap = 2
    frame_preamble, x_preamble = preamble.mapped_preamble(p_seed, 'rrc', alpha, active_subcarriers, subcarriers, subcarrier_map, overlap, cp_len, cs_len)
    d = utils.get_random_qpsk(timeslots * active_subcarriers, f_seed)
    d_frame = mod_frame = gfdm_modulation.modulate_mapped_gfdm_block(d, timeslots, subcarriers, active_subcarriers, overlap, alpha, dc_free=True)
    symbol = cyclic_prefix.add_cyclic_starfix(d_frame, cp_len, cs_len)
    window_ramp = cyclic_prefix.get_raised_cosine_ramp(cs_len, cyclic_prefix.get_window_len(cp_len, timeslots, subcarriers, cs_len))
    d_frame = cyclic_prefix.pinch_block(symbol, window_ramp)

    H = filters.get_frequency_domain_filter('rrc', alpha, timeslots, subcarriers, overlap)
    return np.concatenate((frame_preamble, d_frame)), mod_frame, x_preamble, d, H
예제 #10
0
def implementation_validation():
    M = 33
    K = 32
    alpha = .5
    overlap = 2
    H = get_frequency_domain_filter('rrc', alpha, M, K, overlap)
    taps = gfdm_filter_taps('rrc', alpha, M, K, 1)
    A = gfdm_modulation_matrix(taps, M, K)

    tests = 100
    max_rel_error = 0.0
    for t in range(tests):
        d = get_random_samples(M * K)
        xmat = A.dot(d) / np.sqrt(len(d))
        D = get_data_matrix(d, K, group_by_subcarrier=True)
        xfft = gfdm_modulate_block(D, H, M, K, overlap, False) / np.sqrt(len(d))
        rel_err = np.linalg.norm(xmat - xfft) / np.linalg.norm(xmat)
        if rel_err > max_rel_error:
            max_rel_error = rel_err
        if rel_err > 1e-3:
            raise RuntimeError('Relative error between FFT and Matrix implementation is above 1e-3!')
    print 'maximum relative error is:', max_rel_error
예제 #11
0
def gfdm_modulate_fft(data, alpha, M, K, overlap):
    # this function aims to reproduce [0] Section IIIA

    H = get_frequency_domain_filter('rrc', alpha, M, K, overlap)
    D = get_data_matrix(data, K, group_by_subcarrier=False)
    return gfdm_modulate_block(D, H, M, K, overlap, False)
예제 #12
0
def generate_sync_symbol(pn_symbols, filtertype, alpha, K, L, cp_len, ramp_len):
    H = get_frequency_domain_filter(filtertype, alpha, 2, K, L)
    filter_energy = calculate_signal_energy(H)
    scaling_factor = 1. / np.sqrt(filter_energy / 2)
    H = H * scaling_factor
    return get_sync_symbol(pn_symbols, H, K, L, cp_len, ramp_len)
예제 #13
0
def generate_sync_symbol(pn_symbols, filtertype, alpha, K, L, cp_len,
                         ramp_len):
    H = get_frequency_domain_filter(filtertype, alpha, 2, K, L)
    return get_sync_symbol(pn_symbols, H, K, L, cp_len, ramp_len)
예제 #14
0
def gfdm_demodulate_fft(data, alpha, M, K, overlap, sic_rounds=0):
    H = get_frequency_domain_filter('rrc', alpha, M, K, overlap)
    return gfdm_demodulate_block_sic(data, H.conj(), K, M, overlap, sic_rounds)
예제 #15
0
def gfdm_gr_receiver(data, filtertype, alpha, M, K, overlap, compat_mode=True):
    H = get_frequency_domain_filter(filtertype, alpha, M, K,
                                    overlap) / float(K)
    return gfdm_demodulate_block(data, H.conj(), K, M, overlap)
예제 #16
0
def modulate_mapped_gfdm_block(data, ts, sc, active_sc, overlap, alpha):
    smap = get_subcarrier_map(sc, active_sc)
    dm = map_to_waveform_resource_grid(data, active_sc, sc, smap).T
    H = get_frequency_domain_filter('rrc', alpha, ts, sc, overlap)
    return gfdm_modulate_block(dm, H, ts, sc, overlap, False)
예제 #17
0
def gfdm_gr_receiver(data, filtertype, alpha, M, K, overlap, compat_mode=True):
    H = get_frequency_domain_filter(filtertype, alpha, M, K, overlap) / float(K)
    return gfdm_demodulate_block(data, H.conj(), K, M, overlap)
예제 #18
0
def gfdm_demodulate_fft(data, alpha, M, K, overlap, sic_rounds=0):
    H = get_frequency_domain_filter('rrc', alpha, M, K, overlap)
    return gfdm_demodulate_block_sic(data, H.conj(), K, M, overlap, sic_rounds)