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])
Beispiel #3
0
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])