blob: eb58663ac0614b019bcabf5814edd37efdc7f859 [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")
28
piotr437f5462014-02-04 17:57:25 +010029 self.input_rate = input_rate
30 self.osr = osr
piotr6d152d92014-02-21 00:02:44 +010031 self.arfcn = arfcn
piotr437f5462014-02-04 17:57:25 +010032 self.sps = input_rate / gsm_symb_rate / osr
33
34 #create callbacks
35 self.tuner_callback = tuner(self)
36 #create accompaning blocks
37 self.filtr = self._set_filter()
38 self.interpolator = self._set_interpolator()
39 self.receiver = self._set_receiver()
40 self.connect(self, self.filtr, self.interpolator, self.receiver, self)
piotr6d152d92014-02-21 00:02:44 +010041# self.connect(self, self.interpolator, self.receiver, self)
piotr7c82b172014-02-08 14:15:27 +010042 self.msg_connect(self.receiver, "bursts", weakref.proxy(self), "bursts")
43
piotr437f5462014-02-04 17:57:25 +010044
45 def _set_filter(self):
46 filter_cutoff = 125e3
47 filter_t_width = 10e3
48 offset = 0
49
50 filter_taps = filter.firdes.low_pass(1.0, self.input_rate, filter_cutoff, filter_t_width, filter.firdes.WIN_HAMMING)
51 filtr = filter.freq_xlating_fir_filter_ccf(1, filter_taps, offset, self.input_rate)
52 return filtr
53
54 def _set_interpolator(self):
55 interpolator = filter.fractional_resampler_cc(0, self.sps)
56 return interpolator
57
58 def _set_receiver(self):
piotr6d152d92014-02-21 00:02:44 +010059 receiver = gsm.receiver(self.tuner_callback, self.osr, self.arfcn)
piotr437f5462014-02-04 17:57:25 +010060 return receiver
61
62 def set_center_frequency(self, center_freq):
63 self.filtr.set_center_freq(center_freq)
64
65 def set_timing(self, timing_offset):
66 pass
piotr6d152d92014-02-21 00:02:44 +010067
68