3 from gnuradio import gr, blks
4 from gnuradio.eng_option import eng_option
5 from optparse import OptionParser
11 class my_graph(gr.flow_graph):
13 def __init__(self, rx_callback, spb, excess_bw, SNR, freq_error, arity):
14 gr.flow_graph.__init__(self)
22 self.packet_transmitter = \
23 mpsk_mod_pkts(fg, spb=spb, excess_bw=excess_bw, diff=True, arity=arity)
25 # ----------------------------------------------------------------
27 # ----------------------------------------------------------------
29 awgn = gr.noise_source_c(gr.GR_GAUSSIAN, pow(10.0,-SNR/20.0))
30 add = gr.add_cc() # add some noise
31 fg.connect(awgn, (add,1))
33 phase_rotate = gr.multiply_const_cc(cmath.exp(radians * 1j))
35 # ----------------------------------------------------------------
38 rx_filt_taps = gr.firdes.low_pass(1,spb,0.8,0.1,gr.firdes.WIN_HANN)
40 rx_filt = gr.fir_filter_ccf(1,rx_filt_taps)
43 self.packet_receiver = \
44 mpsk_demod_pkts(fg, callback=rx_callback,
45 excess_bw=excess_bw, arity=arity, diff=True,
46 costas_alpha=.005, gain_mu=gain_mu, spb=spb)
48 fg.connect (self.packet_transmitter, (add,0))
49 fg.connect(add, phase_rotate, rx_filt, self.packet_receiver)
60 def send_pkt(payload='', eof=False):
61 fg.packet_transmitter.send_pkt(payload, eof)
63 def rx_callback(ok, payload):
67 if len(payload) <= 16:
68 print "ok = %5r payload = '%s' %d/%d" % (ok, payload, st.nright, st.npkts)
70 (pktno,) = struct.unpack('!H', payload[0:2])
71 print "ok = %5r pktno = %4d len(payload) = %4d %d/%d" % (ok, pktno, len(payload),
75 parser = OptionParser (option_class=eng_option)
76 parser.add_option("-M", "--megabytes", type="eng_float", default=1,
77 help="set megabytes to transmit [default=%default]")
78 parser.add_option("-s", "--size", type="eng_float", default=1500,
79 help="set packet size [default=%default]")
80 parser.add_option("","--spb", type=int, default=4,
81 help="set samples per baud to SPB [default=%default]")
82 parser.add_option("", "--excess-bw", type="eng_float", default=0.4,
83 help="set excess bandwidth for RRC filter [default=%default]")
84 parser.add_option("", "--snr", type="eng_float", default=40,
85 help="set SNR in dB for simulation [default=%default]")
86 parser.add_option("", "--m-arity", type=int, default=4,
87 help="PSK arity [default=%default]")
88 parser.add_option("", "--freq-error", type="eng_float", default=0,
89 help="set frequency error for simulation [default=%default]")
91 (options, args) = parser.parse_args ()
97 pkt_size = int(options.size)
99 fg = my_graph(rx_callback, options.spb, options.excess_bw, options.snr,
100 options.freq_error, options.m_arity)
103 nbytes = int(1e6 * options.megabytes)
107 send_pkt('Hello World')
109 # generate and send packets
111 send_pkt(struct.pack('!H', pktno) + (pkt_size - 2) * chr(pktno & 0xff))
115 send_pkt('Goodbye World')
116 send_pkt(eof=True) # tell modulator we're not sending any more pkts
121 if __name__ == '__main__':
124 except KeyboardInterrupt: