blob: bf4b4557d3267dabbdd9fe96e758c095fc238b25 [file] [log] [blame]
Piotr Krysik09826732016-07-15 13:14:24 +02001# -*- coding: utf-8 -*-
2##################################################
3# GNU Radio Python Flow Graph
Piotr Krysik83afe732016-07-17 22:48:35 +02004# Title: Clock Offset Corrector Tagged
Piotr Krysik09826732016-07-15 13:14:24 +02005# Author: Piotr Krysik
6# Description: Clock offset corrector with blocks that use tags to switch offsets
Piotr Krysik79735382016-07-20 21:39:40 +02007# Generated: Wed Jul 20 20:07:11 2016
Piotr Krysik09826732016-07-15 13:14:24 +02008##################################################
9
10from gnuradio import gr
11from gnuradio.filter import firdes
12import grgsm
13import math
14
15
16class clock_offset_corrector_tagged(grgsm.hier_block):
17
Piotr Krysik83afe732016-07-17 22:48:35 +020018 def __init__(self, fc=936.6e6, osr=4, ppm=0, samp_rate_in=1625000.0/6.0*4.0):
Piotr Krysik09826732016-07-15 13:14:24 +020019 gr.hier_block2.__init__(
Piotr Krysik83afe732016-07-17 22:48:35 +020020 self, "Clock Offset Corrector Tagged",
Piotr Krysik09826732016-07-15 13:14:24 +020021 gr.io_signature(1, 1, gr.sizeof_gr_complex*1),
22 gr.io_signature(1, 1, gr.sizeof_gr_complex*1),
23 )
24 self.message_port_register_hier_in("ctrl")
25
26 ##################################################
27 # Parameters
28 ##################################################
29 self.fc = fc
Piotr Krysik83afe732016-07-17 22:48:35 +020030 self.osr = osr
Piotr Krysik09826732016-07-15 13:14:24 +020031 self.ppm = ppm
32 self.samp_rate_in = samp_rate_in
33
34 ##################################################
35 # Variables
36 ##################################################
Piotr Krysik83afe732016-07-17 22:48:35 +020037 self.gsm_symb_rate = gsm_symb_rate = 1625000.0/6.0
38 self.samp_rate_out = samp_rate_out = osr*gsm_symb_rate
Piotr Krysik09826732016-07-15 13:14:24 +020039
40 ##################################################
41 # Blocks
42 ##################################################
Piotr Krysikd1ca3892016-07-17 11:33:50 +020043 self.gsm_msg_to_tag_0 = grgsm.msg_to_tag()
Piotr Krysik83afe732016-07-17 22:48:35 +020044 self.gsm_controlled_rotator_cc_0 = grgsm.controlled_rotator_cc(ppm/1.0e6*2*math.pi*fc/samp_rate_out)
Piotr Krysik79735382016-07-20 21:39:40 +020045 self.gsm_controlled_fractional_resampler_cc_0 = grgsm.controlled_fractional_resampler_cc(0, (1-ppm/1.0e6)*(samp_rate_in/samp_rate_out))
Piotr Krysik09826732016-07-15 13:14:24 +020046
47 ##################################################
48 # Connections
49 ##################################################
Piotr Krysikd1ca3892016-07-17 11:33:50 +020050 self.msg_connect((self, 'ctrl'), (self.gsm_msg_to_tag_0, 'msg'))
51 self.connect((self.gsm_controlled_fractional_resampler_cc_0, 0), (self.gsm_controlled_rotator_cc_0, 0))
Piotr Krysik09826732016-07-15 13:14:24 +020052 self.connect((self.gsm_controlled_rotator_cc_0, 0), (self, 0))
Piotr Krysikd1ca3892016-07-17 11:33:50 +020053 self.connect((self.gsm_msg_to_tag_0, 0), (self.gsm_controlled_fractional_resampler_cc_0, 0))
54 self.connect((self, 0), (self.gsm_msg_to_tag_0, 0))
Piotr Krysik09826732016-07-15 13:14:24 +020055
56 def get_fc(self):
57 return self.fc
58
59 def set_fc(self, fc):
60 self.fc = fc
Piotr Krysik83afe732016-07-17 22:48:35 +020061 self.gsm_controlled_rotator_cc_0.set_phase_inc(self.ppm/1.0e6*2*math.pi*self.fc/self.samp_rate_out)
62
63 def get_osr(self):
64 return self.osr
65
66 def set_osr(self, osr):
67 self.osr = osr
68 self.set_samp_rate_out(self.osr*self.gsm_symb_rate)
Piotr Krysik09826732016-07-15 13:14:24 +020069
70 def get_ppm(self):
71 return self.ppm
72
73 def set_ppm(self, ppm):
74 self.ppm = ppm
Piotr Krysik83afe732016-07-17 22:48:35 +020075 self.gsm_controlled_rotator_cc_0.set_phase_inc(self.ppm/1.0e6*2*math.pi*self.fc/self.samp_rate_out)
Piotr Krysik79735382016-07-20 21:39:40 +020076 self.gsm_controlled_fractional_resampler_cc_0.set_resamp_ratio((1-self.ppm/1.0e6)*(self.samp_rate_in/self.samp_rate_out))
Piotr Krysik09826732016-07-15 13:14:24 +020077
78 def get_samp_rate_in(self):
79 return self.samp_rate_in
80
81 def set_samp_rate_in(self, samp_rate_in):
82 self.samp_rate_in = samp_rate_in
Piotr Krysik79735382016-07-20 21:39:40 +020083 self.gsm_controlled_fractional_resampler_cc_0.set_resamp_ratio((1-self.ppm/1.0e6)*(self.samp_rate_in/self.samp_rate_out))
Piotr Krysik83afe732016-07-17 22:48:35 +020084
85 def get_gsm_symb_rate(self):
86 return self.gsm_symb_rate
87
88 def set_gsm_symb_rate(self, gsm_symb_rate):
89 self.gsm_symb_rate = gsm_symb_rate
90 self.set_samp_rate_out(self.osr*self.gsm_symb_rate)
Piotr Krysik09826732016-07-15 13:14:24 +020091
92 def get_samp_rate_out(self):
93 return self.samp_rate_out
94
95 def set_samp_rate_out(self, samp_rate_out):
96 self.samp_rate_out = samp_rate_out
Piotr Krysik83afe732016-07-17 22:48:35 +020097 self.gsm_controlled_rotator_cc_0.set_phase_inc(self.ppm/1.0e6*2*math.pi*self.fc/self.samp_rate_out)
Piotr Krysik79735382016-07-20 21:39:40 +020098 self.gsm_controlled_fractional_resampler_cc_0.set_resamp_ratio((1-self.ppm/1.0e6)*(self.samp_rate_in/self.samp_rate_out))