Houston, we have a trunk.
[debian/gnuradio] / gnuradio-examples / python / gmsk2 / qpsk_usrp_tester.py
1 #!/usr/bin/env python
2
3 import random
4 from gnuradio import gr, gru, usrp
5
6 default_access_code = '\xAC\xDD\xA4\xE2\xF2\x8C\x20\xFC'
7
8 def string_to_1_0_list(s):
9     r = []
10     for ch in s:
11         x = ord(ch)
12         for i in range(8):
13             t = (x >> i) & 0x1
14             r.append(t)
15
16     return r
17
18 def to_1_0_string(L):
19     return ''.join(map(lambda x: chr(x + ord('0')), L))
20
21 code = string_to_1_0_list(default_access_code)
22
23 access_code = to_1_0_string(code)
24
25 def main():
26
27     fg = gr.flow_graph()
28     f_rf = 5e6
29     fs = 400e3
30     sr = 100e3
31     alpha = 0.5
32     M = 4
33     k = int(gru.log2(M))
34     
35     # Source
36     src = usrp.source_c ()
37     adc_rate = src.adc_rate()
38     usrp_decim = int(adc_rate / fs)
39     src.set_decim_rate(usrp_decim)
40         
41     subdev_spec = usrp.pick_rx_subdevice(src)
42     subdev = usrp.selected_subdev(src, subdev_spec)
43     print "Using RX d'board %s" % (subdev.side_and_name(),)
44     src.set_mux(usrp.determine_rx_mux_value(src, subdev_spec))
45     src.tune(0, subdev, f_rf)
46         
47     g = subdev.gain_range()
48     subdev.set_gain(g[1])
49     subdev.set_auto_tr(True)
50         
51     print "USRP Decimation Rate = %d" % usrp_decim
52     print "RF Frequency = %d" % f_rf
53
54     agc = gr.multiply_const_cc(0.0025)
55         
56     # Downconverter
57     costas_alpha=0.005
58     beta = costas_alpha*costas_alpha*0.25
59     sync_loop = gr.costas_loop_cc(costas_alpha, beta, 0.05, -0.05, 0)
60
61     # Stage 2
62 #    fs2 = 200e3
63 #    D = int(fs / fs2)
64 #    decimator = gr.keep_one_in_n(gr.sizeof_gr_complex, D)
65 #    print "D = %d\nAfter decimator fs = %f" % (D, fs2)
66
67     # Demodulator
68     taps = gr.firdes.root_raised_cosine(1, fs, sr, alpha, 45)
69     rrc  = gr.fir_filter_ccf(1, taps)
70     
71     # Sampler
72     mu = 0.01
73     omega = 4.3
74     gain_mu = 0.05
75     gain_omega = 0.25*gain_mu*gain_mu
76     omega_rel_limit = 0.5
77     clock_sync = gr.clock_recovery_mm_cc(omega, gain_omega, mu,
78                                          gain_mu, omega_rel_limit)
79     clock_sync.set_verbose(False)
80
81     diff_phasor = gr.diff_phasor_cc()
82
83     threshold = 12
84     constellation = (1+0j, 0+1j, -1+0j, 0-1j)
85     slicer = gr.constellation_decoder_cb((constellation), (0,1,2,3))
86     unpack = gr.unpack_k_bits_bb(k)
87     access = gr.correlate_access_code_bb(access_code,threshold)
88
89     test = gr.file_sink(gr.sizeof_gr_complex, 'test.dat')
90     sink = gr.file_sink(gr.sizeof_char, 'output.dat')
91
92     fg.connect(src, agc, sync_loop, rrc, clock_sync)
93     fg.connect(clock_sync, diff_phasor, slicer, unpack, access, sink)
94
95     fg.connect(slicer, gr.file_sink(gr.sizeof_char, 'chunks.dat'))
96     fg.connect(unpack, gr.file_sink(gr.sizeof_char, 'unpack.dat'))
97     fg.connect(clock_sync, gr.file_sink(gr.sizeof_gr_complex, 'phasor.dat'))
98
99     fg.start()
100     fg.wait()
101
102 if __name__ == "__main__":
103     main()