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
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
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
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
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)
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)
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)
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
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
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
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)
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)
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)
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)
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)
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)