blob: 807e6cc72bd5c5040b54314884a439f7c7f0fe52 [file] [log] [blame]
piotr4089c1a2014-08-06 14:10:56 +02001#!/usr/bin/env python
2##################################################
3# Gnuradio Python Flow Graph
4# Title: Clock offset corrector
5# Author: Piotr Krysik
Piotr K66bb3cd2014-08-13 19:04:57 +02006# Generated: Wed Aug 13 16:43:12 2014
piotr4089c1a2014-08-06 14:10:56 +02007##################################################
8
9from gnuradio import blocks
10from gnuradio import filter
11from gnuradio import gr
12from gnuradio.filter import firdes
13import gsm
14import math
15
16class clock_offset_corrector(gr.hier_block2):
17
Piotr K66bb3cd2014-08-13 19:04:57 +020018 def __init__(self, fc=936.6e6, ppm=0, samp_rate_in=1625000.0/6.0*4.0, samp_rate_out=1625000.0/6.0*4.0):
piotr4089c1a2014-08-06 14:10:56 +020019 gr.hier_block2.__init__(
20 self, "Clock offset corrector",
21 gr.io_signature(1, 1, gr.sizeof_gr_complex*1),
22 gr.io_signature(1, 1, gr.sizeof_gr_complex*1),
23 )
24
25 ##################################################
26 # Parameters
27 ##################################################
piotr4089c1a2014-08-06 14:10:56 +020028 self.fc = fc
Piotr K66bb3cd2014-08-13 19:04:57 +020029 self.ppm = ppm
30 self.samp_rate_in = samp_rate_in
31 self.samp_rate_out = samp_rate_out
piotr4089c1a2014-08-06 14:10:56 +020032
33 ##################################################
34 # Blocks
35 ##################################################
Piotr K66bb3cd2014-08-13 19:04:57 +020036 self.ppm_in = None;self.message_port_register_hier_out("ppm_in")
37 self.gsm_controlled_rotator_cc_0 = gsm.controlled_rotator_cc(0,samp_rate_out)
piotr4089c1a2014-08-06 14:10:56 +020038 self.gsm_controlled_const_source_f_0 = gsm.controlled_const_source_f(ppm)
39 self.fractional_resampler_xx_0 = filter.fractional_resampler_cc(0, 1)
Piotr K66bb3cd2014-08-13 19:04:57 +020040 self.blocks_multiply_const_vxx_0_0 = blocks.multiply_const_vff((1.0e-6*samp_rate_in/samp_rate_out, ))
41 self.blocks_multiply_const_vxx_0 = blocks.multiply_const_vff((fc/samp_rate_out*(2*math.pi)/1e6, ))
42 self.blocks_add_const_vxx_0 = blocks.add_const_vff((samp_rate_in/samp_rate_out, ))
piotr4089c1a2014-08-06 14:10:56 +020043
44 ##################################################
45 # Connections
46 ##################################################
piotr4089c1a2014-08-06 14:10:56 +020047 self.connect((self.blocks_add_const_vxx_0, 0), (self.fractional_resampler_xx_0, 1))
piotr4089c1a2014-08-06 14:10:56 +020048 self.connect((self.blocks_multiply_const_vxx_0, 0), (self.gsm_controlled_rotator_cc_0, 1))
Piotr K66bb3cd2014-08-13 19:04:57 +020049 self.connect((self.fractional_resampler_xx_0, 0), (self.gsm_controlled_rotator_cc_0, 0))
50 self.connect((self.gsm_controlled_rotator_cc_0, 0), (self, 0))
51 self.connect((self, 0), (self.fractional_resampler_xx_0, 0))
piotr4089c1a2014-08-06 14:10:56 +020052 self.connect((self.blocks_multiply_const_vxx_0_0, 0), (self.blocks_add_const_vxx_0, 0))
Piotr K66bb3cd2014-08-13 19:04:57 +020053 self.connect((self.gsm_controlled_const_source_f_0, 0), (self.blocks_multiply_const_vxx_0_0, 0))
54 self.connect((self.gsm_controlled_const_source_f_0, 0), (self.blocks_multiply_const_vxx_0, 0))
piotr4089c1a2014-08-06 14:10:56 +020055
56 ##################################################
57 # Asynch Message Connections
58 ##################################################
Piotr K66bb3cd2014-08-13 19:04:57 +020059 self.msg_connect(self, "ppm_in", self.gsm_controlled_const_source_f_0, "constant_msg")
piotr4089c1a2014-08-06 14:10:56 +020060
61
Piotr K66bb3cd2014-08-13 19:04:57 +020062 def get_fc(self):
63 return self.fc
64
65 def set_fc(self, fc):
66 self.fc = fc
67 self.blocks_multiply_const_vxx_0.set_k((self.fc/self.samp_rate_out*(2*math.pi)/1e6, ))
68
piotr4089c1a2014-08-06 14:10:56 +020069 def get_ppm(self):
70 return self.ppm
71
72 def set_ppm(self, ppm):
73 self.ppm = ppm
74 self.gsm_controlled_const_source_f_0.set_constant(self.ppm)
75
Piotr K66bb3cd2014-08-13 19:04:57 +020076 def get_samp_rate_in(self):
77 return self.samp_rate_in
piotr4089c1a2014-08-06 14:10:56 +020078
Piotr K66bb3cd2014-08-13 19:04:57 +020079 def set_samp_rate_in(self, samp_rate_in):
80 self.samp_rate_in = samp_rate_in
81 self.blocks_add_const_vxx_0.set_k((self.samp_rate_in/self.samp_rate_out, ))
82 self.blocks_multiply_const_vxx_0_0.set_k((1.0e-6*self.samp_rate_in/self.samp_rate_out, ))
piotr4089c1a2014-08-06 14:10:56 +020083
Piotr K66bb3cd2014-08-13 19:04:57 +020084 def get_samp_rate_out(self):
85 return self.samp_rate_out
piotr4089c1a2014-08-06 14:10:56 +020086
Piotr K66bb3cd2014-08-13 19:04:57 +020087 def set_samp_rate_out(self, samp_rate_out):
88 self.samp_rate_out = samp_rate_out
89 self.blocks_multiply_const_vxx_0.set_k((self.fc/self.samp_rate_out*(2*math.pi)/1e6, ))
90 self.blocks_add_const_vxx_0.set_k((self.samp_rate_in/self.samp_rate_out, ))
91 self.blocks_multiply_const_vxx_0_0.set_k((1.0e-6*self.samp_rate_in/self.samp_rate_out, ))
92 self.gsm_controlled_rotator_cc_0.set_samp_rate(self.samp_rate_out)
piotr4089c1a2014-08-06 14:10:56 +020093