Houston, we have a trunk.
[debian/gnuradio] / gnuradio-examples / python / gmsk2 / mpsk_test.py
1 #!/usr/bin/env python
2
3 from gnuradio import gr, blks
4 from gnuradio.eng_option import eng_option
5 from optparse import OptionParser
6 import random
7 import struct
8 from mpsk_pkt import *
9 import cmath
10
11 class my_graph(gr.flow_graph):
12
13     def __init__(self, rx_callback, spb, excess_bw, SNR, freq_error, arity):
14         gr.flow_graph.__init__(self)
15
16         fg = self
17
18         # Tuning Parameters
19         gain_mu = 0.05/spb
20
21         # transmitter
22         self.packet_transmitter = \
23           mpsk_mod_pkts(fg, spb=spb, excess_bw=excess_bw, diff=True, arity=arity)
24
25         # ----------------------------------------------------------------
26         #                       Channel model
27         # ----------------------------------------------------------------
28
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))
32         radians = 17*pi/180
33         phase_rotate = gr.multiply_const_cc(cmath.exp(radians * 1j))
34
35         # ----------------------------------------------------------------
36
37         # channel filter
38         rx_filt_taps = gr.firdes.low_pass(1,spb,0.8,0.1,gr.firdes.WIN_HANN)
39         #rx_filt_taps = (1,)
40         rx_filt = gr.fir_filter_ccf(1,rx_filt_taps)
41
42         # receiver
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)
47         
48         fg.connect (self.packet_transmitter, (add,0))
49         fg.connect(add, phase_rotate, rx_filt, self.packet_receiver)
50
51
52 class stats(object):
53     def __init__(self):
54         self.npkts = 0
55         self.nright = 0
56         
57 def main():
58     st = stats()
59     
60     def send_pkt(payload='', eof=False):
61         fg.packet_transmitter.send_pkt(payload, eof)
62
63     def rx_callback(ok, payload):
64         st.npkts += 1
65         if ok:
66             st.nright += 1
67         if len(payload) <= 16:
68             print "ok = %5r  payload = '%s'  %d/%d" % (ok, payload, st.nright, st.npkts)
69         else:
70             (pktno,) = struct.unpack('!H', payload[0:2])
71             print "ok = %5r  pktno = %4d  len(payload) = %4d  %d/%d" % (ok, pktno, len(payload),
72                                                                         st.nright, st.npkts)
73
74
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]")
90
91     (options, args) = parser.parse_args ()
92
93     if len(args) != 0:
94         parser.print_help()
95         sys.exit(1)
96
97     pkt_size = int(options.size)
98
99     fg = my_graph(rx_callback, options.spb, options.excess_bw, options.snr,
100                   options.freq_error, options.m_arity)
101     fg.start()
102
103     nbytes = int(1e6 * options.megabytes)
104     n = 0
105     pktno = 0
106
107     send_pkt('Hello World')
108
109     # generate and send packets
110     while n < nbytes:
111         send_pkt(struct.pack('!H', pktno) + (pkt_size - 2) * chr(pktno & 0xff))
112         n += pkt_size
113         pktno += 1
114
115     send_pkt('Goodbye World')
116     send_pkt(eof=True)             # tell modulator we're not sending any more pkts
117
118     fg.wait()
119
120
121 if __name__ == '__main__':
122     try:
123         main()
124     except KeyboardInterrupt:
125         pass