def make_rx(tb, fo, fi, dimensionality, tot_constellation, K, interleaver, IT, Es, N0, type): metrics_in = trellis.metrics_f( fi.O(), dimensionality, tot_constellation, digital.TRELLIS_EUCLIDEAN ) # data preprocessing to generate metrics for innner SISO scale = gr.multiply_const_ff(1.0 / N0) gnd = gr.vector_source_f([0], True) inter = [] deinter = [] siso_in = [] siso_out = [] # generate all blocks for it in range(IT): inter.append( trellis.permutation(interleaver.K(), interleaver.INTER(), fi.I(), gr.sizeof_float)) siso_in.append(trellis.siso_f(fi, K, 0, -1, True, False, type)) deinter.append( trellis.permutation(interleaver.K(), interleaver.DEINTER(), fi.I(), gr.sizeof_float)) if it < IT - 1: siso_out.append(trellis.siso_f(fo, K, 0, -1, False, True, type)) else: siso_out.append(trellis.viterbi_s(fo, K, 0, -1)) # no soft outputs needed # connect first stage tb.connect(gnd, inter[0]) tb.connect(metrics_in, scale) tb.connect(scale, (siso_in[0], 1)) # connect the rest for it in range(IT): if it < IT - 1: tb.connect(scale, (siso_in[it + 1], 1)) tb.connect(siso_in[it], deinter[it], (siso_out[it], 1)) tb.connect(gnd, (siso_out[it], 0)) tb.connect(siso_out[it], inter[it + 1]) tb.connect(inter[it], (siso_in[it], 0)) else: tb.connect(siso_in[it], deinter[it], siso_out[it]) tb.connect(inter[it], (siso_in[it], 0)) return (metrics_in, siso_out[IT - 1])
def make_rx(tb, fo, fi, dimensionality, tot_constellation, K, interleaver, IT, Es, N0, type): metrics_in = trellis.metrics_f( fi.O(), dimensionality, tot_constellation, digital.TRELLIS_EUCLIDEAN ) # data preprocessing to generate metrics for innner SISO scale = blocks.multiply_const_ff(1.0 / N0) gnd = blocks.vector_source_f([0], True) inter = [] deinter = [] siso_in = [] siso_out = [] # generate all blocks for it in range(IT): inter.append(trellis.permutation(interleaver.K(), interleaver.INTER(), fi.I(), gr.sizeof_float)) siso_in.append(trellis.siso_f(fi, K, 0, -1, True, False, type)) deinter.append(trellis.permutation(interleaver.K(), interleaver.DEINTER(), fi.I(), gr.sizeof_float)) if it < IT - 1: siso_out.append(trellis.siso_f(fo, K, 0, -1, False, True, type)) else: siso_out.append(trellis.viterbi_s(fo, K, 0, -1)) # no soft outputs needed # connect first stage tb.connect(gnd, inter[0]) tb.connect(metrics_in, scale) tb.connect(scale, (siso_in[0], 1)) # connect the rest for it in range(IT): if it < IT - 1: tb.connect(metrics_in, (siso_in[it + 1], 1)) tb.connect(siso_in[it], deinter[it], (siso_out[it], 1)) tb.connect(gnd, (siso_out[it], 0)) tb.connect(siso_out[it], inter[it + 1]) tb.connect(inter[it], (siso_in[it], 0)) else: tb.connect(siso_in[it], deinter[it], siso_out[it]) tb.connect(inter[it], (siso_in[it], 0)) return (metrics_in, siso_out[IT - 1])
def run_test(fo, fi, interleaver, Kb, bitspersymbol, K, dimensionality, constellation, N0, seed): tb = gr.top_block() # TX src = blocks.lfsr_32k_source_s() src_head = blocks.head(gr.sizeof_short, Kb / 16) # packet size in shorts s2fsmi = blocks.packed_to_unpacked_ss( bitspersymbol, gr.GR_MSB_FIRST ) # unpack shorts to symbols compatible with the outer FSM input cardinality enc_out = trellis.encoder_ss(fo, 0) # initial state = 0 inter = trellis.permutation(interleaver.K(), interleaver.INTER(), 1, gr.sizeof_short) enc_in = trellis.encoder_ss(fi, 0) # initial state = 0 mod = digital.chunks_to_symbols_sf(constellation, dimensionality) # CHANNEL add = blocks.add_ff() noise = analog.noise_source_f(analog.GR_GAUSSIAN, math.sqrt(N0 / 2), seed) # RX metrics_in = trellis.metrics_f( fi.O(), dimensionality, constellation, digital.TRELLIS_EUCLIDEAN ) # data preprocessing to generate metrics for innner Viterbi gnd = blocks.vector_source_f([0], True) siso_in = trellis.siso_f( fi, K, 0, -1, True, False, trellis.TRELLIS_MIN_SUM ) # Put -1 if the Initial/Final states are not set. deinter = trellis.permutation(interleaver.K(), interleaver.DEINTER(), fi.I(), gr.sizeof_float) va_out = trellis.viterbi_s( fo, K, 0, -1) # Put -1 if the Initial/Final states are not set. fsmi2s = blocks.unpacked_to_packed_ss( bitspersymbol, gr.GR_MSB_FIRST) # pack FSM input symbols to shorts dst = blocks.check_lfsr_32k_s() tb.connect(src, src_head, s2fsmi, enc_out, inter, enc_in, mod) tb.connect(mod, (add, 0)) tb.connect(noise, (add, 1)) tb.connect(add, metrics_in) tb.connect(gnd, (siso_in, 0)) tb.connect(metrics_in, (siso_in, 1)) tb.connect(siso_in, deinter, va_out, fsmi2s, dst) tb.run() ntotal = dst.ntotal() nright = dst.nright() runlength = dst.runlength() return (ntotal, ntotal - nright)
def run_test (fo,fi,interleaver,Kb,bitspersymbol,K,dimensionality,constellation,N0,seed): fg = gr.flow_graph () # TX src = gr.lfsr_32k_source_s() src_head = gr.head (gr.sizeof_short,Kb/16) # packet size in shorts s2fsmi = gr.packed_to_unpacked_ss(bitspersymbol,gr.GR_MSB_FIRST) # unpack shorts to symbols compatible with the outer FSM input cardinality enc_out = trellis.encoder_ss(fo,0) # initial state = 0 inter = trellis.permutation(interleaver.K(),interleaver.INTER(),1,gr.sizeof_short) enc_in = trellis.encoder_ss(fi,0) # initial state = 0 mod = gr.chunks_to_symbols_sf(constellation,dimensionality) # CHANNEL add = gr.add_ff() noise = gr.noise_source_f(gr.GR_GAUSSIAN,math.sqrt(N0/2),seed) # RX metrics_in = trellis.metrics_f(fi.O(),dimensionality,constellation,trellis.TRELLIS_EUCLIDEAN) # data preprocessing to generate metrics for innner Viterbi gnd = gr.vector_source_f([0],True); siso_in = trellis.siso_f(fi,K,0,-1,True,False,trellis.TRELLIS_MIN_SUM) # Put -1 if the Initial/Final states are not set. deinter = trellis.permutation(interleaver.K(),interleaver.DEINTER(),fi.I(),gr.sizeof_float) va_out = trellis.viterbi_s(fo,K,0,-1) # Put -1 if the Initial/Final states are not set. fsmi2s = gr.unpacked_to_packed_ss(bitspersymbol,gr.GR_MSB_FIRST) # pack FSM input symbols to shorts dst = gr.check_lfsr_32k_s() fg.connect (src,src_head,s2fsmi,enc_out,inter,enc_in,mod) fg.connect (mod,(add,0)) fg.connect (noise,(add,1)) fg.connect (add,metrics_in) fg.connect (gnd,(siso_in,0)) fg.connect (metrics_in,(siso_in,1)) fg.connect (siso_in,deinter,va_out,fsmi2s,dst) fg.run() ntotal = dst.ntotal () nright = dst.nright () runlength = dst.runlength () return (ntotal,ntotal-nright)
def make_rx(tb,fo,fi,dimensionality,tot_constellation,K,interleaver,IT,Es,N0,type): scale = gr.multiply_const_ff(math.sqrt(1.0/N0)) gnd = gr.vector_source_f([0],True); inter=[] deinter=[] siso_in=[] siso_out=[] # generate all blocks for it in range(IT): inter.append( trellis.permutation(interleaver.K(),interleaver.INTER(),fi.I(),gr.sizeof_float) ) siso_in.append( trellis.siso_combined_f(fi,K,0,-1,True,False,type,dimensionality,tot_constellation,trellis.TRELLIS_EUCLIDEAN) ) deinter.append( trellis.permutation(interleaver.K(),interleaver.DEINTER(),fi.I(),gr.sizeof_float) ) if it < IT-1: siso_out.append( trellis.siso_f(fo,K,0,-1,False,True,type) ) else: siso_out.append( trellis.viterbi_s(fo,K,0,-1) ) # no soft outputs needed # connect first stage tb.connect (gnd,inter[0]) tb.connect (scale,(siso_in[0],1)) # connect the rest for it in range(IT): if it < IT-1: tb.connect (scale,(siso_in[it+1],1)) tb.connect (siso_in[it],deinter[it],(siso_out[it],1)) tb.connect (gnd,(siso_out[it],0)) tb.connect (siso_out[it],inter[it+1]) tb.connect (inter[it],(siso_in[it],0)) else: tb.connect (siso_in[it],deinter[it],siso_out[it]) tb.connect (inter[it],(siso_in[it],0)) return (scale,siso_out[IT-1])