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
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
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
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])
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])