aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--grc/gsm_block_tree.xml1
-rw-r--r--grc/misc_utils/CMakeLists.txt1
-rw-r--r--grc/misc_utils/gsm_clock_offset_corrector_tagged.xml50
-rw-r--r--grc/receiver/gsm_clock_offset_control.xml11
-rw-r--r--hier_blocks/misc_utils/gsm_clock_offset_corrector_new.grc494
-rw-r--r--hier_blocks/misc_utils/gsm_clock_offset_corrector_tagged.grc606
-rw-r--r--include/grgsm/receiver/clock_offset_control.h5
-rw-r--r--lib/receiver/clock_offset_control_impl.cc106
-rw-r--r--lib/receiver/clock_offset_control_impl.h7
-rw-r--r--python/CMakeLists.txt4
-rw-r--r--python/__init__.py1
-rw-r--r--python/misc_utils/clock_offset_corrector_tagged.py81
12 files changed, 1315 insertions, 52 deletions
diff --git a/grc/gsm_block_tree.xml b/grc/gsm_block_tree.xml
index 1dd81b7..99628d6 100644
--- a/grc/gsm_block_tree.xml
+++ b/grc/gsm_block_tree.xml
@@ -62,6 +62,7 @@
<block>gsm_controlled_fractional_resampler_cc</block>
<block>gsm_message_printer</block>
<block>gsm_clock_offset_corrector</block>
+ <block>gsm_clock_offset_corrector_tagged</block>
<block>gsm_tmsi_dumper</block>
</cat>
</cat>
diff --git a/grc/misc_utils/CMakeLists.txt b/grc/misc_utils/CMakeLists.txt
index d042beb..a64d2eb 100644
--- a/grc/misc_utils/CMakeLists.txt
+++ b/grc/misc_utils/CMakeLists.txt
@@ -25,6 +25,7 @@ install(FILES
gsm_message_printer.xml
gsm_bursts_printer.xml
gsm_clock_offset_corrector.xml
+ gsm_clock_offset_corrector_tagged.xml
gsm_tmsi_dumper.xml
gsm_burst_file_sink.xml
gsm_burst_file_source.xml
diff --git a/grc/misc_utils/gsm_clock_offset_corrector_tagged.xml b/grc/misc_utils/gsm_clock_offset_corrector_tagged.xml
new file mode 100644
index 0000000..4f91b4b
--- /dev/null
+++ b/grc/misc_utils/gsm_clock_offset_corrector_tagged.xml
@@ -0,0 +1,50 @@
+<block>
+ <name>Clock Offset Corrector Tagged</name>
+ <key>gsm_clock_offset_corrector_tagged</key>
+ <import>from clock_offset_corrector_tagged import clock_offset_corrector_tagged # grc-generated hier_block</import>
+ <make>grgsm.clock_offset_corrector_tagged(
+ fc=$fc,
+ ppm=$ppm,
+ samp_rate_in=$samp_rate_in,
+)</make>
+ <callback>set_fc($fc)</callback>
+ <callback>set_ppm($ppm)</callback>
+ <callback>set_samp_rate_in($samp_rate_in)</callback>
+ <param>
+ <name>fc</name>
+ <key>fc</key>
+ <value>fc</value>
+ <type>float</type>
+ </param>
+ <param>
+ <name>ppm</name>
+ <key>ppm</key>
+ <value>ppm</value>
+ <type>float</type>
+ </param>
+ <param>
+ <name>samp_rate_in</name>
+ <key>samp_rate_in</key>
+ <value>samp_rate_in</value>
+ <type>float</type>
+ </param>
+ <sink>
+ <name>ctrl</name>
+ <type>message</type>
+ <optional>1</optional>
+ </sink>
+ <sink>
+ <name>in</name>
+ <type>complex</type>
+ <vlen>1</vlen>
+ </sink>
+ <source>
+ <name>out</name>
+ <type>complex</type>
+ <vlen>1</vlen>
+ </source>
+ <doc>Piotr Krysik
+Clock offset corrector with blocks that use tags to switch offsets
+</doc>
+ <grc_source>gr-gsm/hier_blocks/misc_utils/gsm_clock_offset_corrector_tagged.grc</grc_source>
+</block>
diff --git a/grc/receiver/gsm_clock_offset_control.xml b/grc/receiver/gsm_clock_offset_control.xml
index 2d55e4f..704d2f3 100644
--- a/grc/receiver/gsm_clock_offset_control.xml
+++ b/grc/receiver/gsm_clock_offset_control.xml
@@ -3,7 +3,7 @@
<name>GSM Clock Offset Control</name>
<key>gsm_clock_offset_control</key>
<import>import grgsm</import>
- <make>grgsm.clock_offset_control($fc)</make>
+ <make>grgsm.clock_offset_control($fc, $samp_rate)</make>
<callback></callback>
<param>
<name>fc</name>
@@ -12,13 +12,20 @@
<type>float</type>
</param>
+ <param>
+ <name>samp_rate</name>
+ <key>samp_rate</key>
+ <value>samp_rate</value>
+ <type>float</type>
+ </param>
+
<sink>
<name>measurements</name>
<type>message</type>
</sink>
<source>
- <name>ppm</name>
+ <name>ctrl</name>
<type>message</type>
<optional>1</optional>
</source>
diff --git a/hier_blocks/misc_utils/gsm_clock_offset_corrector_new.grc b/hier_blocks/misc_utils/gsm_clock_offset_corrector_new.grc
new file mode 100644
index 0000000..390fce6
--- /dev/null
+++ b/hier_blocks/misc_utils/gsm_clock_offset_corrector_new.grc
@@ -0,0 +1,494 @@
+<?xml version='1.0' encoding='utf-8'?>
+<?grc format='1' created='3.7.9'?>
+<flow_graph>
+ <timestamp>Thu Nov 6 10:22:20 2014</timestamp>
+ <block>
+ <key>options</key>
+ <param>
+ <key>author</key>
+ <value>Piotr Krysik</value>
+ </param>
+ <param>
+ <key>window_size</key>
+ <value>2280, 1024</value>
+ </param>
+ <param>
+ <key>category</key>
+ <value>GSM</value>
+ </param>
+ <param>
+ <key>comment</key>
+ <value></value>
+ </param>
+ <param>
+ <key>description</key>
+ <value></value>
+ </param>
+ <param>
+ <key>_enabled</key>
+ <value>True</value>
+ </param>
+ <param>
+ <key>_coordinate</key>
+ <value>(10, 10)</value>
+ </param>
+ <param>
+ <key>_rotation</key>
+ <value>0</value>
+ </param>
+ <param>
+ <key>generate_options</key>
+ <value>hb</value>
+ </param>
+ <param>
+ <key>hier_block_src_path</key>
+ <value>.:</value>
+ </param>
+ <param>
+ <key>id</key>
+ <value>clock_offset_corrector_new</value>
+ </param>
+ <param>
+ <key>max_nouts</key>
+ <value>0</value>
+ </param>
+ <param>
+ <key>qt_qss_theme</key>
+ <value></value>
+ </param>
+ <param>
+ <key>realtime_scheduling</key>
+ <value></value>
+ </param>
+ <param>
+ <key>run_command</key>
+ <value>{python} -u {filename}</value>
+ </param>
+ <param>
+ <key>run_options</key>
+ <value>prompt</value>
+ </param>
+ <param>
+ <key>run</key>
+ <value>True</value>
+ </param>
+ <param>
+ <key>thread_safe_setters</key>
+ <value></value>
+ </param>
+ <param>
+ <key>title</key>
+ <value>Clock offset corrector</value>
+ </param>
+ </block>
+ <block>
+ <key>variable</key>
+ <param>
+ <key>comment</key>
+ <value></value>
+ </param>
+ <param>
+ <key>_enabled</key>
+ <value>True</value>
+ </param>
+ <param>
+ <key>_coordinate</key>
+ <value>(736, 19)</value>
+ </param>
+ <param>
+ <key>_rotation</key>
+ <value>0</value>
+ </param>
+ <param>
+ <key>id</key>
+ <value>samp_rate_out</value>
+ </param>
+ <param>
+ <key>value</key>
+ <value>samp_rate_in</value>
+ </param>
+ </block>
+ <block>
+ <key>pad_source</key>
+ <param>
+ <key>comment</key>
+ <value></value>
+ </param>
+ <param>
+ <key>_enabled</key>
+ <value>True</value>
+ </param>
+ <param>
+ <key>_coordinate</key>
+ <value>(32, 244)</value>
+ </param>
+ <param>
+ <key>_rotation</key>
+ <value>0</value>
+ </param>
+ <param>
+ <key>id</key>
+ <value>ctrl_in</value>
+ </param>
+ <param>
+ <key>label</key>
+ <value>ctrl_in</value>
+ </param>
+ <param>
+ <key>num_streams</key>
+ <value>1</value>
+ </param>
+ <param>
+ <key>optional</key>
+ <value>True</value>
+ </param>
+ <param>
+ <key>type</key>
+ <value>message</value>
+ </param>
+ <param>
+ <key>vlen</key>
+ <value>1</value>
+ </param>
+ </block>
+ <block>
+ <key>parameter</key>
+ <param>
+ <key>alias</key>
+ <value></value>
+ </param>
+ <param>
+ <key>comment</key>
+ <value></value>
+ </param>
+ <param>
+ <key>_enabled</key>
+ <value>True</value>
+ </param>
+ <param>
+ <key>_coordinate</key>
+ <value>(274, 19)</value>
+ </param>
+ <param>
+ <key>_rotation</key>
+ <value>0</value>
+ </param>
+ <param>
+ <key>id</key>
+ <value>fc</value>
+ </param>
+ <param>
+ <key>label</key>
+ <value>fc</value>
+ </param>
+ <param>
+ <key>short_id</key>
+ <value></value>
+ </param>
+ <param>
+ <key>type</key>
+ <value>eng_float</value>
+ </param>
+ <param>
+ <key>value</key>
+ <value>936.6e6</value>
+ </param>
+ </block>
+ <block>
+ <key>grgsm_msg_to_tag</key>
+ <param>
+ <key>alias</key>
+ <value></value>
+ </param>
+ <param>
+ <key>comment</key>
+ <value></value>
+ </param>
+ <param>
+ <key>affinity</key>
+ <value></value>
+ </param>
+ <param>
+ <key>_enabled</key>
+ <value>True</value>
+ </param>
+ <param>
+ <key>_coordinate</key>
+ <value>(192, 193)</value>
+ </param>
+ <param>
+ <key>_rotation</key>
+ <value>0</value>
+ </param>
+ <param>
+ <key>id</key>
+ <value>grgsm_msg_to_tag_0</value>
+ </param>
+ <param>
+ <key>maxoutbuf</key>
+ <value>0</value>
+ </param>
+ <param>
+ <key>minoutbuf</key>
+ <value>0</value>
+ </param>
+ </block>
+ <block>
+ <key>import</key>
+ <param>
+ <key>alias</key>
+ <value></value>
+ </param>
+ <param>
+ <key>comment</key>
+ <value></value>
+ </param>
+ <param>
+ <key>_enabled</key>
+ <value>True</value>
+ </param>
+ <param>
+ <key>_coordinate</key>
+ <value>(11, 125)</value>
+ </param>
+ <param>
+ <key>_rotation</key>
+ <value>0</value>
+ </param>
+ <param>
+ <key>id</key>
+ <value>math_imp</value>
+ </param>
+ <param>
+ <key>import</key>
+ <value>import math</value>
+ </param>
+ </block>
+ <block>
+ <key>pad_sink</key>
+ <param>
+ <key>comment</key>
+ <value></value>
+ </param>
+ <param>
+ <key>_enabled</key>
+ <value>True</value>
+ </param>
+ <param>
+ <key>_coordinate</key>
+ <value>(1168, 204)</value>
+ </param>
+ <param>
+ <key>_rotation</key>
+ <value>0</value>
+ </param>
+ <param>
+ <key>id</key>
+ <value>pad_sink_1</value>
+ </param>
+ <param>
+ <key>type</key>
+ <value>complex</value>
+ </param>
+ <param>
+ <key>label</key>
+ <value>out</value>
+ </param>
+ <param>
+ <key>num_streams</key>
+ <value>1</value>
+ </param>
+ <param>
+ <key>optional</key>
+ <value>False</value>
+ </param>
+ <param>
+ <key>vlen</key>
+ <value>1</value>
+ </param>
+ </block>
+ <block>
+ <key>pad_source</key>
+ <param>
+ <key>comment</key>
+ <value></value>
+ </param>
+ <param>
+ <key>_enabled</key>
+ <value>True</value>
+ </param>
+ <param>
+ <key>_coordinate</key>
+ <value>(32, 188)</value>
+ </param>
+ <param>
+ <key>_rotation</key>
+ <value>0</value>
+ </param>
+ <param>
+ <key>id</key>
+ <value>pad_source_0</value>
+ </param>
+ <param>
+ <key>label</key>
+ <value>in</value>
+ </param>
+ <param>
+ <key>num_streams</key>
+ <value>1</value>
+ </param>
+ <param>
+ <key>optional</key>
+ <value>False</value>
+ </param>
+ <param>
+ <key>type</key>
+ <value>complex</value>
+ </param>
+ <param>
+ <key>vlen</key>
+ <value>1</value>
+ </param>
+ </block>
+ <block>
+ <key>parameter</key>
+ <param>
+ <key>alias</key>
+ <value></value>
+ </param>
+ <param>
+ <key>comment</key>
+ <value></value>
+ </param>
+ <param>
+ <key>_enabled</key>
+ <value>True</value>
+ </param>
+ <param>
+ <key>_coordinate</key>
+ <value>(496, 19)</value>
+ </param>
+ <param>
+ <key>_rotation</key>
+ <value>0</value>
+ </param>
+ <param>
+ <key>id</key>
+ <value>ppm</value>
+ </param>
+ <param>
+ <key>label</key>
+ <value>ppm</value>
+ </param>
+ <param>
+ <key>short_id</key>
+ <value></value>
+ </param>
+ <param>
+ <key>type</key>
+ <value>eng_float</value>
+ </param>
+ <param>
+ <key>value</key>
+ <value>0</value>
+ </param>
+ </block>
+ <block>
+ <key>parameter</key>
+ <param>
+ <key>alias</key>
+ <value></value>
+ </param>
+ <param>
+ <key>comment</key>
+ <value></value>
+ </param>
+ <param>
+ <key>_enabled</key>
+ <value>True</value>
+ </param>
+ <param>
+ <key>_coordinate</key>
+ <value>(368, 19)</value>
+ </param>
+ <param>
+ <key>_rotation</key>
+ <value>0</value>
+ </param>
+ <param>
+ <key>id</key>
+ <value>samp_rate_in</value>
+ </param>
+ <param>
+ <key>label</key>
+ <value>samp_rate_in</value>
+ </param>
+ <param>
+ <key>short_id</key>
+ <value></value>
+ </param>
+ <param>
+ <key>type</key>
+ <value>eng_float</value>
+ </param>
+ <param>
+ <key>value</key>
+ <value>1625000.0/6.0*4.0</value>
+ </param>
+ </block>
+ <block>
+ <key>parameter</key>
+ <param>
+ <key>alias</key>
+ <value></value>
+ </param>
+ <param>
+ <key>comment</key>
+ <value></value>
+ </param>
+ <param>
+ <key>_enabled</key>
+ <value>False</value>
+ </param>
+ <param>
+ <key>_coordinate</key>
+ <value>(592, 20)</value>
+ </param>
+ <param>
+ <key>_rotation</key>
+ <value>0</value>
+ </param>
+ <param>
+ <key>id</key>
+ <value>samp_rate_out</value>
+ </param>
+ <param>
+ <key>label</key>
+ <value>samp_rate_out</value>
+ </param>
+ <param>
+ <key>short_id</key>
+ <value></value>
+ </param>
+ <param>
+ <key>type</key>
+ <value>eng_float</value>
+ </param>
+ <param>
+ <key>value</key>
+ <value>1625000.0/6.0*4.0</value>
+ </param>
+ </block>
+ <connection>
+ <source_block_id>ctrl_in</source_block_id>
+ <sink_block_id>grgsm_msg_to_tag_0</sink_block_id>
+ <source_key>out</source_key>
+ <sink_key>msg</sink_key>
+ </connection>
+ <connection>
+ <source_block_id>pad_source_0</source_block_id>
+ <sink_block_id>grgsm_msg_to_tag_0</sink_block_id>
+ <source_key>0</source_key>
+ <sink_key>0</sink_key>
+ </connection>
+</flow_graph>
diff --git a/hier_blocks/misc_utils/gsm_clock_offset_corrector_tagged.grc b/hier_blocks/misc_utils/gsm_clock_offset_corrector_tagged.grc
new file mode 100644
index 0000000..61d8db7
--- /dev/null
+++ b/hier_blocks/misc_utils/gsm_clock_offset_corrector_tagged.grc
@@ -0,0 +1,606 @@
+<?xml version='1.0' encoding='utf-8'?>
+<?grc format='1' created='3.7.9'?>
+<flow_graph>
+ <timestamp>Thu Nov 6 10:22:20 2014</timestamp>
+ <block>
+ <key>options</key>
+ <param>
+ <key>author</key>
+ <value>Piotr Krysik</value>
+ </param>
+ <param>
+ <key>window_size</key>
+ <value>2280, 1024</value>
+ </param>
+ <param>
+ <key>category</key>
+ <value>GSM</value>
+ </param>
+ <param>
+ <key>comment</key>
+ <value></value>
+ </param>
+ <param>
+ <key>description</key>
+ <value>Clock offset corrector with blocks that use tags to switch offsets</value>
+ </param>
+ <param>
+ <key>_enabled</key>
+ <value>True</value>
+ </param>
+ <param>
+ <key>_coordinate</key>
+ <value>(10, 10)</value>
+ </param>
+ <param>
+ <key>_rotation</key>
+ <value>0</value>
+ </param>
+ <param>
+ <key>generate_options</key>
+ <value>hb</value>
+ </param>
+ <param>
+ <key>hier_block_src_path</key>
+ <value>.:</value>
+ </param>
+ <param>
+ <key>id</key>
+ <value>clock_offset_corrector_tagged</value>
+ </param>
+ <param>
+ <key>max_nouts</key>
+ <value>0</value>
+ </param>
+ <param>
+ <key>qt_qss_theme</key>
+ <value></value>
+ </param>
+ <param>
+ <key>realtime_scheduling</key>
+ <value></value>
+ </param>
+ <param>
+ <key>run_command</key>
+ <value>{python} -u {filename}</value>
+ </param>
+ <param>
+ <key>run_options</key>
+ <value>prompt</value>
+ </param>
+ <param>
+ <key>run</key>
+ <value>True</value>
+ </param>
+ <param>
+ <key>thread_safe_setters</key>
+ <value></value>
+ </param>
+ <param>
+ <key>title</key>
+ <value>Clock offset corrector tagged</value>
+ </param>
+ </block>
+ <block>
+ <key>variable</key>
+ <param>
+ <key>comment</key>
+ <value></value>
+ </param>
+ <param>
+ <key>_enabled</key>
+ <value>True</value>
+ </param>
+ <param>
+ <key>_coordinate</key>
+ <value>(736, 19)</value>
+ </param>
+ <param>
+ <key>_rotation</key>
+ <value>0</value>
+ </param>
+ <param>
+ <key>id</key>
+ <value>samp_rate_out</value>
+ </param>
+ <param>
+ <key>value</key>
+ <value>samp_rate_in</value>
+ </param>
+ </block>
+ <block>
+ <key>pad_source</key>
+ <param>
+ <key>comment</key>
+ <value></value>
+ </param>
+ <param>
+ <key>_enabled</key>
+ <value>True</value>
+ </param>
+ <param>
+ <key>_coordinate</key>
+ <value>(32, 244)</value>
+ </param>
+ <param>
+ <key>_rotation</key>
+ <value>0</value>
+ </param>
+ <param>
+ <key>id</key>
+ <value>ctrl</value>
+ </param>
+ <param>
+ <key>label</key>
+ <value>ctrl</value>
+ </param>
+ <param>
+ <key>num_streams</key>
+ <value>1</value>
+ </param>
+ <param>
+ <key>optional</key>
+ <value>True</value>
+ </param>
+ <param>
+ <key>type</key>
+ <value>message</value>
+ </param>
+ <param>
+ <key>vlen</key>
+ <value>1</value>
+ </param>
+ </block>
+ <block>
+ <key>parameter</key>
+ <param>
+ <key>alias</key>
+ <value></value>
+ </param>
+ <param>
+ <key>comment</key>
+ <value></value>
+ </param>
+ <param>
+ <key>_enabled</key>
+ <value>True</value>
+ </param>
+ <param>
+ <key>_coordinate</key>
+ <value>(274, 19)</value>
+ </param>
+ <param>
+ <key>_rotation</key>
+ <value>0</value>
+ </param>
+ <param>
+ <key>id</key>
+ <value>fc</value>
+ </param>
+ <param>
+ <key>label</key>
+ <value>fc</value>
+ </param>
+ <param>
+ <key>short_id</key>
+ <value></value>
+ </param>
+ <param>
+ <key>type</key>
+ <value>eng_float</value>
+ </param>
+ <param>
+ <key>value</key>
+ <value>936.6e6</value>
+ </param>
+ </block>
+ <block>
+ <key>grgsm_controlled_fractional_resampler_cc</key>
+ <param>
+ <key>alias</key>
+ <value></value>
+ </param>
+ <param>
+ <key>comment</key>
+ <value></value>
+ </param>
+ <param>
+ <key>affinity</key>
+ <value></value>
+ </param>
+ <param>
+ <key>_enabled</key>
+ <value>1</value>
+ </param>
+ <param>
+ <key>_coordinate</key>
+ <value>(328, 197)</value>
+ </param>
+ <param>
+ <key>_rotation</key>
+ <value>0</value>
+ </param>
+ <param>
+ <key>id</key>
+ <value>grgsm_controlled_fractional_resampler_cc_0</value>
+ </param>
+ <param>
+ <key>maxoutbuf</key>
+ <value>0</value>
+ </param>
+ <param>
+ <key>minoutbuf</key>
+ <value>0</value>
+ </param>
+ <param>
+ <key>phase_shift</key>
+ <value>0</value>
+ </param>
+ <param>
+ <key>resamp_ratio</key>
+ <value>1.0</value>
+ </param>
+ </block>
+ <block>
+ <key>grgsm_msg_to_tag</key>
+ <param>
+ <key>alias</key>
+ <value></value>
+ </param>
+ <param>
+ <key>comment</key>
+ <value></value>
+ </param>
+ <param>
+ <key>affinity</key>
+ <value></value>
+ </param>
+ <param>
+ <key>_enabled</key>
+ <value>True</value>
+ </param>
+ <param>
+ <key>_coordinate</key>
+ <value>(192, 193)</value>
+ </param>
+ <param>
+ <key>_rotation</key>
+ <value>0</value>
+ </param>
+ <param>
+ <key>id</key>
+ <value>grgsm_msg_to_tag_0</value>
+ </param>
+ <param>
+ <key>maxoutbuf</key>
+ <value>0</value>
+ </param>
+ <param>
+ <key>minoutbuf</key>
+ <value>0</value>
+ </param>
+ </block>
+ <block>
+ <key>gsm_controlled_rotator_cc</key>
+ <param>
+ <key>alias</key>
+ <value></value>
+ </param>
+ <param>
+ <key>comment</key>
+ <value></value>
+ </param>
+ <param>
+ <key>affinity</key>
+ <value></value>
+ </param>
+ <param>
+ <key>_enabled</key>
+ <value>True</value>
+ </param>
+ <param>
+ <key>_coordinate</key>
+ <value>(608, 209)</value>
+ </param>
+ <param>
+ <key>_rotation</key>
+ <value>0</value>
+ </param>
+ <param>
+ <key>id</key>
+ <value>gsm_controlled_rotator_cc_0</value>
+ </param>
+ <param>
+ <key>maxoutbuf</key>
+ <value>0</value>
+ </param>
+ <param>
+ <key>minoutbuf</key>
+ <value>0</value>
+ </param>
+ <param>
+ <key>phase_inc</key>
+ <value>ppm/1.0e6*2*math.pi*fc/samp_rate_in</value>
+ </param>
+ <param>
+ <key>samp_rate</key>
+ <value>samp_rate_out</value>
+ </param>
+ </block>
+ <block>
+ <key>import</key>
+ <param>
+ <key>alias</key>
+ <value></value>
+ </param>
+ <param>
+ <key>comment</key>
+ <value></value>
+ </param>
+ <param>
+ <key>_enabled</key>
+ <value>True</value>
+ </param>
+ <param>
+ <key>_coordinate</key>
+ <value>(11, 125)</value>
+ </param>
+ <param>
+ <key>_rotation</key>
+ <value>0</value>
+ </param>
+ <param>
+ <key>id</key>
+ <value>math_imp</value>
+ </param>
+ <param>
+ <key>import</key>
+ <value>import math</value>
+ </param>
+ </block>
+ <block>
+ <key>pad_sink</key>
+ <param>
+ <key>comment</key>
+ <value></value>
+ </param>
+ <param>
+ <key>_enabled</key>
+ <value>True</value>
+ </param>
+ <param>
+ <key>_coordinate</key>
+ <value>(784, 220)</value>
+ </param>
+ <param>
+ <key>_rotation</key>
+ <value>0</value>
+ </param>
+ <param>
+ <key>id</key>
+ <value>pad_sink_1</value>
+ </param>
+ <param>
+ <key>type</key>
+ <value>complex</value>
+ </param>
+ <param>
+ <key>label</key>
+ <value>out</value>
+ </param>
+ <param>
+ <key>num_streams</key>
+ <value>1</value>
+ </param>
+ <param>
+ <key>optional</key>
+ <value>False</value>
+ </param>
+ <param>
+ <key>vlen</key>
+ <value>1</value>
+ </param>
+ </block>
+ <block>
+ <key>pad_source</key>
+ <param>
+ <key>comment</key>
+ <value></value>
+ </param>
+ <param>
+ <key>_enabled</key>
+ <value>True</value>
+ </param>
+ <param>
+ <key>_coordinate</key>
+ <value>(32, 188)</value>
+ </param>
+ <param>
+ <key>_rotation</key>
+ <value>0</value>
+ </param>
+ <param>
+ <key>id</key>
+ <value>pad_source_0</value>
+ </param>
+ <param>
+ <key>label</key>
+ <value>in</value>
+ </param>
+ <param>
+ <key>num_streams</key>
+ <value>1</value>
+ </param>
+ <param>
+ <key>optional</key>
+ <value>False</value>
+ </param>
+ <param>
+ <key>type</key>
+ <value>complex</value>
+ </param>
+ <param>
+ <key>vlen</key>
+ <value>1</value>
+ </param>
+ </block>
+ <block>
+ <key>parameter</key>
+ <param>
+ <key>alias</key>
+ <value></value>
+ </param>
+ <param>
+ <key>comment</key>
+ <value></value>
+ </param>
+ <param>
+ <key>_enabled</key>
+ <value>True</value>
+ </param>
+ <param>
+ <key>_coordinate</key>
+ <value>(496, 19)</value>
+ </param>
+ <param>
+ <key>_rotation</key>
+ <value>0</value>
+ </param>
+ <param>
+ <key>id</key>
+ <value>ppm</value>
+ </param>
+ <param>
+ <key>label</key>
+ <value>ppm</value>
+ </param>
+ <param>
+ <key>short_id</key>
+ <value></value>
+ </param>
+ <param>
+ <key>type</key>
+ <value>eng_float</value>
+ </param>
+ <param>
+ <key>value</key>
+ <value>0</value>
+ </param>
+ </block>
+ <block>
+ <key>parameter</key>
+ <param>
+ <key>alias</key>
+ <value></value>
+ </param>
+ <param>
+ <key>comment</key>
+ <value></value>
+ </param>
+ <param>
+ <key>_enabled</key>
+ <value>True</value>
+ </param>
+ <param>
+ <key>_coordinate</key>
+ <value>(368, 19)</value>
+ </param>
+ <param>
+ <key>_rotation</key>
+ <value>0</value>
+ </param>
+ <param>
+ <key>id</key>
+ <value>samp_rate_in</value>
+ </param>
+ <param>
+ <key>label</key>
+ <value>samp_rate_in</value>
+ </param>
+ <param>
+ <key>short_id</key>
+ <value></value>
+ </param>
+ <param>
+ <key>type</key>
+ <value>eng_float</value>
+ </param>
+ <param>
+ <key>value</key>
+ <value>1625000.0/6.0*4.0</value>
+ </param>
+ </block>
+ <block>
+ <key>parameter</key>
+ <param>
+ <key>alias</key>
+ <value></value>
+ </param>
+ <param>
+ <key>comment</key>
+ <value></value>
+ </param>
+ <param>
+ <key>_enabled</key>
+ <value>False</value>
+ </param>
+ <param>
+ <key>_coordinate</key>
+ <value>(592, 20)</value>
+ </param>
+ <param>
+ <key>_rotation</key>
+ <value>0</value>
+ </param>
+ <param>
+ <key>id</key>
+ <value>samp_rate_out</value>
+ </param>
+ <param>
+ <key>label</key>
+ <value>samp_rate_out</value>
+ </param>
+ <param>
+ <key>short_id</key>
+ <value></value>
+ </param>
+ <param>
+ <key>type</key>
+ <value>eng_float</value>
+ </param>
+ <param>
+ <key>value</key>
+ <value>1625000.0/6.0*4.0</value>
+ </param>
+ </block>
+ <connection>
+ <source_block_id>ctrl</source_block_id>
+ <sink_block_id>grgsm_msg_to_tag_0</sink_block_id>
+ <source_key>out</source_key>
+ <sink_key>msg</sink_key>
+ </connection>
+ <connection>
+ <source_block_id>grgsm_controlled_fractional_resampler_cc_0</source_block_id>
+ <sink_block_id>gsm_controlled_rotator_cc_0</sink_block_id>
+ <source_key>0</source_key>
+ <sink_key>0</sink_key>
+ </connection>
+ <connection>
+ <source_block_id>grgsm_msg_to_tag_0</source_block_id>
+ <sink_block_id>grgsm_controlled_fractional_resampler_cc_0</sink_block_id>
+ <source_key>0</source_key>
+ <sink_key>0</sink_key>
+ </connection>
+ <connection>
+ <source_block_id>gsm_controlled_rotator_cc_0</source_block_id>
+ <sink_block_id>pad_sink_1</sink_block_id>
+ <source_key>0</source_key>
+ <sink_key>0</sink_key>
+ </connection>
+ <connection>
+ <source_block_id>pad_source_0</source_block_id>
+ <sink_block_id>grgsm_msg_to_tag_0</sink_block_id>
+ <source_key>0</source_key>
+ <sink_key>0</sink_key>
+ </connection>
+</flow_graph>
diff --git a/include/grgsm/receiver/clock_offset_control.h b/include/grgsm/receiver/clock_offset_control.h
index 9a96d9c..ef750d1 100644
--- a/include/grgsm/receiver/clock_offset_control.h
+++ b/include/grgsm/receiver/clock_offset_control.h
@@ -49,8 +49,9 @@ namespace gr {
* class. gsm::clock_offset_control::make is the public interface for
* creating new instances.
*/
- static sptr make(float fc);
- virtual void set_fc(float fc) = 0;
+ static sptr make(float fc, float samp_rate);
+ virtual void set_fc(float fc) = 0;
+ virtual void set_samp_rate(float samp_rate) = 0;
};
} // namespace gsm
diff --git a/lib/receiver/clock_offset_control_impl.cc b/lib/receiver/clock_offset_control_impl.cc
index 43a9b8e..b3a7934 100644
--- a/lib/receiver/clock_offset_control_impl.cc
+++ b/lib/receiver/clock_offset_control_impl.cc
@@ -33,17 +33,17 @@ namespace gr
namespace gsm
{
clock_offset_control::sptr
-clock_offset_control::make(float fc)
+clock_offset_control::make(float fc, float samp_rate)
{
return gnuradio::get_initial_sptr
- (new clock_offset_control_impl(fc));
+ (new clock_offset_control_impl(fc, samp_rate));
}
/*
* The private constructor
*/
-clock_offset_control_impl::clock_offset_control_impl(float fc)
+clock_offset_control_impl::clock_offset_control_impl(float fc, float samp_rate)
: gr::block("clock_offset_control",
gr::io_signature::make(0, 0, 0),
gr::io_signature::make(0, 0, 0))
@@ -51,9 +51,10 @@ clock_offset_control_impl::clock_offset_control_impl(float fc)
{
message_port_register_in(pmt::mp("measurements"));
set_msg_handler(pmt::mp("measurements"), boost::bind(&clock_offset_control_impl::process_measurement, this, _1));
- message_port_register_out(pmt::mp("ppm"));
+ message_port_register_out(pmt::mp("ctrl"));
set_fc(fc);
+ set_samp_rate(samp_rate);
d_alfa = 0.3;
d_ppm_estimate = -1e6;
d_last_ppm_estimate = -1e6;
@@ -77,6 +78,11 @@ void clock_offset_control_impl::set_fc(float fc)
d_fc = fc;
}
+void clock_offset_control_impl::set_samp_rate(float samp_rate)
+{
+ d_samp_rate = samp_rate;
+}
+
void clock_offset_control_impl::process_measurement(pmt::pmt_t msg)
{
if(pmt::is_tuple(msg))
@@ -103,66 +109,76 @@ void clock_offset_control_impl::process_measurement(pmt::pmt_t msg)
float ppm = -freq_offset/d_fc*1.0e6;
std::string state = pmt::symbol_to_string(pmt::tuple_ref(msg,2));
d_last_state = state;
- if(std::abs(ppm) > 100.0) //safeguard against flawed measurements
+ if(std::abs(ppm) < 100.0) //safeguard against flawed measurements
{
- ppm=0;
- reset();
- }
- if(state == "fcch_search")
- {
- pmt::pmt_t msg_ppm = pmt::from_double(ppm);
- message_port_pub(pmt::intern("ppm"), msg_ppm);
- d_last_fcch_time = d_current_time;
- }
- else
- if (state == "synchronized")
- {
- d_last_fcch_time = d_current_time;
- if(d_first_measurement)
+ if(state == "fcch_search")
{
- d_ppm_estimate = ppm;
- d_first_measurement = false;
- }
- else
+ send_ctrl_messages(ppm);
+ d_last_fcch_time = d_current_time;
+ }
+ else
+ if (state == "synchronized")
{
- d_ppm_estimate = (1-d_alfa)*d_ppm_estimate+d_alfa*ppm;
- }
-
- if(d_counter == 5)
- {
- d_counter = 0;
- if(std::abs(d_last_ppm_estimate-d_ppm_estimate) > 0.1)
+ d_last_fcch_time = d_current_time;
+ if(d_first_measurement)
+ {
+ d_ppm_estimate = ppm;
+ d_first_measurement = false;
+ }
+ else
{
- pmt::pmt_t msg_ppm = pmt::from_double(ppm);
- message_port_pub(pmt::intern("ppm"), msg_ppm);
- d_last_ppm_estimate = d_ppm_estimate;
+ d_ppm_estimate = (1-d_alfa)*d_ppm_estimate+d_alfa*ppm;
+ }
+
+ if(d_counter == 5)
+ {
+ d_counter = 0;
+ if(std::abs(d_last_ppm_estimate-d_ppm_estimate) > 0.1)
+ {
+// pmt::pmt_t msg_ppm = pmt::from_double(ppm);
+// message_port_pub(pmt::intern("ppm"), msg_ppm);
+ send_ctrl_messages(ppm);
+ d_last_ppm_estimate = d_ppm_estimate;
+ }
+ }
+ else
+ {
+ d_counter=d_counter+1;
}
}
else
+ if(state == "sync_loss")
{
- d_counter=d_counter+1;
+ reset();
+// pmt::pmt_t msg_ppm = pmt::from_double(0.0);
+// message_port_pub(pmt::intern("ppm"), msg_ppm);
+ send_ctrl_messages(0);
}
- }
- else
- if(state == "sync_loss")
- {
- reset();
- pmt::pmt_t msg_ppm = pmt::from_double(0.0);
- message_port_pub(pmt::intern("ppm"), msg_ppm);
- }
+ }
}
}
}
+void clock_offset_control_impl::send_ctrl_messages(float ppm)
+{
+// pmt::pmt_t msg_ppm = pmt::from_double(ppm);
+// message_port_pub(pmt::intern("ctrl"), msg_ppm);
+// d_last_fcch_time = d_current_time;
+
+ pmt::pmt_t msg_set_phase_inc = pmt::cons(pmt::intern("set_phase_inc"), pmt::from_double(2*M_PI*d_fc/d_samp_rate*ppm/1.0e6));
+ message_port_pub(pmt::intern("ctrl"), msg_set_phase_inc);
+
+ pmt::pmt_t msg_set_resamp_ratio = pmt::cons(pmt::intern("set_resamp_ratio"), pmt::from_double(1+ppm/1.0e6));
+ message_port_pub(pmt::intern("ctrl"), msg_set_resamp_ratio);
+}
+
void clock_offset_control_impl::timed_reset()
{
reset();
- pmt::pmt_t msg_ppm = pmt::from_double(0.0);
- message_port_pub(pmt::intern("ppm"), msg_ppm);
+ send_ctrl_messages(0);
}
-
void clock_offset_control_impl::reset()
{
d_ppm_estimate = -1e6;
diff --git a/lib/receiver/clock_offset_control_impl.h b/lib/receiver/clock_offset_control_impl.h
index 3c11a6f..cc0ea3d 100644
--- a/lib/receiver/clock_offset_control_impl.h
+++ b/lib/receiver/clock_offset_control_impl.h
@@ -32,9 +32,10 @@ namespace gr {
{
private:
float d_fc;
+ float d_samp_rate;
float d_alfa;
float d_ppm_estimate;
- float d_last_ppm_estimate;
+ float d_last_ppm_estimate;
bool d_first_measurement;
int d_counter;
std::string d_last_state;
@@ -43,13 +44,15 @@ namespace gr {
bool d_first_time;
void process_measurement(pmt::pmt_t msg);
+ void send_ctrl_messages(float ppm);
void timed_reset();
void reset();
public:
- clock_offset_control_impl(float fc);
+ clock_offset_control_impl(float fc, float samp_rate);
~clock_offset_control_impl();
virtual void set_fc(float fc);
+ virtual void set_samp_rate(float samp_rate);
};
} // namespace gsm
} // namespace gr
diff --git a/python/CMakeLists.txt b/python/CMakeLists.txt
index aa77ff1..a9c4599 100644
--- a/python/CMakeLists.txt
+++ b/python/CMakeLists.txt
@@ -41,7 +41,8 @@ GR_PYTHON_INSTALL(
receiver/fcch_detector.py
receiver/chirpz.py
misc_utils/arfcn.py
- misc_utils/clock_offset_corrector.py
+ misc_utils/clock_offset_corrector.py
+ misc_utils/clock_offset_corrector_tagged.py
misc_utils/hier_block.py DESTINATION ${GR_PYTHON_DIR}/grgsm
)
@@ -63,3 +64,4 @@ GR_ADD_TEST(qa_burst_fnr_filter ${PYTHON_EXECUTABLE} ${CMAKE_CURRENT_SOURCE_DIR}
GR_ADD_TEST(qa_dummy_burst_filter ${PYTHON_EXECUTABLE} ${CMAKE_CURRENT_SOURCE_DIR}/qa_dummy_burst_filter.py)
GR_ADD_TEST(qa_arfcn ${PYTHON_EXECUTABLE} ${CMAKE_CURRENT_SOURCE_DIR}/qa_arfcn.py)
GR_ADD_TEST(qa_msg_to_tag ${PYTHON_EXECUTABLE} ${CMAKE_CURRENT_SOURCE_DIR}/qa_msg_to_tag.py)
+GR_ADD_TEST(qa_controlled_fractional_resampler_cc ${PYTHON_EXECUTABLE} ${CMAKE_CURRENT_SOURCE_DIR}/qa_controlled_fractional_resampler_cc.py)
diff --git a/python/__init__.py b/python/__init__.py
index dfa7a0e..2e35f6c 100644
--- a/python/__init__.py
+++ b/python/__init__.py
@@ -51,6 +51,7 @@ from fcch_burst_tagger import fcch_burst_tagger
from sch_detector import sch_detector
from fcch_detector import fcch_detector
from clock_offset_corrector import clock_offset_corrector
+from clock_offset_corrector_tagged import clock_offset_corrector_tagged
from gsm_input import gsm_input
from gsm_wideband_input import gsm_wideband_input
from gsm_bcch_ccch_demapper import gsm_bcch_ccch_demapper
diff --git a/python/misc_utils/clock_offset_corrector_tagged.py b/python/misc_utils/clock_offset_corrector_tagged.py
new file mode 100644
index 0000000..5d198b0
--- /dev/null
+++ b/python/misc_utils/clock_offset_corrector_tagged.py
@@ -0,0 +1,81 @@
+# -*- coding: utf-8 -*-
+##################################################
+# GNU Radio Python Flow Graph
+# Title: Clock offset corrector
+# Author: Piotr Krysik
+# Description: Clock offset corrector with blocks that use tags to switch offsets
+# Generated: Fri Jul 15 10:09:22 2016
+##################################################
+
+from gnuradio import gr
+from gnuradio.filter import firdes
+import grgsm
+import math
+
+
+class clock_offset_corrector_tagged(grgsm.hier_block):
+
+ def __init__(self, fc=936.6e6, ppm=0, samp_rate_in=1625000.0/6.0*4.0):
+ gr.hier_block2.__init__(
+ self, "Clock offset corrector tagged",
+ gr.io_signature(1, 1, gr.sizeof_gr_complex*1),
+ gr.io_signature(1, 1, gr.sizeof_gr_complex*1),
+ )
+ self.message_port_register_hier_in("ctrl")
+
+ ##################################################
+ # Parameters
+ ##################################################
+ self.fc = fc
+ self.ppm = ppm
+ self.samp_rate_in = samp_rate_in
+
+ ##################################################
+ # Variables
+ ##################################################
+ self.samp_rate_out = samp_rate_out = samp_rate_in
+
+ ##################################################
+ # Blocks
+ ##################################################
+ self.gsm_controlled_rotator_cc_0 = grgsm.controlled_rotator_cc(ppm/1.0e6*2*math.pi*fc/samp_rate_in,samp_rate_out)
+ self.grgsm_msg_to_tag_0 = grgsm.msg_to_tag()
+ self.grgsm_controlled_fractional_resampler_cc_0 = grgsm.controlled_fractional_resampler_cc(0, 1.0)
+
+ ##################################################
+ # Connections
+ ##################################################
+ self.msg_connect((self, 'ctrl'), (self.grgsm_msg_to_tag_0, 'msg'))
+ self.connect((self.grgsm_controlled_fractional_resampler_cc_0, 0), (self.gsm_controlled_rotator_cc_0, 0))
+ self.connect((self.grgsm_msg_to_tag_0, 0), (self.grgsm_controlled_fractional_resampler_cc_0, 0))
+ self.connect((self.gsm_controlled_rotator_cc_0, 0), (self, 0))
+ self.connect((self, 0), (self.grgsm_msg_to_tag_0, 0))
+
+ def get_fc(self):
+ return self.fc
+
+ def set_fc(self, fc):
+ self.fc = fc
+ self.gsm_controlled_rotator_cc_0.set_phase_inc(self.ppm/1.0e6*2*math.pi*self.fc/self.samp_rate_in)
+
+ def get_ppm(self):
+ return self.ppm
+
+ def set_ppm(self, ppm):
+ self.ppm = ppm
+ self.gsm_controlled_rotator_cc_0.set_phase_inc(self.ppm/1.0e6*2*math.pi*self.fc/self.samp_rate_in)
+
+ def get_samp_rate_in(self):
+ return self.samp_rate_in
+
+ def set_samp_rate_in(self, samp_rate_in):
+ self.samp_rate_in = samp_rate_in
+ self.set_samp_rate_out(self.samp_rate_in)
+ self.gsm_controlled_rotator_cc_0.set_phase_inc(self.ppm/1.0e6*2*math.pi*self.fc/self.samp_rate_in)
+
+ def get_samp_rate_out(self):
+ return self.samp_rate_out
+
+ def set_samp_rate_out(self, samp_rate_out):
+ self.samp_rate_out = samp_rate_out
+ self.gsm_controlled_rotator_cc_0.set_samp_rate(self.samp_rate_out)