def build_graph (input, raw, snr, freq_offset, coeffs, mag):

    # Initialize empty flow graph
    fg = gr.top_block ()

    # Set up file source
    src = gr.file_source (1, input)

    # Set up GMSK modulator, 2 samples per symbol
    mod = gmsk_mod(2)

    # Amplify the signal
    tx_amp = 1
    amp = gr.multiply_const_cc(1)
    amp.set_k(tx_amp)

    # Compute proper noise voltage based on SNR
    SNR = 10.0**(snr/10.0)
    power_in_signal = abs(tx_amp)**2
    noise_power = power_in_signal/SNR
    noise_voltage = math.sqrt(noise_power)

    # Generate noise
    rseed = int(time.time())
    noise = gr.noise_source_c(gr.GR_GAUSSIAN, noise_voltage, rseed)
    adder = gr.add_cc()
    fg.connect(noise, (adder, 1))
    
    # Create the frequency offset, 0 for now
    offset = gr.sig_source_c(1, gr.GR_SIN_WAVE, freq_offset, 1.0, 0.0)
    mixer = gr.multiply_cc()
    fg.connect(offset, (mixer, 1))

    # Pass the noisy data to the matched filter
    dfile = open(coeffs, 'r')
    data = []
    for line in dfile:
      data.append(complex(*map(float,line.strip().strip("()").split(" "))).conjugate())
    dfile.close()
    data.reverse()
    mfilter = gr.fir_filter_ccc(1, data)


    # Connect the flow graph
    fg.connect(src, mod)
    fg.connect(mod, (mixer, 0))
    fg.connect(mixer, (adder, 0))

    if mag:
      raw_dst = gr.file_sink (gr.sizeof_float, raw)
      magnitude = gr.complex_to_mag(1)
      fg.connect(adder, mfilter, magnitude, raw_dst)
    else:
      raw_dst = gr.file_sink (gr.sizeof_gr_complex, raw)
      fg.connect(adder, mfilter, raw_dst)

    print "SNR(db): " + str(snr)
    print "Frequency Offset: " + str(freq_offset)

    return fg
Exemplo n.º 2
0
def build_graph(outfile):

  # Initialize our top block
  fg = gr.top_block()

  # Input
  #input = [0xA4, 0xF2, 0xAC, 0xDD, 0xA4, 0xE2, 0xF2, 0x8C, 0x20, 0xFC, 0x00, 0x00, 0x00, 0x02]
  input = [0xAC, 0xDD, 0xA4, 0xE2, 0xF2, 0x8C, 0x20, 0xFC]

  # Unsigned char source to use the input
  src = gr.vector_source_b(input)

  # Set up GMSK modulator, 2 samples per symbol
  mod = gmsk_mod(2)

  # File sink
  fsink = gr.file_sink(gr.sizeof_gr_complex, outfile)

  fg.connect(src, mod, fsink)

  return fg
Exemplo n.º 3
0
def build_graph (input, raw, amp):

    # Initialize empty flow graph
    fg = gr.top_block ()

    # Set up file source
    src = gr.file_source (1, input)

    # Set up GMSK modulator, 2 samples per symbol
    mod = gmsk_mod(2)

    # Set up an amp
    amp = gr.multiply_const_cc(amp)

    # Connect the flow graph
    raw_dst = gr.file_sink (gr.sizeof_gr_complex, raw)
    fg.connect(src, mod)
    fg.connect(mod, amp)
    fg.connect(amp, raw_dst)

    return fg
Exemplo n.º 4
0
    def test_with_phy(self):

        sps = 4

        mod = gmsk.gmsk_mod(
            samples_per_symbol=sps,
            bt=0.35,
            verbose=False,
            log=False,
        )

        demod = gmsk.gmsk_demod(
            samples_per_symbol=sps,
            gain_mu=0.175,
            mu=0.5,
            omega_relative_limit=0.005,
            freq_error=0.0,
            verbose=False,
            log=False,
        )

        framer = gras.make('/grex/packet_framer',
            samples_per_symbol = sps,
            bits_per_symbol = 1,
        )

        burst_tagger = gras.make('/grex/burst_tagger', sps)

        deframer = gras.make('/grex/packet_deframer')

        src_data = tuple(numpy.random.randint(-1024, 1024, 11)) #40 bytes + padding
        src = TestUtils.VectorSource(numpy.int32, src_data)
        dst = TestUtils.VectorSink(numpy.int32)

        s2d = gras.make('/grex/stream_to_datagram', numpy.dtype(numpy.int32).itemsize, 40) #mtu 40 bytes
        d2s = gras.make('/grex/datagram_to_stream', numpy.dtype(numpy.int32).itemsize)

        delay = gras.make('/grex/delay', numpy.dtype(numpy.complex64).itemsize)
        delay.set_delay(73) #sample delay

        #inject noise into the system
        noise = gras.make('/grex/noise_source_fc32', -1)
        noise.set_amplitude(0.05)
        add = gras.make('/grex/add_fc32_fc32')
        self.tb.connect(noise, (add, 1))

        self.tb.connect(src, s2d, framer, mod, burst_tagger, delay, add, demod, deframer, d2s, dst)

        #collect tags
        tag_sink = TagSink()
        self.tb.connect(add, tag_sink)

        self.tb.start()
        time.sleep(1.0)
        self.tb.stop()
        self.tb.wait()
        self.tb.disconnect_all()

        print "src_data", src_data
        print "dst_data", dst.data()
        print "tag_sink", tag_sink.data()

        n = min(map(len, (src_data, dst.data())))
        print n
        self.assertTrue(n > 0)

        self.assertEqual(src_data[:n], dst.data()[:n])
Exemplo n.º 5
0
    def test_with_phy(self):

        sps = 4

        mod = gmsk.gmsk_mod(
            samples_per_symbol=sps,
            bt=0.35,
            verbose=False,
            log=False,
        )

        demod = gmsk.gmsk_demod(
            samples_per_symbol=sps,
            gain_mu=0.175,
            mu=0.5,
            omega_relative_limit=0.005,
            freq_error=0.0,
            verbose=False,
            log=False,
        )

        framer = gras.make(
            '/grex/packet_framer',
            samples_per_symbol=sps,
            bits_per_symbol=1,
        )

        burst_tagger = gras.make('/grex/burst_tagger', sps)

        deframer = gras.make('/grex/packet_deframer')

        src_data = tuple(numpy.random.randint(-1024, 1024,
                                              11))  #40 bytes + padding
        src = TestUtils.VectorSource(numpy.int32, src_data)
        dst = TestUtils.VectorSink(numpy.int32)

        s2d = gras.make('/grex/stream_to_datagram',
                        numpy.dtype(numpy.int32).itemsize, 40)  #mtu 40 bytes
        d2s = gras.make('/grex/datagram_to_stream',
                        numpy.dtype(numpy.int32).itemsize)

        delay = gras.make('/grex/delay', numpy.dtype(numpy.complex64).itemsize)
        delay.set_delay(73)  #sample delay

        #inject noise into the system
        noise = gras.make('/grex/noise_source_fc32', -1)
        noise.set_amplitude(0.05)
        add = gras.make('/grex/add_fc32_fc32')
        self.tb.connect(noise, (add, 1))

        self.tb.connect(src, s2d, framer, mod, burst_tagger, delay, add, demod,
                        deframer, d2s, dst)

        #collect tags
        tag_sink = TagSink()
        self.tb.connect(add, tag_sink)

        self.tb.start()
        time.sleep(1.0)
        self.tb.stop()
        self.tb.wait()
        self.tb.disconnect_all()

        print "src_data", src_data
        print "dst_data", dst.data()
        print "tag_sink", tag_sink.data()

        n = min(map(len, (src_data, dst.data())))
        print n
        self.assertTrue(n > 0)

        self.assertEqual(src_data[:n], dst.data()[:n])