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 | def _set_filter(self): |
| 45 | filter_cutoff = 125e3 |
| 46 | filter_t_width = 10e3 |
| 47 | offset = 0 |
| 48 | |
| 49 | filter_taps = filter.firdes.low_pass(1.0, self.input_rate, filter_cutoff, filter_t_width, filter.firdes.WIN_HAMMING) |
| 50 | filtr = filter.freq_xlating_fir_filter_ccf(1, filter_taps, offset, self.input_rate) |
| 51 | return filtr |
| 52 | |
| 53 | def _set_interpolator(self): |
| 54 | interpolator = filter.fractional_resampler_cc(0, self.sps) |
| 55 | return interpolator |
| 56 | |
| 57 | def _set_receiver(self): |
piotr | 6d152d9 | 2014-02-21 00:02:44 +0100 | [diff] [blame] | 58 | receiver = gsm.receiver(self.tuner_callback, self.osr, self.arfcn) |
piotr | 437f546 | 2014-02-04 17:57:25 +0100 | [diff] [blame] | 59 | return receiver |
| 60 | |
| 61 | def set_center_frequency(self, center_freq): |
| 62 | self.filtr.set_center_freq(center_freq) |
| 63 | |
| 64 | def set_timing(self, timing_offset): |
| 65 | pass |
piotr | f2b6a1b | 2014-08-04 11:28:59 +0200 | [diff] [blame^] | 66 | |
| 67 | def set_arfcn(self,arfcn): |
| 68 | self.receiver.set_arfcn(arfcn) |
| 69 | |
| 70 | def reset(self): |
| 71 | self.receiver.reset() |
| 72 | |