blob: fe9c6364b65d866d7f889499efea73bdeb0a37f2 [file] [log] [blame]
piotr437f5462014-02-04 17:57:25 +01001#!/usr/bin/env python
2
piotr7c82b172014-02-08 14:15:27 +01003import weakref
piotr437f5462014-02-04 17:57:25 +01004import gsm
5from gnuradio.eng_option import eng_option
6from gnuradio import gr, gru, blocks
7from gnuradio import filter
8
9
10class tuner(gr.feval_dd):
11 def __init__(self, top_block):
12 gr.feval_dd.__init__(self)
13 self.top_block = top_block
14 def eval(self, freq_offet):
15 self.top_block.set_center_frequency(freq_offet)
16 return freq_offet
17
18class receiver_hier(gr.hier_block2):
piotr6d152d92014-02-21 00:02:44 +010019 def __init__(self, input_rate, osr=4, arfcn=0):
piotr437f5462014-02-04 17:57:25 +010020 gr.hier_block2.__init__(self,
21 "receiver_hier",
22 gr.io_signature(1, 1, gr.sizeof_gr_complex),
23 gr.io_signature(1, 1, 142*gr.sizeof_float))
24 #set rates
25 gsm_symb_rate = 1625000/6.0
piotr7c82b172014-02-08 14:15:27 +010026
27 self.message_port_register_hier_in("bursts")
piotr4089c1a2014-08-06 14:10:56 +020028 self.message_port_register_hier_in("measurements")
piotr7c82b172014-02-08 14:15:27 +010029
piotr437f5462014-02-04 17:57:25 +010030 self.input_rate = input_rate
31 self.osr = osr
piotr6d152d92014-02-21 00:02:44 +010032 self.arfcn = arfcn
piotr437f5462014-02-04 17:57:25 +010033 self.sps = input_rate / gsm_symb_rate / osr
34
35 #create callbacks
36 self.tuner_callback = tuner(self)
37 #create accompaning blocks
38 self.filtr = self._set_filter()
39 self.interpolator = self._set_interpolator()
40 self.receiver = self._set_receiver()
41 self.connect(self, self.filtr, self.interpolator, self.receiver, self)
piotr6d152d92014-02-21 00:02:44 +010042# self.connect(self, self.interpolator, self.receiver, self)
piotr7c82b172014-02-08 14:15:27 +010043 self.msg_connect(self.receiver, "bursts", weakref.proxy(self), "bursts")
piotr4089c1a2014-08-06 14:10:56 +020044 self.msg_connect(self.receiver, "measurements", weakref.proxy(self), "measurements")
piotr7c82b172014-02-08 14:15:27 +010045
piotr437f5462014-02-04 17:57:25 +010046 def _set_filter(self):
47 filter_cutoff = 125e3
48 filter_t_width = 10e3
49 offset = 0
50
51 filter_taps = filter.firdes.low_pass(1.0, self.input_rate, filter_cutoff, filter_t_width, filter.firdes.WIN_HAMMING)
52 filtr = filter.freq_xlating_fir_filter_ccf(1, filter_taps, offset, self.input_rate)
53 return filtr
54
55 def _set_interpolator(self):
56 interpolator = filter.fractional_resampler_cc(0, self.sps)
57 return interpolator
58
59 def _set_receiver(self):
piotr6d152d92014-02-21 00:02:44 +010060 receiver = gsm.receiver(self.tuner_callback, self.osr, self.arfcn)
piotr437f5462014-02-04 17:57:25 +010061 return receiver
62
63 def set_center_frequency(self, center_freq):
64 self.filtr.set_center_freq(center_freq)
65
66 def set_timing(self, timing_offset):
67 pass
piotrf2b6a1b2014-08-04 11:28:59 +020068
69 def set_arfcn(self,arfcn):
70 self.receiver.set_arfcn(arfcn)
71
72 def reset(self):
73 self.receiver.reset()
74