diff options
author | Piotr Krysik <ptrkrysik@gmail.com> | 2016-07-15 13:14:24 +0200 |
---|---|---|
committer | Piotr Krysik <ptrkrysik@gmail.com> | 2016-07-15 13:14:24 +0200 |
commit | 0982673af1e91b91c4b983f0f423277e09089e7e (patch) | |
tree | e1922e1f54697a023496282934a7abb3d14cc77a | |
parent | 74c4f2c14cc116f2dbfc5b9ddff865c7e5021e74 (diff) |
New clock offset corrector and clock offset control
-rw-r--r-- | grc/gsm_block_tree.xml | 1 | ||||
-rw-r--r-- | grc/misc_utils/CMakeLists.txt | 1 | ||||
-rw-r--r-- | grc/misc_utils/gsm_clock_offset_corrector_tagged.xml | 50 | ||||
-rw-r--r-- | grc/receiver/gsm_clock_offset_control.xml | 11 | ||||
-rw-r--r-- | hier_blocks/misc_utils/gsm_clock_offset_corrector_new.grc | 494 | ||||
-rw-r--r-- | hier_blocks/misc_utils/gsm_clock_offset_corrector_tagged.grc | 606 | ||||
-rw-r--r-- | include/grgsm/receiver/clock_offset_control.h | 5 | ||||
-rw-r--r-- | lib/receiver/clock_offset_control_impl.cc | 106 | ||||
-rw-r--r-- | lib/receiver/clock_offset_control_impl.h | 7 | ||||
-rw-r--r-- | python/CMakeLists.txt | 4 | ||||
-rw-r--r-- | python/__init__.py | 1 | ||||
-rw-r--r-- | python/misc_utils/clock_offset_corrector_tagged.py | 81 |
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) |