def modulate_gfdm_frame(tx_symbols, params): mapper = cgfdm.py_resource_mapper_kernel_cc(params['timeslots'], params['fft_len'], params['active_subcarriers'], params['subcarrier_map']) taps = get_frequency_domain_filter(params['prototype_type'], params['prototype_alpha'], params['timeslots'], params['fft_len'], params['overlap']) kernel = cgfdm.py_modulator_kernel_cc(params['timeslots'], params['fft_len'], params['overlap'], taps) win_filt = get_raised_cosine_ramp(params['filter_len'], params['timeslots'] * params['fft_len'] + params['cp_len']) cpler = cgfdm.py_add_cyclic_prefix_cc(params['timeslots'] * params['fft_len'], params['cp_len'], params['filter_len'], win_filt) syms = mapper.map_to_resources(tx_symbols) frame = kernel.modulate(syms.flatten()) frame = cpler.add_cyclic_prefix(frame) return frame
def resource_mapping_test(): active = 110 fft_len = 128 timeslots = 205 smap = np.arange(active) + (active - active) // 2 per_timeslot = True mapper = cgfdm.py_resource_mapper_kernel_cc(timeslots, fft_len, active, smap, per_timeslot) demapper = cgfdm.py_resource_demapper_kernel_cc(timeslots, fft_len, active, smap, per_timeslot) assert mapper.input_vector_size() == demapper.output_vector_size() assert mapper.output_vector_size() == demapper.input_vector_size() N = 10 for i in range(N): data = np.random.randn(2, active * timeslots) data = data[0] + 1j * data[1] data = data.astype(dtype=np.complex64) tx = mapper.map_to_resources(data) rd = demapper.demap_from_resources(tx, len(data)) assert len(data) == len(rd) assert np.all(np.abs(data - rd) < 1e-10)