def __init__(self, N=12, M=256, indices=[], mapping=0, modulation=16, cp_ratio=0.25): gr.hier_block2.__init__(self, "scfdma_receiver_cb", gr.io_signature(1, 1, gr.sizeof_gr_complex*1), gr.io_signature(len(indices), len(indices), gr.sizeof_char*1), ) ################################################## # Parameters ################################################## self.indices = indices self.modulation = modulation self.cp_ratio = cp_ratio self.M = M self.N = N self.mapping = mapping ################################################## # Variables ################################################## self.demappers = demappers = list() self.idft_blocks = idft_blocks = list() self.estimation_blocks = estimation_blocks = list() ################################################## # Blocks ################################################## # self.ofdm_scfdma_subcarrier_demapper_vcvc_0 = ofdm.scfdma_subcarrier_demapper_vcvc(N, M, start_index, mapping) # self.ofdm_fbmc_symbol_estimation_vcb_0 = ofdm.fbmc_symbol_estimation_vcb(N, modulation) # self.fft_vxx_0_0 = fft.fft_vcc(N, False, (), True, 1) self.fft_vxx_0 = fft.fft_vcc(M, True, (), True, 1) self.blocks_stream_to_vector_0 = blocks.stream_to_vector(gr.sizeof_gr_complex*1, M) self.blocks_keep_m_in_n_0 = blocks.keep_m_in_n(gr.sizeof_gr_complex, M, int(M*(1+cp_ratio)), int(cp_ratio*M)) # create demappers, idft and estimation blocks for i in range(len(indices)): self.demappers.append(ofdm.scfdma_subcarrier_demapper_vcvc(N, M, indices[i], mapping)) self.idft_blocks.append(fft.fft_vcc(N, False, (), True, 1)) self.estimation_blocks.append(ofdm.fbmc_symbol_estimation_vcb(N, modulation)) ################################################## # Connections ################################################## self.connect((self, 0), (self.blocks_keep_m_in_n_0, 0)) self.connect((self.blocks_keep_m_in_n_0, 0), (self.blocks_stream_to_vector_0, 0)) self.connect((self.blocks_stream_to_vector_0, 0), (self.fft_vxx_0, 0)) # connect the rest for i in range(len(indices)): self.connect((self.fft_vxx_0, 0), (self.demappers[i],0)) self.connect((self.demappers[i],0), (self.idft_blocks[i],0)) self.connect((self.idft_blocks[i],0), (self.estimation_blocks[i],0)) self.connect((self.estimation_blocks[i],0), (self, i))
def __init__(self, M=1024, K=4, qam_size=16, syms_per_frame=10, carriers=924, theta_sel=0, sel_eq=0, exclude_preamble=0, sel_preamble=0, zero_pads=1, extra_pad=False): gr.hier_block2.__init__( self, "fbmc_receiver_hier_cb", gr.io_signature(1, 1, gr.sizeof_gr_complex * 1), gr.io_signature(1, 1, gr.sizeof_char * 1), ) ################################################## # Parameters ################################################## self.theta_sel = theta_sel self.exclude_preamble = exclude_preamble self.sel_eq = sel_eq self.M = M self.K = K self.qam_size = qam_size self.syms_per_frame = syms_per_frame ################################################## # Variables ################################################## if self.exclude_preamble == 1 and self.sel_eq != 3: self.sel_eq = sel_eq = 3 warnings.warn( "Since exclude_preamble is set as 1, sel_eq is forced to be 3 (no equalizer)" ) self.skip = skip = 0 if exclude_preamble == 1 or sel_eq == 3 or sel_eq == 0: self.skip = skip = 0 else: self.skip = skip = 1 # Assertions assert (M > 0 and K > 0 and qam_size > 0), "M, K and qam_size should be bigger than 0" assert ((math.log(M) / math.log(2)) == int( math.log(M) / math.log(2))), "M should be a power of 2" assert (K == 4), "for now only K=4 s supported." assert (qam_size == 4 or qam_size == 16 or qam_size == 64 or qam_size == 128 or qam_size == 256 ), "Only 4-,16-,64-,128-,256-qam constellations are supported." assert (theta_sel == 0 or theta_sel == 1) assert (exclude_preamble == 0 or exclude_preamble == 1) ################################################## # Blocks ################################################## self.ofdm_vector_mask_0 = ofdm.vector_mask(M, (M - carriers) / 2, carriers, []) self.ofdm_fbmc_symbol_estimation_vcb_0 = ofdm.fbmc_symbol_estimation_vcb( carriers, qam_size) # unsigned int M, unsigned int syms_per_frame, int sel_preamble, int zero_pads, bool extra_pad, int sel_eq self.ofdm_fbmc_subchannel_processing_vcvc_0 = ofdm.fbmc_subchannel_processing_vcvc( M, syms_per_frame, sel_preamble, zero_pads, extra_pad, sel_eq) self.ofdm_fbmc_separate_vcvc_0 = ofdm.fbmc_separate_vcvc(M, 2) self.ofdm_fbmc_remove_preamble_vcvc_0 = ofdm.fbmc_remove_preamble_vcvc( M, syms_per_frame, sel_preamble, zero_pads, extra_pad) self.ofdm_fbmc_polyphase_network_vcvc_3 = ofdm.fbmc_polyphase_network_vcvc( M, K, K * M - 1, True) self.ofdm_fbmc_polyphase_network_vcvc_2 = ofdm.fbmc_polyphase_network_vcvc( M, K, K * M - 1, True) self.ofdm_fbmc_overlapping_serial_to_parallel_cvc_0 = ofdm.fbmc_overlapping_serial_to_parallel_cvc( M) self.ofdm_fbmc_oqam_postprocessing_vcvc_0 = ofdm.fbmc_oqam_postprocessing_vcvc( M, 0, theta_sel) self.ofdm_fbmc_junction_vcvc_0 = ofdm.fbmc_junction_vcvc(M, 2) self.ofdm_fbmc_beta_multiplier_vcvc_1 = ofdm.fbmc_beta_multiplier_vcvc( M, K, K * M - 1, 0) self.fft_vxx_1 = fft.fft_vcc(M, True, ([]), True, 1) self.blocks_skiphead_0_0 = blocks.skiphead(gr.sizeof_gr_complex * M, skip) self.blocks_skiphead_0 = blocks.skiphead(gr.sizeof_gr_complex * M, 2 * K - 1 - 1) self.blocks_null_sink_0 = blocks.null_sink(gr.sizeof_gr_complex * M) self.blks2_selector_0_0 = grc_blks2.selector( item_size=gr.sizeof_gr_complex * M, num_inputs=2, num_outputs=1, input_index=exclude_preamble, output_index=0, ) ################################################## # Connections ################################################## self.connect((self.blks2_selector_0_0, 0), (self.ofdm_fbmc_oqam_postprocessing_vcvc_0, 0)) self.connect((self.ofdm_fbmc_remove_preamble_vcvc_0, 0), (self.blks2_selector_0_0, 0)) self.connect((self.blocks_skiphead_0_0, 0), (self.blks2_selector_0_0, 1)) self.connect((self.blocks_skiphead_0_0, 0), (self.ofdm_fbmc_remove_preamble_vcvc_0, 0)) self.connect((self.ofdm_fbmc_beta_multiplier_vcvc_1, 0), (self.blocks_skiphead_0, 0)) self.connect((self.fft_vxx_1, 0), (self.ofdm_fbmc_beta_multiplier_vcvc_1, 0)) self.connect((self.blocks_skiphead_0, 0), (self.ofdm_fbmc_subchannel_processing_vcvc_0, 0)) self.connect((self.ofdm_fbmc_junction_vcvc_0, 0), (self.fft_vxx_1, 0)) self.connect((self.ofdm_fbmc_symbol_estimation_vcb_0, 0), (self, 0)) self.connect((self.ofdm_fbmc_subchannel_processing_vcvc_0, 1), (self.blocks_null_sink_0, 0)) self.connect((self.ofdm_vector_mask_0, 0), (self.ofdm_fbmc_symbol_estimation_vcb_0, 0)) self.connect((self.ofdm_fbmc_oqam_postprocessing_vcvc_0, 0), (self.ofdm_vector_mask_0, 0)) self.connect((self.ofdm_fbmc_subchannel_processing_vcvc_0, 0), (self.blocks_skiphead_0_0, 0)) self.connect((self, 0), (self.ofdm_fbmc_overlapping_serial_to_parallel_cvc_0, 0)) self.connect((self.ofdm_fbmc_separate_vcvc_0, 0), (self.ofdm_fbmc_polyphase_network_vcvc_2, 0)) self.connect((self.ofdm_fbmc_separate_vcvc_0, 1), (self.ofdm_fbmc_polyphase_network_vcvc_3, 0)) self.connect((self.ofdm_fbmc_overlapping_serial_to_parallel_cvc_0, 0), (self.ofdm_fbmc_separate_vcvc_0, 0)) self.connect((self.ofdm_fbmc_polyphase_network_vcvc_2, 0), (self.ofdm_fbmc_junction_vcvc_0, 0)) self.connect((self.ofdm_fbmc_polyphase_network_vcvc_3, 0), (self.ofdm_fbmc_junction_vcvc_0, 1))
def __init__(self, N=12, M=256, indices=[], mapping=0, modulation=16, cp_ratio=0.25): gr.hier_block2.__init__( self, "scfdma_receiver_cb", gr.io_signature(1, 1, gr.sizeof_gr_complex * 1), gr.io_signature(len(indices), len(indices), gr.sizeof_char * 1), ) ################################################## # Parameters ################################################## self.indices = indices self.modulation = modulation self.cp_ratio = cp_ratio self.M = M self.N = N self.mapping = mapping ################################################## # Variables ################################################## self.demappers = demappers = list() self.idft_blocks = idft_blocks = list() self.estimation_blocks = estimation_blocks = list() ################################################## # Blocks ################################################## # self.ofdm_scfdma_subcarrier_demapper_vcvc_0 = ofdm.scfdma_subcarrier_demapper_vcvc(N, M, start_index, mapping) # self.ofdm_fbmc_symbol_estimation_vcb_0 = ofdm.fbmc_symbol_estimation_vcb(N, modulation) # self.fft_vxx_0_0 = fft.fft_vcc(N, False, (), True, 1) self.fft_vxx_0 = fft.fft_vcc(M, True, (), True, 1) self.blocks_stream_to_vector_0 = blocks.stream_to_vector( gr.sizeof_gr_complex * 1, M) self.blocks_keep_m_in_n_0 = blocks.keep_m_in_n(gr.sizeof_gr_complex, M, int(M * (1 + cp_ratio)), int(cp_ratio * M)) # create demappers, idft and estimation blocks for i in range(len(indices)): self.demappers.append( ofdm.scfdma_subcarrier_demapper_vcvc(N, M, indices[i], mapping)) self.idft_blocks.append(fft.fft_vcc(N, False, (), True, 1)) self.estimation_blocks.append( ofdm.fbmc_symbol_estimation_vcb(N, modulation)) ################################################## # Connections ################################################## self.connect((self, 0), (self.blocks_keep_m_in_n_0, 0)) self.connect((self.blocks_keep_m_in_n_0, 0), (self.blocks_stream_to_vector_0, 0)) self.connect((self.blocks_stream_to_vector_0, 0), (self.fft_vxx_0, 0)) # connect the rest for i in range(len(indices)): self.connect((self.fft_vxx_0, 0), (self.demappers[i], 0)) self.connect((self.demappers[i], 0), (self.idft_blocks[i], 0)) self.connect((self.idft_blocks[i], 0), (self.estimation_blocks[i], 0)) self.connect((self.estimation_blocks[i], 0), (self, i))
def __init__(self, M=1024, K=4, qam_size=16, syms_per_frame=10, carriers=924, theta_sel=0, sel_eq=0, exclude_preamble=0, sel_preamble=0, zero_pads=1, extra_pad=False): gr.hier_block2.__init__(self, "fbmc_receiver_hier_cb", gr.io_signature(1, 1, gr.sizeof_gr_complex*1), gr.io_signature(1, 1, gr.sizeof_char*1), ) ################################################## # Parameters ################################################## self.theta_sel = theta_sel self.exclude_preamble = exclude_preamble self.sel_eq = sel_eq self.M = M self.K = K self.qam_size = qam_size self.syms_per_frame = syms_per_frame ################################################## # Variables ################################################## if self.exclude_preamble == 1 and self.sel_eq != 3: self.sel_eq = sel_eq = 3 warnings.warn("Since exclude_preamble is set as 1, sel_eq is forced to be 3 (no equalizer)") self.skip = skip = 0 if exclude_preamble == 1 or sel_eq == 3 or sel_eq== 0: self.skip = skip = 0 else: self.skip = skip = 1 # Assertions assert(M>0 and K>0 and qam_size>0), "M, K and qam_size should be bigger than 0" assert((math.log(M)/math.log(2))==int(math.log(M)/math.log(2))), "M should be a power of 2" assert(K==4), "for now only K=4 s supported." assert(qam_size==4 or qam_size==16 or qam_size==64 or qam_size==128 or qam_size==256 ), "Only 4-,16-,64-,128-,256-qam constellations are supported." assert(theta_sel==0 or theta_sel==1) assert(exclude_preamble==0 or exclude_preamble==1) ################################################## # Blocks ################################################## self.ofdm_vector_mask_0 = ofdm.vector_mask(M, (M-carriers)/2, carriers, []) self.ofdm_fbmc_symbol_estimation_vcb_0 = ofdm.fbmc_symbol_estimation_vcb(carriers, qam_size) # unsigned int M, unsigned int syms_per_frame, int sel_preamble, int zero_pads, bool extra_pad, int sel_eq self.ofdm_fbmc_subchannel_processing_vcvc_0 = ofdm.fbmc_subchannel_processing_vcvc(M, syms_per_frame, sel_preamble, zero_pads, extra_pad, sel_eq) self.ofdm_fbmc_separate_vcvc_0 = ofdm.fbmc_separate_vcvc(M, 2) self.ofdm_fbmc_remove_preamble_vcvc_0 = ofdm.fbmc_remove_preamble_vcvc(M, syms_per_frame, sel_preamble, zero_pads, extra_pad) self.ofdm_fbmc_polyphase_network_vcvc_3 = ofdm.fbmc_polyphase_network_vcvc(M, K, K*M-1, True) self.ofdm_fbmc_polyphase_network_vcvc_2 = ofdm.fbmc_polyphase_network_vcvc(M, K, K*M-1, True) self.ofdm_fbmc_overlapping_serial_to_parallel_cvc_0 = ofdm.fbmc_overlapping_serial_to_parallel_cvc(M) self.ofdm_fbmc_oqam_postprocessing_vcvc_0 = ofdm.fbmc_oqam_postprocessing_vcvc(M, 0, theta_sel) self.ofdm_fbmc_junction_vcvc_0 = ofdm.fbmc_junction_vcvc(M, 2) self.ofdm_fbmc_beta_multiplier_vcvc_1 = ofdm.fbmc_beta_multiplier_vcvc(M, K, K*M-1, 0) self.fft_vxx_1 = fft.fft_vcc(M, True, ([]), True, 1) self.blocks_skiphead_0_0 = blocks.skiphead(gr.sizeof_gr_complex*M, skip) self.blocks_skiphead_0 = blocks.skiphead(gr.sizeof_gr_complex*M, 2*K-1-1) self.blocks_null_sink_0 = blocks.null_sink(gr.sizeof_gr_complex*M) self.blks2_selector_0_0 = grc_blks2.selector( item_size=gr.sizeof_gr_complex*M, num_inputs=2, num_outputs=1, input_index=exclude_preamble, output_index=0, ) ################################################## # Connections ################################################## self.connect((self.blks2_selector_0_0, 0), (self.ofdm_fbmc_oqam_postprocessing_vcvc_0, 0)) self.connect((self.ofdm_fbmc_remove_preamble_vcvc_0, 0), (self.blks2_selector_0_0, 0)) self.connect((self.blocks_skiphead_0_0, 0), (self.blks2_selector_0_0, 1)) self.connect((self.blocks_skiphead_0_0, 0), (self.ofdm_fbmc_remove_preamble_vcvc_0, 0)) self.connect((self.ofdm_fbmc_beta_multiplier_vcvc_1, 0), (self.blocks_skiphead_0, 0)) self.connect((self.fft_vxx_1, 0), (self.ofdm_fbmc_beta_multiplier_vcvc_1, 0)) self.connect((self.blocks_skiphead_0, 0), (self.ofdm_fbmc_subchannel_processing_vcvc_0, 0)) self.connect((self.ofdm_fbmc_junction_vcvc_0, 0), (self.fft_vxx_1, 0)) self.connect((self.ofdm_fbmc_symbol_estimation_vcb_0, 0), (self, 0)) self.connect((self.ofdm_fbmc_subchannel_processing_vcvc_0, 1), (self.blocks_null_sink_0, 0)) self.connect((self.ofdm_vector_mask_0, 0), (self.ofdm_fbmc_symbol_estimation_vcb_0, 0)) self.connect((self.ofdm_fbmc_oqam_postprocessing_vcvc_0, 0), (self.ofdm_vector_mask_0, 0)) self.connect((self.ofdm_fbmc_subchannel_processing_vcvc_0, 0), (self.blocks_skiphead_0_0, 0)) self.connect((self, 0), (self.ofdm_fbmc_overlapping_serial_to_parallel_cvc_0, 0)) self.connect((self.ofdm_fbmc_separate_vcvc_0, 0), (self.ofdm_fbmc_polyphase_network_vcvc_2, 0)) self.connect((self.ofdm_fbmc_separate_vcvc_0, 1), (self.ofdm_fbmc_polyphase_network_vcvc_3, 0)) self.connect((self.ofdm_fbmc_overlapping_serial_to_parallel_cvc_0, 0), (self.ofdm_fbmc_separate_vcvc_0, 0)) self.connect((self.ofdm_fbmc_polyphase_network_vcvc_2, 0), (self.ofdm_fbmc_junction_vcvc_0, 0)) self.connect((self.ofdm_fbmc_polyphase_network_vcvc_3, 0), (self.ofdm_fbmc_junction_vcvc_0, 1))
def __init__(self, M=1024, K=4, qam_size=16, syms_per_frame=10, boundaries=[], theta_sel=0, sel_eq=0, exclude_preamble=0, sel_preamble=0, zero_pads=1, extra_pad=False): # for now, following assumption should be made: # each user should be allocated with same number of subchannels. lb = len(boundaries) assert(lb>0), "The array that defines user boundaries cannot be passed as empty." assert(lb%2 == 0), "Unbalanced boundary definition." allocated = list() for i in range(1,(lb/2)+1): allocated.append(boundaries[2*i-1]-boundaries[2*i-2]+1) if i>=2: assert(allocated[i-2] == allocated[i-1]), "Each user should be allocated with same number of subchannels." output_signature = list() for i in range(lb/2): output_signature.append(gr.sizeof_gr_complex*(boundaries[2*i+1]-boundaries[2*i]+1)) # print(output_signature) gr.hier_block2.__init__(self, "fbmc_receiver_multiuser_cb", gr.io_signature(1, 1, gr.sizeof_gr_complex*1), # Input signature gr.io_signature(lb/2, lb/2, gr.sizeof_char*1)) # Output signature ################################################## # Parameters ################################################## self.theta_sel = theta_sel self.exclude_preamble = exclude_preamble self.sel_eq = sel_eq self.M = M self.K = K self.qam_size = qam_size self.syms_per_frame = syms_per_frame ################################################## # Variables ################################################## if self.exclude_preamble == 1 and self.sel_eq != 3: self.sel_eq = sel_eq = 3 warnings.warn("Since exclude_preamble is set as 1, sel_eq is forced to be 3 (no equalizer)") self.skip = skip = 0 if exclude_preamble == 1 or sel_eq == 3 or sel_eq== 0: self.skip = skip = 0 else: self.skip = skip = 1 # Assertions assert(M>0 and K>0 and qam_size>0), "M, K and qam_size should be bigger than 0" assert((math.log(M)/math.log(2))==int(math.log(M)/math.log(2))), "M should be a power of 2" assert(K==4), "for now only K=4 s supported." assert(qam_size==4 or qam_size==16 or qam_size==64 or qam_size==128 or qam_size==256 ), "Only 4-,16-,64-,128-,256-qam constellations are supported." assert(theta_sel==0 or theta_sel==1) assert(exclude_preamble==0 or exclude_preamble==1) ################################################## # Blocks ################################################## self.ofdm_fbmc_subchannel_processing_mu_vcvc_0 = ofdm.fbmc_subchannel_processing_mu_vcvc(M=M,syms_per_frame=syms_per_frame,indices=boundaries,sel_preamble=sel_preamble,zero_pads=zero_pads,extra_pad=extra_pad,sel_eq=sel_eq) self.ofdm_fbmc_separate_vcvc_0 = ofdm.fbmc_separate_vcvc(M, 2) self.ofdm_fbmc_remove_preamble_vcvc_0 = ofdm.fbmc_remove_preamble_vcvc(M, syms_per_frame, sel_preamble, zero_pads, extra_pad) self.ofdm_fbmc_polyphase_network_vcvc_3 = ofdm.fbmc_polyphase_network_vcvc(M, K, K*M-1, True) self.ofdm_fbmc_polyphase_network_vcvc_2 = ofdm.fbmc_polyphase_network_vcvc(M, K, K*M-1, True) self.ofdm_fbmc_overlapping_serial_to_parallel_cvc_0 = ofdm.fbmc_overlapping_serial_to_parallel_cvc(M) self.ofdm_fbmc_oqam_postprocessing_vcvc_0 = ofdm.fbmc_oqam_postprocessing_vcvc(M, 0, theta_sel) self.ofdm_fbmc_junction_vcvc_0 = ofdm.fbmc_junction_vcvc(M, 2) self.ofdm_fbmc_beta_multiplier_vcvc_1 = ofdm.fbmc_beta_multiplier_vcvc(M, K, K*M-1, 0) self.fft_vxx_1 = fft.fft_vcc(M, True, ([]), True, 1) self.blocks_skiphead_0_0 = blocks.skiphead(gr.sizeof_gr_complex*M, skip) self.blocks_skiphead_0 = blocks.skiphead(gr.sizeof_gr_complex*M, 2*K-1-1) self.blocks_null_sink_0 = blocks.null_sink(gr.sizeof_gr_complex*M) self.blks2_selector_0_0 = grc_blks2.selector( item_size=gr.sizeof_gr_complex*M, num_inputs=2, num_outputs=1, input_index=exclude_preamble, output_index=0, ) ################################################## # Connections ################################################## self.connect((self.blks2_selector_0_0, 0), (self.ofdm_fbmc_oqam_postprocessing_vcvc_0, 0)) self.connect((self.ofdm_fbmc_remove_preamble_vcvc_0, 0), (self.blks2_selector_0_0, 0)) self.connect((self.blocks_skiphead_0_0, 0), (self.blks2_selector_0_0, 1)) self.connect((self.blocks_skiphead_0_0, 0), (self.ofdm_fbmc_remove_preamble_vcvc_0, 0)) self.connect((self.ofdm_fbmc_beta_multiplier_vcvc_1, 0), (self.blocks_skiphead_0, 0)) self.connect((self.fft_vxx_1, 0), (self.ofdm_fbmc_beta_multiplier_vcvc_1, 0)) self.connect((self.blocks_skiphead_0, 0), (self.ofdm_fbmc_subchannel_processing_mu_vcvc_0, 0)) self.connect((self.ofdm_fbmc_junction_vcvc_0, 0), (self.fft_vxx_1, 0)) self.connect((self.ofdm_fbmc_subchannel_processing_mu_vcvc_0, 1), (self.blocks_null_sink_0, 0)) self.connect((self.ofdm_fbmc_subchannel_processing_mu_vcvc_0, 0), (self.blocks_skiphead_0_0, 0)) self.connect((self, 0), (self.ofdm_fbmc_overlapping_serial_to_parallel_cvc_0, 0)) self.connect((self.ofdm_fbmc_separate_vcvc_0, 0), (self.ofdm_fbmc_polyphase_network_vcvc_2, 0)) self.connect((self.ofdm_fbmc_separate_vcvc_0, 1), (self.ofdm_fbmc_polyphase_network_vcvc_3, 0)) self.connect((self.ofdm_fbmc_overlapping_serial_to_parallel_cvc_0, 0), (self.ofdm_fbmc_separate_vcvc_0, 0)) self.connect((self.ofdm_fbmc_polyphase_network_vcvc_2, 0), (self.ofdm_fbmc_junction_vcvc_0, 0)) self.connect((self.ofdm_fbmc_polyphase_network_vcvc_3, 0), (self.ofdm_fbmc_junction_vcvc_0, 1)) # blocks # self.ofdm_fbmc_receiver_demo_0 = ofdm.fbmc_receiver_demo(M, K, qam_size, syms_per_frame, M, theta_sel, sel_eq, exclude_preamble, sel_preamble, zero_pads, extra_pad) # instead of calling receiver_demo block we copy the content of that block and change subchannel processing part. 10.03.2015 # this way receiver_demo file will stay as original, multiuser case not implemented. asymms = list() for i in range(lb/2): asymms.append(ofdm.fbmc_asymmetrical_vector_mask_vcvc(M,boundaries[2*i],boundaries[2*i+1])) # print(str(i)) sym_est = list() for i in range(lb/2): sym_est.append(ofdm.fbmc_symbol_estimation_vcb(allocated[i], qam_size)) # connections for i in range(lb/2): self.connect((self.ofdm_fbmc_oqam_postprocessing_vcvc_0, 0), (asymms[i], 0)) self.connect((asymms[i], 0),(sym_est[i], 0)) self.connect((sym_est[i], 0),(self,i))