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 | |
piotr | 437f546 | 2014-02-04 17:57:25 +0100 | [diff] [blame] | 9 | class receiver_hier(gr.hier_block2): |
piotr | 6d152d9 | 2014-02-21 00:02:44 +0100 | [diff] [blame] | 10 | def __init__(self, input_rate, osr=4, arfcn=0): |
piotr | 437f546 | 2014-02-04 17:57:25 +0100 | [diff] [blame] | 11 | gr.hier_block2.__init__(self, |
| 12 | "receiver_hier", |
| 13 | gr.io_signature(1, 1, gr.sizeof_gr_complex), |
| 14 | gr.io_signature(1, 1, 142*gr.sizeof_float)) |
| 15 | #set rates |
| 16 | gsm_symb_rate = 1625000/6.0 |
piotr | 7c82b17 | 2014-02-08 14:15:27 +0100 | [diff] [blame] | 17 | |
| 18 | self.message_port_register_hier_in("bursts") |
piotr | 4089c1a | 2014-08-06 14:10:56 +0200 | [diff] [blame] | 19 | self.message_port_register_hier_in("measurements") |
piotr | 7c82b17 | 2014-02-08 14:15:27 +0100 | [diff] [blame] | 20 | |
piotr | 437f546 | 2014-02-04 17:57:25 +0100 | [diff] [blame] | 21 | self.input_rate = input_rate |
| 22 | self.osr = osr |
piotr | 6d152d9 | 2014-02-21 00:02:44 +0100 | [diff] [blame] | 23 | self.arfcn = arfcn |
Piotr K | 66bb3cd | 2014-08-13 19:04:57 +0200 | [diff] [blame] | 24 | self.sps = input_rate / (gsm_symb_rate * osr) |
piotr | 437f546 | 2014-02-04 17:57:25 +0100 | [diff] [blame] | 25 | |
piotr | 437f546 | 2014-02-04 17:57:25 +0100 | [diff] [blame] | 26 | #create accompaning blocks |
| 27 | self.filtr = self._set_filter() |
| 28 | self.interpolator = self._set_interpolator() |
| 29 | self.receiver = self._set_receiver() |
| 30 | self.connect(self, self.filtr, self.interpolator, self.receiver, self) |
piotr | 6d152d9 | 2014-02-21 00:02:44 +0100 | [diff] [blame] | 31 | # self.connect(self, self.interpolator, self.receiver, self) |
piotr | 7c82b17 | 2014-02-08 14:15:27 +0100 | [diff] [blame] | 32 | self.msg_connect(self.receiver, "bursts", weakref.proxy(self), "bursts") |
piotr | 4089c1a | 2014-08-06 14:10:56 +0200 | [diff] [blame] | 33 | self.msg_connect(self.receiver, "measurements", weakref.proxy(self), "measurements") |
piotr | 7c82b17 | 2014-02-08 14:15:27 +0100 | [diff] [blame] | 34 | |
piotr | 437f546 | 2014-02-04 17:57:25 +0100 | [diff] [blame] | 35 | def _set_filter(self): |
| 36 | filter_cutoff = 125e3 |
| 37 | filter_t_width = 10e3 |
| 38 | offset = 0 |
| 39 | |
| 40 | filter_taps = filter.firdes.low_pass(1.0, self.input_rate, filter_cutoff, filter_t_width, filter.firdes.WIN_HAMMING) |
| 41 | filtr = filter.freq_xlating_fir_filter_ccf(1, filter_taps, offset, self.input_rate) |
| 42 | return filtr |
| 43 | |
| 44 | def _set_interpolator(self): |
| 45 | interpolator = filter.fractional_resampler_cc(0, self.sps) |
| 46 | return interpolator |
| 47 | |
| 48 | def _set_receiver(self): |
Piotr K | 608a08e | 2014-08-07 17:01:55 +0200 | [diff] [blame] | 49 | receiver = gsm.receiver(self.osr, self.arfcn) |
piotr | 437f546 | 2014-02-04 17:57:25 +0100 | [diff] [blame] | 50 | return receiver |
| 51 | |
| 52 | def set_center_frequency(self, center_freq): |
| 53 | self.filtr.set_center_freq(center_freq) |
| 54 | |
| 55 | def set_timing(self, timing_offset): |
| 56 | pass |
piotr | f2b6a1b | 2014-08-04 11:28:59 +0200 | [diff] [blame] | 57 | |
| 58 | def set_arfcn(self,arfcn): |
| 59 | self.receiver.set_arfcn(arfcn) |
| 60 | |
| 61 | def reset(self): |
| 62 | self.receiver.reset() |
| 63 | |