piotr | 437f546 | 2014-02-04 17:57:25 +0100 | [diff] [blame] | 1 | #!/usr/bin/env python |
| 2 | |
piotr | 7c82b17 | 2014-02-08 14:15:27 +0100 | [diff] [blame] | 3 | import weakref |
piotr | 437f546 | 2014-02-04 17:57:25 +0100 | [diff] [blame] | 4 | import gsm |
| 5 | from gnuradio.eng_option import eng_option |
| 6 | from gnuradio import gr, gru, blocks |
| 7 | from gnuradio import filter |
| 8 | |
| 9 | |
| 10 | class 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 | |
| 18 | class receiver_hier(gr.hier_block2): |
piotr | 6d152d9 | 2014-02-21 00:02:44 +0100 | [diff] [blame] | 19 | def __init__(self, input_rate, osr=4, arfcn=0): |
piotr | 437f546 | 2014-02-04 17:57:25 +0100 | [diff] [blame] | 20 | 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 |
piotr | 7c82b17 | 2014-02-08 14:15:27 +0100 | [diff] [blame] | 26 | |
| 27 | self.message_port_register_hier_in("bursts") |
| 28 | |
piotr | 437f546 | 2014-02-04 17:57:25 +0100 | [diff] [blame] | 29 | self.input_rate = input_rate |
| 30 | self.osr = osr |
piotr | 6d152d9 | 2014-02-21 00:02:44 +0100 | [diff] [blame] | 31 | self.arfcn = arfcn |
piotr | 437f546 | 2014-02-04 17:57:25 +0100 | [diff] [blame] | 32 | 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) |
piotr | 6d152d9 | 2014-02-21 00:02:44 +0100 | [diff] [blame] | 41 | # self.connect(self, self.interpolator, self.receiver, self) |
piotr | 7c82b17 | 2014-02-08 14:15:27 +0100 | [diff] [blame] | 42 | self.msg_connect(self.receiver, "bursts", weakref.proxy(self), "bursts") |
| 43 | |
piotr | 437f546 | 2014-02-04 17:57:25 +0100 | [diff] [blame] | 44 | |
| 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): |
piotr | 6d152d9 | 2014-02-21 00:02:44 +0100 | [diff] [blame] | 59 | receiver = gsm.receiver(self.tuner_callback, self.osr, self.arfcn) |
piotr | 437f546 | 2014-02-04 17:57:25 +0100 | [diff] [blame] | 60 | 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 |
piotr | 6d152d9 | 2014-02-21 00:02:44 +0100 | [diff] [blame] | 67 | |
| 68 | |