Esempio n. 1
0
    def qamtest(self, nbits):
        data = tuple(range(2**nbits))

        src = gr.vector_source_b(data)
        unpack = gr.unpack_k_bits_bb(nbits)
        enc = raw.qam_enc(nbits)
        dec = raw.qam_dec(nbits)
        tofloat = gr.uchar_to_float()
        slicer = gr.binary_slicer_fb()

        unpacked = gr.vector_sink_b()
        encoded = gr.vector_sink_c()
        decoded = gr.vector_sink_b()
        dst = gr.vector_sink_b()
        self.tb.connect(src, unpack, enc, dec, tofloat,
                        gr.add_const_ff(-128.0), slicer, dst)
        self.tb.connect(unpack, unpacked)
        self.tb.connect(enc, encoded)
        self.tb.connect(dec, decoded)
        self.tb.run()
        #print "data = ", data
        #print "unpacked = ", unpacked.data()
        #print "encoded = ", encoded.data()
        #print "decoded = ", decoded.data()
        #print "dst = ", dst.data()
        self.assertEqual(unpacked.data(), dst.data())
        pwr = sum([abs(x)**2 for x in encoded.data()]) / len(encoded.data())
        #print pwr
        self.assertAlmostEqual(1.0, pwr, 6)
Esempio n. 2
0
File: qa_qam.py Progetto: UpYou/ofdm
    def qamtest (self, nbits):
        data = tuple(range(2**nbits))

        src = gr.vector_source_b(data)
        unpack = gr.unpack_k_bits_bb(nbits)
        enc = raw.qam_enc(nbits)
        dec = raw.qam_dec(nbits)
        tofloat = gr.uchar_to_float()
        slicer = gr.binary_slicer_fb()

        unpacked = gr.vector_sink_b()
        encoded = gr.vector_sink_c()
        decoded = gr.vector_sink_b()
        dst = gr.vector_sink_b()
        self.tb.connect(src,
                        unpack,
                        enc,
                        dec,
                        tofloat,
                        gr.add_const_ff(-128.0),
                        slicer,
                        dst)
        self.tb.connect(unpack, unpacked)
        self.tb.connect(enc, encoded)
        self.tb.connect(dec, decoded)
        self.tb.run()
        #print "data = ", data
        #print "unpacked = ", unpacked.data()
        #print "encoded = ", encoded.data()
        #print "decoded = ", decoded.data()
        #print "dst = ", dst.data()
        self.assertEqual(unpacked.data(), dst.data())
        pwr = sum([abs(x)**2 for x in encoded.data()]) / len(encoded.data())
        #print pwr
        self.assertAlmostEqual(1.0, pwr, 6)
Esempio n. 3
0
  def test(self, ebno, data=None):
    random.seed(0)
    (nc, np) = self.puncparam
    # round number of bytes and symbols (FIXME, this is probably not always round)
    # one symbol = self.ncarriers * self.qambits * 0.5 * (np / nc) bits
    symbits = self.ncarriers * self.qambits * nc / (2. * np)
    #print "symbits = ", symbits
    assert int(self.nsymbols * symbits) % 8 == 0
    length = int(self.nsymbols * symbits) / 8 # incl padding

    #print 'src: %d' % (length-1)
    #print 'pad: %d' % length
    #print 'fenc: %d' % (length * 8 * 2)
    #print 'punc: %f' % (length * 8 * 2. * np / nc)
    #print 'intrlv: %f' % ((length * 8 * 2. * np / nc) / (self.ncarriers*self.qambits))
    #print 'total bits: %d' % (self.nframes * length * 8 * 2)

    if data is None:
      data = [ random.randint(0,255) for i in range((length-1)*self.nframes) ]
    data = tuple(data)

    src = gr.vector_source_b(data)
    #src = gr.file_source(gr.sizeof_char, "src1.datb");
    dst = gr.vector_sink_b()

    fenc = raw.conv_enc()
    fdec = raw.conv_dec(length*8)

    punc = raw.conv_punc(nc, np)
    depunc = raw.conv_punc(np, nc, 128)

    pad = raw.conv_punc(length-1, length)
    depad = raw.conv_punc(length, length-1)

    intrlv = raw.intrlv_bit(self.ncarriers, self.qambits, False)
    deintrlv = raw.intrlv_bit(self.ncarriers, self.qambits, True)

    qenc = raw.qam_enc(self.qambits)
    qdec = raw.qam_dec(self.qambits)

    SNR = 10.0**(ebno/10.0)
    noise_power_in_channel = 1.0/SNR
    noise_voltage = math.sqrt(noise_power_in_channel/2.0)
    # AWGN only
    noise = gr.noise_source_c(gr.GR_GAUSSIAN, noise_voltage, 0)
    chan = gr.add_cc()
    self.tb.connect(noise, (chan, 1))
    #chan = gr.channel_model(noise_voltage, 0.0, 1.0, [1.0, 0.0]),

    tofloat = gr.uchar_to_float()
    offset = gr.multiply_const_ff(255.0)
    touchar = gr.float_to_uchar()

    self.tb.connect(src,  # length-1
                    pad,  # length
                    fenc, # 2*length
                    punc, # 2*length*np/nc
                    intrlv, # 2*length*np/nc (% ncarriers*qambits)
                      qenc, # 2*length*np/nc / qambits (% ncarriers)
                      chan,
                      qdec,
                      #tofloat, offset, touchar,
                    deintrlv,
                    depunc,
                    fdec,
                    depad,
                    dst)

    #self.tb.connect(src, gr.file_sink(gr.sizeof_char, "src.datb"))
    #self.tb.connect(pad, gr.file_sink(gr.sizeof_char, "pad.datb"))
    #self.tb.connect(fenc, gr.file_sink(gr.sizeof_char, "fenc.datb"))
    #self.tb.connect(punc, gr.file_sink(gr.sizeof_char, "punc.datb"))
    #self.tb.connect(qenc, gr.file_sink(gr.sizeof_gr_complex, "qenc.dat"))
    #self.tb.connect(qdec, gr.file_sink(gr.sizeof_char, "qdec.datb"))
    #self.tb.connect(touchar, gr.file_sink(gr.sizeof_char, "qdec.datb"))
    #self.tb.connect(depunc, gr.file_sink(gr.sizeof_char, "depunc.datb"))
    #self.tb.connect(fdec, gr.file_sink(gr.sizeof_char, "fdec.datb"))
    #self.tb.connect(depad, gr.file_sink(gr.sizeof_char, "depad.datb"))

    self.tb.run()

    nerrors = 0
    for (a,b) in itertools.izip(data, dst.data()):
      count = bitCount(a ^ b)
      nerrors += count
    ber = nerrors*1.0/len(data)/8
    print "%d x %g @ %g dB\t#errors = %d\tBER = %g" % (self.qambits, nc/(2.0*np), ebno, nerrors, ber)
    return nerrors