Houston, we have a trunk.
[debian/gnuradio] / gnuradio-examples / python / gmsk2 / qpsk_tester.py
1 #!/usr/bin/env python
2
3 import random
4 from gnuradio import gr
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 access_code = to_1_0_string(code)
23
24 use_agc        = 0
25 use_rrc_tx     = 1
26 use_rrc_rx     = 1
27 use_sync_loop  = 1
28 use_clock_sync = 1
29
30 def main():
31     fg = gr.flow_graph()
32
33 #    data = (1,2,3,4,5,6,7,8,9)
34     random.seed()
35     data = [random.randint(1,100) for i in range(20000)]
36     data[0] = 0 # you know, for the diff encoding stuff
37     bytes_src = gr.vector_source_b(data,False)
38
39     k = 2
40     spb = 50
41     ntaps = 11*spb
42     excess_bw = 0.9
43     threshold = 12
44     constellation  = (1+0j, 0+1j, -1+0j, 0-1j)
45     
46     bytes2chunks   = gr.packed_to_unpacked_bb(k, gr.GR_MSB_FIRST)
47     diffenc        = gr.diff_encoder_bb(4)
48     chunks2symbols = gr.chunks_to_symbols_bc(constellation)
49
50     if use_rrc_tx:
51         rrc_taps_tx = gr.firdes.root_raised_cosine(spb, spb, 1.0, \
52                                                    excess_bw, ntaps)
53         rrc_tx = gr.interp_fir_filter_ccf(spb, rrc_taps_tx)
54     else:
55         rrc_tx = gr.interp_fir_filter_ccf(1, (1,))
56
57 ################### CHANNEL MODEL #############################
58
59     phase_rotate = gr.multiply_const_cc(1-0.36j)
60     channel      = gr.add_cc()
61     awgn         = gr.noise_source_c(gr.GR_GAUSSIAN, 0.5)
62     fg.connect(awgn, (channel,1))
63     
64 ################### CHANNEL MODEL #############################
65
66     if use_agc:
67         agc = gr.agc_cc(1e-4, 1, 1)
68     else:
69         agc = gr.multiply_const_cc(1)
70
71     # Downconverter
72     if use_sync_loop:
73         costas_alpha=0.005
74         beta = costas_alpha*costas_alpha*0.25
75         sync_loop = gr.costas_loop_cc(costas_alpha, beta, 0.05, -0.05, 0)
76     else:
77         sync_loop = gr.multiply_const_cc(1)
78
79     if use_rrc_rx:
80         rrc_taps_rx = gr.firdes.root_raised_cosine(1, spb, 1.0, \
81                                                    excess_bw, ntaps)
82         rrc_rx = gr.fir_filter_ccf(1, rrc_taps_rx)
83     else:
84         rrc_rx = gr.fir_filter_ccf(1, (1,))
85    
86     # Sampler
87     if use_clock_sync:
88         mu = 0.05
89         omega = spb
90         gain_mu = 0.05
91         gain_omega = 0.25*gain_mu*gain_mu
92         omega_rel_limit = 0.5
93         clock_sync = gr.clock_recovery_mm_cc(omega, gain_omega, mu, \
94                                              gain_mu, omega_rel_limit)
95         #clock_sync.set_verbose(True);
96     else:
97         clock_sync = gr.fir_filter_ccf(1, (1,))
98
99     diff_phasor = gr.diff_phasor_cc()
100     slicer = gr.constellation_decoder_cb((constellation), (0,1,2,3))
101     unpack = gr.unpack_k_bits_bb(k)
102     access = gr.correlate_access_code_bb(access_code,threshold)
103
104     sink = gr.file_sink(gr.sizeof_char, 'output.dat')
105
106     fg.connect(bytes_src, bytes2chunks, diffenc, chunks2symbols, rrc_tx)
107     fg.connect(rrc_tx, phase_rotate, channel, agc)
108     fg.connect(agc, sync_loop, rrc_rx, clock_sync, diff_phasor, slicer, sink)
109  
110     test = gr.file_sink(gr.sizeof_gr_complex, 'test.dat')
111     fg.connect(rrc_rx, test)
112
113     fg.connect(chunks2symbols, gr.file_sink(gr.sizeof_gr_complex, 'rrc_tx.dat'))  # into TX RRC
114     fg.connect(channel, gr.file_sink(gr.sizeof_gr_complex, 'channel.dat'))        # Out of TX RRC
115     fg.connect(rrc_rx, gr.file_sink(gr.sizeof_gr_complex, 'rrc_rx.dat'))          # Out of RX RRC -> clock_sync
116     fg.connect(clock_sync, gr.file_sink(gr.sizeof_gr_complex, 'clock_sync.dat'))  # Out of M&M sync loop
117     fg.connect(bytes2chunks, gr.file_sink(gr.sizeof_char, 'source.dat'))
118
119     fg.start()
120     fg.wait()
121
122 if __name__ == "__main__":
123     main()
124         
125     
126
127