aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--examples/receiver_file.grc199
-rw-r--r--examples/receiver_rtlsdr.grc752
-rw-r--r--examples/receiver_usrp.grc586
-rw-r--r--grc/receiver/gsm_receiver.xml25
-rw-r--r--hier_blocks/misc_utils/gsm_clock_offset_corrector.grc443
-rw-r--r--include/gsm/receiver/receiver.h5
-rw-r--r--lib/receiver/receiver_impl.cc89
-rw-r--r--lib/receiver/receiver_impl.h18
-rw-r--r--python/misc_utils/clock_offset_corrector.py47
9 files changed, 1370 insertions, 794 deletions
diff --git a/examples/receiver_file.grc b/examples/receiver_file.grc
index 8292b96..af657d8 100644
--- a/examples/receiver_file.grc
+++ b/examples/receiver_file.grc
@@ -1,6 +1,6 @@
<?xml version='1.0' encoding='ASCII'?>
<flow_graph>
- <timestamp>Wed Aug 13 19:03:06 2014</timestamp>
+ <timestamp>Thu Nov 6 14:42:26 2014</timestamp>
<block>
<key>options</key>
<param>
@@ -29,7 +29,7 @@
</param>
<param>
<key>generate_options</key>
- <value>no_gui</value>
+ <value>wx_gui</value>
</param>
<param>
<key>category</key>
@@ -143,22 +143,41 @@
</param>
</block>
<block>
- <key>gsm_clock_offset_control</key>
+ <key>gsm_message_printer</key>
<param>
<key>id</key>
- <value>gsm_clock_offset_control_0</value>
+ <value>gsm_message_printer_0</value>
</param>
<param>
<key>_enabled</key>
<value>True</value>
</param>
<param>
- <key>fc</key>
- <value>fc</value>
+ <key>alias</key>
+ <value></value>
</param>
<param>
- <key>samp_rate</key>
- <value>samp_rate</value>
+ <key>affinity</key>
+ <value></value>
+ </param>
+ <param>
+ <key>_coordinate</key>
+ <value>(1130, 196)</value>
+ </param>
+ <param>
+ <key>_rotation</key>
+ <value>0</value>
+ </param>
+ </block>
+ <block>
+ <key>gsm_control_channels_decoder</key>
+ <param>
+ <key>id</key>
+ <value>gsm_control_channels_decoder_0</value>
+ </param>
+ <param>
+ <key>_enabled</key>
+ <value>True</value>
</param>
<param>
<key>alias</key>
@@ -178,38 +197,42 @@
</param>
<param>
<key>_coordinate</key>
- <value>(330, 261)</value>
+ <value>(908, 196)</value>
</param>
<param>
<key>_rotation</key>
- <value>180</value>
+ <value>0</value>
</param>
</block>
<block>
- <key>clock_offset_corrector</key>
+ <key>blocks_socket_pdu</key>
<param>
<key>id</key>
- <value>clock_offset_corrector_0</value>
+ <value>blocks_socket_pdu_0</value>
</param>
<param>
<key>_enabled</key>
<value>True</value>
</param>
<param>
- <key>fc</key>
- <value>fc</value>
+ <key>type</key>
+ <value>"UDP_CLIENT"</value>
</param>
<param>
- <key>ppm</key>
- <value>0</value>
+ <key>host</key>
+ <value>127.0.0.1</value>
</param>
<param>
- <key>samp_rate_in</key>
- <value>1625000.0/6.0*4.0</value>
+ <key>port</key>
+ <value>4729</value>
</param>
<param>
- <key>samp_rate_out</key>
- <value>1625000.0/6.0*4.0</value>
+ <key>mtu</key>
+ <value>10000</value>
+ </param>
+ <param>
+ <key>tcp_no_delay</key>
+ <value>False</value>
</param>
<param>
<key>alias</key>
@@ -229,7 +252,7 @@
</param>
<param>
<key>_coordinate</key>
- <value>(253, 355)</value>
+ <value>(1138, 278)</value>
</param>
<param>
<key>_rotation</key>
@@ -237,16 +260,20 @@
</param>
</block>
<block>
- <key>gsm_message_printer</key>
+ <key>gsm_get_bcch_or_ccch_bursts</key>
<param>
<key>id</key>
- <value>gsm_message_printer_0</value>
+ <value>gsm_get_bcch_or_ccch_bursts_0</value>
</param>
<param>
<key>_enabled</key>
<value>True</value>
</param>
<param>
+ <key>d_fn51_start</key>
+ <value>2</value>
+ </param>
+ <param>
<key>alias</key>
<value></value>
</param>
@@ -255,8 +282,16 @@
<value></value>
</param>
<param>
+ <key>minoutbuf</key>
+ <value>0</value>
+ </param>
+ <param>
+ <key>maxoutbuf</key>
+ <value>0</value>
+ </param>
+ <param>
<key>_coordinate</key>
- <value>(1135, 366)</value>
+ <value>(637, 192)</value>
</param>
<param>
<key>_rotation</key>
@@ -264,18 +299,22 @@
</param>
</block>
<block>
- <key>gsm_get_bcch_or_ccch_bursts</key>
+ <key>gsm_clock_offset_control</key>
<param>
<key>id</key>
- <value>gsm_get_bcch_or_ccch_bursts_0</value>
+ <value>gsm_clock_offset_control_0</value>
</param>
<param>
<key>_enabled</key>
<value>True</value>
</param>
<param>
- <key>d_fn51_start</key>
- <value>2</value>
+ <key>fc</key>
+ <value>fc</value>
+ </param>
+ <param>
+ <key>samp_rate</key>
+ <value>samp_rate</value>
</param>
<param>
<key>alias</key>
@@ -295,24 +334,40 @@
</param>
<param>
<key>_coordinate</key>
- <value>(668, 362)</value>
+ <value>(261, 307)</value>
</param>
<param>
<key>_rotation</key>
- <value>0</value>
+ <value>180</value>
</param>
</block>
<block>
- <key>gsm_control_channels_decoder</key>
+ <key>gsm_receiver</key>
<param>
<key>id</key>
- <value>gsm_control_channels_decoder_0</value>
+ <value>gsm_receiver_0</value>
</param>
<param>
<key>_enabled</key>
<value>True</value>
</param>
<param>
+ <key>osr</key>
+ <value>4</value>
+ </param>
+ <param>
+ <key>cell_allocation</key>
+ <value>[0]</value>
+ </param>
+ <param>
+ <key>tseq_nums</key>
+ <value>[]</value>
+ </param>
+ <param>
+ <key>num_streams</key>
+ <value>1</value>
+ </param>
+ <param>
<key>alias</key>
<value></value>
</param>
@@ -330,7 +385,7 @@
</param>
<param>
<key>_coordinate</key>
- <value>(913, 366)</value>
+ <value>(414, 196)</value>
</param>
<param>
<key>_rotation</key>
@@ -338,26 +393,30 @@
</param>
</block>
<block>
- <key>gsm_receiver_hier</key>
+ <key>gsm_input</key>
<param>
<key>id</key>
- <value>gsm_receiver_hier_0</value>
+ <value>gsm_input_0</value>
</param>
<param>
<key>_enabled</key>
<value>True</value>
</param>
<param>
- <key>input_rate</key>
- <value>samp_rate</value>
+ <key>ppm</key>
+ <value>0</value>
+ </param>
+ <param>
+ <key>fc</key>
+ <value>fc</value>
</param>
<param>
<key>osr</key>
<value>4</value>
</param>
<param>
- <key>arfcn</key>
- <value>0</value>
+ <key>samp_rate_in</key>
+ <value>samp_rate</value>
</param>
<param>
<key>alias</key>
@@ -377,7 +436,7 @@
</param>
<param>
<key>_coordinate</key>
- <value>(465, 363)</value>
+ <value>(226, 213)</value>
</param>
<param>
<key>_rotation</key>
@@ -467,7 +526,7 @@
</param>
<param>
<key>_coordinate</key>
- <value>(23, 354)</value>
+ <value>(15, 201)</value>
</param>
<param>
<key>_rotation</key>
@@ -475,28 +534,22 @@
</param>
</block>
<connection>
- <source_block_id>clock_offset_corrector_0</source_block_id>
- <sink_block_id>gsm_receiver_hier_0</sink_block_id>
- <source_key>0</source_key>
- <sink_key>0</sink_key>
- </connection>
- <connection>
- <source_block_id>blocks_file_source_0</source_block_id>
- <sink_block_id>clock_offset_corrector_0</sink_block_id>
- <source_key>0</source_key>
- <sink_key>0</sink_key>
+ <source_block_id>gsm_receiver_0</source_block_id>
+ <sink_block_id>gsm_clock_offset_control_0</sink_block_id>
+ <source_key>measurements</source_key>
+ <sink_key>measurements</sink_key>
</connection>
<connection>
- <source_block_id>gsm_clock_offset_control_0</source_block_id>
- <sink_block_id>clock_offset_corrector_0</sink_block_id>
- <source_key>ppm</source_key>
- <sink_key>ppm_in</sink_key>
+ <source_block_id>gsm_receiver_0</source_block_id>
+ <sink_block_id>gsm_get_bcch_or_ccch_bursts_0</sink_block_id>
+ <source_key>C0</source_key>
+ <sink_key>bursts</sink_key>
</connection>
<connection>
- <source_block_id>gsm_receiver_hier_0</source_block_id>
- <sink_block_id>gsm_clock_offset_control_0</sink_block_id>
- <source_key>measurements</source_key>
- <sink_key>measurements</sink_key>
+ <source_block_id>gsm_get_bcch_or_ccch_bursts_0</source_block_id>
+ <sink_block_id>gsm_control_channels_decoder_0</sink_block_id>
+ <source_key>bursts</source_key>
+ <sink_key>bursts</sink_key>
</connection>
<connection>
<source_block_id>gsm_control_channels_decoder_0</source_block_id>
@@ -505,15 +558,27 @@
<sink_key>msgs</sink_key>
</connection>
<connection>
- <source_block_id>gsm_get_bcch_or_ccch_bursts_0</source_block_id>
- <sink_block_id>gsm_control_channels_decoder_0</sink_block_id>
- <source_key>bursts</source_key>
- <sink_key>bursts</sink_key>
+ <source_block_id>gsm_control_channels_decoder_0</source_block_id>
+ <sink_block_id>blocks_socket_pdu_0</sink_block_id>
+ <source_key>msgs</source_key>
+ <sink_key>pdus</sink_key>
</connection>
<connection>
- <source_block_id>gsm_receiver_hier_0</source_block_id>
- <sink_block_id>gsm_get_bcch_or_ccch_bursts_0</sink_block_id>
- <source_key>bursts</source_key>
- <sink_key>bursts</sink_key>
+ <source_block_id>blocks_file_source_0</source_block_id>
+ <sink_block_id>gsm_input_0</sink_block_id>
+ <source_key>0</source_key>
+ <sink_key>0</sink_key>
+ </connection>
+ <connection>
+ <source_block_id>gsm_clock_offset_control_0</source_block_id>
+ <sink_block_id>gsm_input_0</sink_block_id>
+ <source_key>ppm</source_key>
+ <sink_key>ppm_in</sink_key>
+ </connection>
+ <connection>
+ <source_block_id>gsm_input_0</source_block_id>
+ <sink_block_id>gsm_receiver_0</sink_block_id>
+ <source_key>0</source_key>
+ <sink_key>0</sink_key>
</connection>
</flow_graph>
diff --git a/examples/receiver_rtlsdr.grc b/examples/receiver_rtlsdr.grc
index fb249bb..beee92d 100644
--- a/examples/receiver_rtlsdr.grc
+++ b/examples/receiver_rtlsdr.grc
@@ -1,6 +1,6 @@
<?xml version='1.0' encoding='ASCII'?>
<flow_graph>
- <timestamp>Thu Aug 21 20:40:28 2014</timestamp>
+ <timestamp>Thu Nov 6 14:43:22 2014</timestamp>
<block>
<key>options</key>
<param>
@@ -92,117 +92,26 @@
</param>
</block>
<block>
- <key>variable_qtgui_range</key>
+ <key>gsm_message_printer</key>
<param>
<key>id</key>
- <value>g</value>
+ <value>gsm_message_printer_1</value>
</param>
<param>
<key>_enabled</key>
<value>True</value>
</param>
<param>
- <key>label</key>
- <value>gain</value>
- </param>
- <param>
- <key>value</key>
- <value>43</value>
- </param>
- <param>
- <key>start</key>
- <value>0</value>
- </param>
- <param>
- <key>stop</key>
- <value>50</value>
- </param>
- <param>
- <key>step</key>
- <value>0.5</value>
- </param>
- <param>
- <key>widget</key>
- <value>counter</value>
- </param>
- <param>
- <key>orient</key>
- <value>Qt.Horizontal</value>
- </param>
- <param>
- <key>min_len</key>
- <value>100</value>
- </param>
- <param>
- <key>gui_hint</key>
- <value></value>
- </param>
- <param>
<key>alias</key>
<value></value>
</param>
<param>
- <key>_coordinate</key>
- <value>(218, 10)</value>
- </param>
- <param>
- <key>_rotation</key>
- <value>0</value>
- </param>
- </block>
- <block>
- <key>variable_qtgui_range</key>
- <param>
- <key>id</key>
- <value>fc</value>
- </param>
- <param>
- <key>_enabled</key>
- <value>True</value>
- </param>
- <param>
- <key>label</key>
- <value>center_frequency</value>
- </param>
- <param>
- <key>value</key>
- <value>939.4e6</value>
- </param>
- <param>
- <key>start</key>
- <value>925e6</value>
- </param>
- <param>
- <key>stop</key>
- <value>960e6</value>
- </param>
- <param>
- <key>step</key>
- <value>2e5</value>
- </param>
- <param>
- <key>widget</key>
- <value>counter_slider</value>
- </param>
- <param>
- <key>orient</key>
- <value>Qt.Horizontal</value>
- </param>
- <param>
- <key>min_len</key>
- <value>100</value>
- </param>
- <param>
- <key>gui_hint</key>
- <value></value>
- </param>
- <param>
- <key>alias</key>
+ <key>affinity</key>
<value></value>
</param>
<param>
<key>_coordinate</key>
- <value>(330, 9)</value>
+ <value>(1131, 230)</value>
</param>
<param>
<key>_rotation</key>
@@ -241,7 +150,7 @@
</param>
<param>
<key>_coordinate</key>
- <value>(660, 243)</value>
+ <value>(650, 226)</value>
</param>
<param>
<key>_rotation</key>
@@ -249,37 +158,13 @@
</param>
</block>
<block>
- <key>blocks_tag_debug</key>
+ <key>gsm_control_channels_decoder</key>
<param>
<key>id</key>
- <value>blocks_tag_debug_0</value>
+ <value>gsm_control_channels_decoder_0</value>
</param>
<param>
<key>_enabled</key>
- <value>False</value>
- </param>
- <param>
- <key>type</key>
- <value>complex</value>
- </param>
- <param>
- <key>name</key>
- <value></value>
- </param>
- <param>
- <key>filter</key>
- <value>""</value>
- </param>
- <param>
- <key>num_inputs</key>
- <value>1</value>
- </param>
- <param>
- <key>vlen</key>
- <value>1</value>
- </param>
- <param>
- <key>display</key>
<value>True</value>
</param>
<param>
@@ -291,8 +176,16 @@
<value></value>
</param>
<param>
+ <key>minoutbuf</key>
+ <value>0</value>
+ </param>
+ <param>
+ <key>maxoutbuf</key>
+ <value>0</value>
+ </param>
+ <param>
<key>_coordinate</key>
- <value>(456, 477)</value>
+ <value>(910, 230)</value>
</param>
<param>
<key>_rotation</key>
@@ -300,61 +193,34 @@
</param>
</block>
<block>
- <key>gsm_receiver_hier</key>
+ <key>blocks_socket_pdu</key>
<param>
<key>id</key>
- <value>gsm_receiver_hier_0</value>
+ <value>blocks_socket_pdu_0</value>
</param>
<param>
<key>_enabled</key>
<value>True</value>
</param>
<param>
- <key>input_rate</key>
- <value>samp_rate</value>
- </param>
- <param>
- <key>osr</key>
- <value>4</value>
- </param>
- <param>
- <key>arfcn</key>
- <value>0</value>
- </param>
- <param>
- <key>alias</key>
- <value></value>
- </param>
- <param>
- <key>affinity</key>
- <value></value>
- </param>
- <param>
- <key>minoutbuf</key>
- <value>0</value>
- </param>
- <param>
- <key>maxoutbuf</key>
- <value>0</value>
+ <key>type</key>
+ <value>"UDP_CLIENT"</value>
</param>
<param>
- <key>_coordinate</key>
- <value>(455, 244)</value>
+ <key>host</key>
+ <value>127.0.0.1</value>
</param>
<param>
- <key>_rotation</key>
- <value>0</value>
+ <key>port</key>
+ <value>4729</value>
</param>
- </block>
- <block>
- <key>gsm_control_channels_decoder</key>
<param>
- <key>id</key>
- <value>gsm_control_channels_decoder_0</value>
+ <key>mtu</key>
+ <value>10000</value>
</param>
<param>
- <key>_enabled</key>
- <value>True</value>
+ <key>tcp_no_delay</key>
+ <value>False</value>
</param>
<param>
<key>alias</key>
@@ -374,7 +240,7 @@
</param>
<param>
<key>_coordinate</key>
- <value>(920, 247)</value>
+ <value>(1148, 302)</value>
</param>
<param>
<key>_rotation</key>
@@ -382,80 +248,58 @@
</param>
</block>
<block>
- <key>gsm_message_printer</key>
+ <key>variable_qtgui_range</key>
<param>
<key>id</key>
- <value>gsm_message_printer_0</value>
+ <value>ppm</value>
</param>
<param>
<key>_enabled</key>
- <value>False</value>
- </param>
- <param>
- <key>alias</key>
- <value></value>
- </param>
- <param>
- <key>affinity</key>
- <value></value>
- </param>
- <param>
- <key>_coordinate</key>
- <value>(1128, 169)</value>
- </param>
- <param>
- <key>_rotation</key>
- <value>0</value>
+ <value>True</value>
</param>
- </block>
- <block>
- <key>gsm_message_printer</key>
<param>
- <key>id</key>
- <value>gsm_message_printer_1</value>
+ <key>label</key>
+ <value>clock_correction</value>
</param>
<param>
- <key>_enabled</key>
- <value>True</value>
+ <key>value</key>
+ <value>84</value>
</param>
<param>
- <key>alias</key>
- <value></value>
+ <key>start</key>
+ <value>-100</value>
</param>
<param>
- <key>affinity</key>
- <value></value>
+ <key>stop</key>
+ <value>100</value>
</param>
<param>
- <key>_coordinate</key>
- <value>(1141, 247)</value>
+ <key>step</key>
+ <value>1</value>
</param>
<param>
- <key>_rotation</key>
- <value>0</value>
+ <key>widget</key>
+ <value>counter</value>
</param>
- </block>
- <block>
- <key>blocks_message_debug</key>
<param>
- <key>id</key>
- <value>blocks_message_debug_0</value>
+ <key>orient</key>
+ <value>Qt.Horizontal</value>
</param>
<param>
- <key>_enabled</key>
- <value>True</value>
+ <key>min_len</key>
+ <value>100</value>
</param>
<param>
- <key>alias</key>
+ <key>gui_hint</key>
<value></value>
</param>
<param>
- <key>affinity</key>
+ <key>alias</key>
<value></value>
</param>
<param>
<key>_coordinate</key>
- <value>(240, 405)</value>
+ <value>(473, 10)</value>
</param>
<param>
<key>_rotation</key>
@@ -466,7 +310,7 @@
<key>variable_qtgui_range</key>
<param>
<key>id</key>
- <value>ppm</value>
+ <value>fc</value>
</param>
<param>
<key>_enabled</key>
@@ -474,27 +318,27 @@
</param>
<param>
<key>label</key>
- <value>clock_correction</value>
+ <value>center_frequency</value>
</param>
<param>
<key>value</key>
- <value>84</value>
+ <value>939.4e6</value>
</param>
<param>
<key>start</key>
- <value>-100</value>
+ <value>925e6</value>
</param>
<param>
<key>stop</key>
- <value>100</value>
+ <value>960e6</value>
</param>
<param>
<key>step</key>
- <value>1</value>
+ <value>2e5</value>
</param>
<param>
<key>widget</key>
- <value>counter</value>
+ <value>counter_slider</value>
</param>
<param>
<key>orient</key>
@@ -514,7 +358,7 @@
</param>
<param>
<key>_coordinate</key>
- <value>(473, 10)</value>
+ <value>(330, 9)</value>
</param>
<param>
<key>_rotation</key>
@@ -522,93 +366,58 @@
</param>
</block>
<block>
- <key>gsm_clock_offset_control</key>
+ <key>variable_qtgui_range</key>
<param>
<key>id</key>
- <value>gsm_clock_offset_control_0</value>
+ <value>g</value>
</param>
<param>
<key>_enabled</key>
<value>True</value>
</param>
<param>
- <key>fc</key>
- <value>fc</value>
- </param>
- <param>
- <key>samp_rate</key>
- <value>samp_rate</value>
- </param>
- <param>
- <key>alias</key>
- <value></value>
- </param>
- <param>
- <key>affinity</key>
- <value></value>
+ <key>label</key>
+ <value>gain</value>
</param>
<param>
- <key>minoutbuf</key>
- <value>0</value>
+ <key>value</key>
+ <value>43</value>
</param>
<param>
- <key>maxoutbuf</key>
+ <key>start</key>
<value>0</value>
</param>
<param>
- <key>_coordinate</key>
- <value>(329, 155)</value>
- </param>
- <param>
- <key>_rotation</key>
- <value>180</value>
- </param>
- </block>
- <block>
- <key>clock_offset_corrector</key>
- <param>
- <key>id</key>
- <value>clock_offset_corrector_0</value>
- </param>
- <param>
- <key>_enabled</key>
- <value>True</value>
+ <key>stop</key>
+ <value>50</value>
</param>
<param>
- <key>fc</key>
- <value>fc</value>
+ <key>step</key>
+ <value>0.5</value>
</param>
<param>
- <key>ppm</key>
- <value>0</value>
+ <key>widget</key>
+ <value>counter</value>
</param>
<param>
- <key>samp_rate_in</key>
- <value>samp_rate</value>
+ <key>orient</key>
+ <value>Qt.Horizontal</value>
</param>
<param>
- <key>samp_rate_out</key>
- <value>samp_rate</value>
+ <key>min_len</key>
+ <value>100</value>
</param>
<param>
- <key>alias</key>
+ <key>gui_hint</key>
<value></value>
</param>
<param>
- <key>affinity</key>
+ <key>alias</key>
<value></value>
</param>
<param>
- <key>minoutbuf</key>
- <value>0</value>
- </param>
- <param>
- <key>maxoutbuf</key>
- <value>0</value>
- </param>
- <param>
<key>_coordinate</key>
- <value>(251, 236)</value>
+ <value>(218, 10)</value>
</param>
<param>
<key>_rotation</key>
@@ -867,10 +676,10 @@
</param>
</block>
<block>
- <key>qtgui_sink_x</key>
+ <key>qtgui_freq_sink_x</key>
<param>
<key>id</key>
- <value>qtgui_sink_x_0</value>
+ <value>qtgui_freq_sink_x_0</value>
</param>
<param>
<key>_enabled</key>
@@ -901,42 +710,347 @@
<value>samp_rate</value>
</param>
<param>
- <key>rate</key>
+ <key>grid</key>
+ <value>False</value>
+ </param>
+ <param>
+ <key>autoscale</key>
+ <value>False</value>
+ </param>
+ <param>
+ <key>average</key>
+ <value>1.0</value>
+ </param>
+ <param>
+ <key>ymin</key>
+ <value>-140</value>
+ </param>
+ <param>
+ <key>ymax</key>
<value>10</value>
</param>
<param>
- <key>showrf</key>
- <value>True</value>
+ <key>nconnections</key>
+ <value>1</value>
</param>
<param>
- <key>plotfreq</key>
- <value>True</value>
+ <key>update_time</key>
+ <value>0.10</value>
+ </param>
+ <param>
+ <key>gui_hint</key>
+ <value></value>
</param>
<param>
- <key>plotwaterfall</key>
+ <key>showports</key>
<value>True</value>
</param>
<param>
- <key>plottime</key>
+ <key>label1</key>
+ <value></value>
+ </param>
+ <param>
+ <key>width1</key>
+ <value>1</value>
+ </param>
+ <param>
+ <key>color1</key>
+ <value>"blue"</value>
+ </param>
+ <param>
+ <key>alpha1</key>
+ <value>1.0</value>
+ </param>
+ <param>
+ <key>label2</key>
+ <value></value>
+ </param>
+ <param>
+ <key>width2</key>
+ <value>1</value>
+ </param>
+ <param>
+ <key>color2</key>
+ <value>"red"</value>
+ </param>
+ <param>
+ <key>alpha2</key>
+ <value>1.0</value>
+ </param>
+ <param>
+ <key>label3</key>
+ <value></value>
+ </param>
+ <param>
+ <key>width3</key>
+ <value>1</value>
+ </param>
+ <param>
+ <key>color3</key>
+ <value>"green"</value>
+ </param>
+ <param>
+ <key>alpha3</key>
+ <value>1.0</value>
+ </param>
+ <param>
+ <key>label4</key>
+ <value></value>
+ </param>
+ <param>
+ <key>width4</key>
+ <value>1</value>
+ </param>
+ <param>
+ <key>color4</key>
+ <value>"black"</value>
+ </param>
+ <param>
+ <key>alpha4</key>
+ <value>1.0</value>
+ </param>
+ <param>
+ <key>label5</key>
+ <value></value>
+ </param>
+ <param>
+ <key>width5</key>
+ <value>1</value>
+ </param>
+ <param>
+ <key>color5</key>
+ <value>"cyan"</value>
+ </param>
+ <param>
+ <key>alpha5</key>
+ <value>1.0</value>
+ </param>
+ <param>
+ <key>label6</key>
+ <value></value>
+ </param>
+ <param>
+ <key>width6</key>
+ <value>1</value>
+ </param>
+ <param>
+ <key>color6</key>
+ <value>"magenta"</value>
+ </param>
+ <param>
+ <key>alpha6</key>
+ <value>1.0</value>
+ </param>
+ <param>
+ <key>label7</key>
+ <value></value>
+ </param>
+ <param>
+ <key>width7</key>
+ <value>1</value>
+ </param>
+ <param>
+ <key>color7</key>
+ <value>"yellow"</value>
+ </param>
+ <param>
+ <key>alpha7</key>
+ <value>1.0</value>
+ </param>
+ <param>
+ <key>label8</key>
+ <value></value>
+ </param>
+ <param>
+ <key>width8</key>
+ <value>1</value>
+ </param>
+ <param>
+ <key>color8</key>
+ <value>"dark red"</value>
+ </param>
+ <param>
+ <key>alpha8</key>
+ <value>1.0</value>
+ </param>
+ <param>
+ <key>label9</key>
+ <value></value>
+ </param>
+ <param>
+ <key>width9</key>
+ <value>1</value>
+ </param>
+ <param>
+ <key>color9</key>
+ <value>"dark green"</value>
+ </param>
+ <param>
+ <key>alpha9</key>
+ <value>1.0</value>
+ </param>
+ <param>
+ <key>label10</key>
+ <value></value>
+ </param>
+ <param>
+ <key>width10</key>
+ <value>1</value>
+ </param>
+ <param>
+ <key>color10</key>
+ <value>"dark blue"</value>
+ </param>
+ <param>
+ <key>alpha10</key>
+ <value>1.0</value>
+ </param>
+ <param>
+ <key>alias</key>
+ <value></value>
+ </param>
+ <param>
+ <key>affinity</key>
+ <value></value>
+ </param>
+ <param>
+ <key>minoutbuf</key>
+ <value>0</value>
+ </param>
+ <param>
+ <key>maxoutbuf</key>
+ <value>0</value>
+ </param>
+ <param>
+ <key>_coordinate</key>
+ <value>(245, 432)</value>
+ </param>
+ <param>
+ <key>_rotation</key>
+ <value>0</value>
+ </param>
+ </block>
+ <block>
+ <key>gsm_clock_offset_control</key>
+ <param>
+ <key>id</key>
+ <value>gsm_clock_offset_control_0</value>
+ </param>
+ <param>
+ <key>_enabled</key>
<value>True</value>
</param>
<param>
- <key>plotconst</key>
+ <key>fc</key>
+ <value>fc</value>
+ </param>
+ <param>
+ <key>samp_rate</key>
+ <value>samp_rate</value>
+ </param>
+ <param>
+ <key>alias</key>
+ <value></value>
+ </param>
+ <param>
+ <key>affinity</key>
+ <value></value>
+ </param>
+ <param>
+ <key>minoutbuf</key>
+ <value>0</value>
+ </param>
+ <param>
+ <key>maxoutbuf</key>
+ <value>0</value>
+ </param>
+ <param>
+ <key>_coordinate</key>
+ <value>(294, 341)</value>
+ </param>
+ <param>
+ <key>_rotation</key>
+ <value>180</value>
+ </param>
+ </block>
+ <block>
+ <key>gsm_receiver</key>
+ <param>
+ <key>id</key>
+ <value>gsm_receiver_0</value>
+ </param>
+ <param>
+ <key>_enabled</key>
<value>True</value>
</param>
<param>
- <key>gui_hint</key>
+ <key>osr</key>
+ <value>4</value>
+ </param>
+ <param>
+ <key>cell_allocation</key>
+ <value>[0]</value>
+ </param>
+ <param>
+ <key>tseq_nums</key>
+ <value>[]</value>
+ </param>
+ <param>
+ <key>num_streams</key>
+ <value>1</value>
+ </param>
+ <param>
+ <key>alias</key>
+ <value></value>
+ </param>
+ <param>
+ <key>affinity</key>
<value></value>
</param>
<param>
- <key>freqchangevar</key>
- <value>None</value>
+ <key>minoutbuf</key>
+ <value>0</value>
</param>
<param>
- <key>showports</key>
+ <key>maxoutbuf</key>
+ <value>0</value>
+ </param>
+ <param>
+ <key>_coordinate</key>
+ <value>(440, 230)</value>
+ </param>
+ <param>
+ <key>_rotation</key>
+ <value>0</value>
+ </param>
+ </block>
+ <block>
+ <key>gsm_input</key>
+ <param>
+ <key>id</key>
+ <value>gsm_input_0</value>
+ </param>
+ <param>
+ <key>_enabled</key>
<value>True</value>
</param>
<param>
+ <key>ppm</key>
+ <value>0</value>
+ </param>
+ <param>
+ <key>fc</key>
+ <value>fc</value>
+ </param>
+ <param>
+ <key>osr</key>
+ <value>4</value>
+ </param>
+ <param>
+ <key>samp_rate_in</key>
+ <value>samp_rate</value>
+ </param>
+ <param>
<key>alias</key>
<value></value>
</param>
@@ -954,7 +1068,7 @@
</param>
<param>
<key>_coordinate</key>
- <value>(455, 374)</value>
+ <value>(268, 247)</value>
</param>
<param>
<key>_rotation</key>
@@ -962,16 +1076,10 @@
</param>
</block>
<connection>
- <source_block_id>clock_offset_corrector_0</source_block_id>
- <sink_block_id>gsm_receiver_hier_0</sink_block_id>
- <source_key>0</source_key>
- <sink_key>0</sink_key>
- </connection>
- <connection>
- <source_block_id>rtlsdr_source_0</source_block_id>
- <sink_block_id>clock_offset_corrector_0</sink_block_id>
- <source_key>0</source_key>
- <sink_key>0</sink_key>
+ <source_block_id>gsm_control_channels_decoder_0</source_block_id>
+ <sink_block_id>gsm_message_printer_1</sink_block_id>
+ <source_key>msgs</source_key>
+ <sink_key>msgs</sink_key>
</connection>
<connection>
<source_block_id>gsm_get_bcch_or_ccch_bursts_0</source_block_id>
@@ -980,51 +1088,45 @@
<sink_key>bursts</sink_key>
</connection>
<connection>
- <source_block_id>gsm_receiver_hier_0</source_block_id>
- <sink_block_id>gsm_get_bcch_or_ccch_bursts_0</sink_block_id>
- <source_key>bursts</source_key>
- <sink_key>bursts</sink_key>
- </connection>
- <connection>
- <source_block_id>gsm_receiver_hier_0</source_block_id>
- <sink_block_id>gsm_clock_offset_control_0</sink_block_id>
- <source_key>measurements</source_key>
- <sink_key>measurements</sink_key>
- </connection>
- <connection>
<source_block_id>gsm_control_channels_decoder_0</source_block_id>
- <sink_block_id>gsm_message_printer_0</sink_block_id>
+ <sink_block_id>blocks_socket_pdu_0</sink_block_id>
<source_key>msgs</source_key>
- <sink_key>msgs</sink_key>
+ <sink_key>pdus</sink_key>
</connection>
<connection>
- <source_block_id>gsm_control_channels_decoder_0</source_block_id>
- <sink_block_id>gsm_message_printer_1</sink_block_id>
- <source_key>msgs</source_key>
- <sink_key>msgs</sink_key>
- </connection>
- <connection>
- <source_block_id>gsm_clock_offset_control_0</source_block_id>
- <sink_block_id>blocks_message_debug_0</sink_block_id>
- <source_key>ppm</source_key>
- <sink_key>print</sink_key>
+ <source_block_id>rtlsdr_source_0</source_block_id>
+ <sink_block_id>qtgui_freq_sink_x_0</sink_block_id>
+ <source_key>0</source_key>
+ <sink_key>0</sink_key>
</connection>
<connection>
<source_block_id>gsm_clock_offset_control_0</source_block_id>
- <sink_block_id>clock_offset_corrector_0</sink_block_id>
+ <sink_block_id>gsm_input_0</sink_block_id>
<source_key>ppm</source_key>
<sink_key>ppm_in</sink_key>
</connection>
<connection>
- <source_block_id>clock_offset_corrector_0</source_block_id>
- <sink_block_id>blocks_tag_debug_0</sink_block_id>
+ <source_block_id>rtlsdr_source_0</source_block_id>
+ <sink_block_id>gsm_input_0</sink_block_id>
<source_key>0</source_key>
<sink_key>0</sink_key>
</connection>
<connection>
- <source_block_id>rtlsdr_source_0</source_block_id>
- <sink_block_id>qtgui_sink_x_0</sink_block_id>
+ <source_block_id>gsm_input_0</source_block_id>
+ <sink_block_id>gsm_receiver_0</sink_block_id>
<source_key>0</source_key>
<sink_key>0</sink_key>
</connection>
+ <connection>
+ <source_block_id>gsm_receiver_0</source_block_id>
+ <sink_block_id>gsm_get_bcch_or_ccch_bursts_0</sink_block_id>
+ <source_key>C0</source_key>
+ <sink_key>bursts</sink_key>
+ </connection>
+ <connection>
+ <source_block_id>gsm_receiver_0</source_block_id>
+ <sink_block_id>gsm_clock_offset_control_0</sink_block_id>
+ <source_key>measurements</source_key>
+ <sink_key>measurements</sink_key>
+ </connection>
</flow_graph>
diff --git a/examples/receiver_usrp.grc b/examples/receiver_usrp.grc
index c6fd77a..7202f10 100644
--- a/examples/receiver_usrp.grc
+++ b/examples/receiver_usrp.grc
@@ -1,6 +1,6 @@
<?xml version='1.0' encoding='ASCII'?>
<flow_graph>
- <timestamp>Wed Aug 13 19:03:38 2014</timestamp>
+ <timestamp>Thu Nov 6 14:43:18 2014</timestamp>
<block>
<key>options</key>
<param>
@@ -29,7 +29,7 @@
</param>
<param>
<key>generate_options</key>
- <value>wx_gui</value>
+ <value>qt_gui</value>
</param>
<param>
<key>category</key>
@@ -92,10 +92,10 @@
</param>
</block>
<block>
- <key>parameter</key>
+ <key>variable_qtgui_range</key>
<param>
<key>id</key>
- <value>length</value>
+ <value>fc</value>
</param>
<param>
<key>_enabled</key>
@@ -103,18 +103,38 @@
</param>
<param>
<key>label</key>
- <value></value>
+ <value>center_frequency</value>
</param>
<param>
<key>value</key>
- <value>30</value>
+ <value>939.4e6</value>
</param>
<param>
- <key>type</key>
- <value>eng_float</value>
+ <key>start</key>
+ <value>925e6</value>
+ </param>
+ <param>
+ <key>stop</key>
+ <value>960e6</value>
+ </param>
+ <param>
+ <key>step</key>
+ <value>2e5</value>
+ </param>
+ <param>
+ <key>widget</key>
+ <value>counter_slider</value>
+ </param>
+ <param>
+ <key>orient</key>
+ <value>Qt.Horizontal</value>
</param>
<param>
- <key>short_id</key>
+ <key>min_len</key>
+ <value>100</value>
+ </param>
+ <param>
+ <key>gui_hint</key>
<value></value>
</param>
<param>
@@ -123,7 +143,7 @@
</param>
<param>
<key>_coordinate</key>
- <value>(486, 10)</value>
+ <value>(319, 11)</value>
</param>
<param>
<key>_rotation</key>
@@ -131,10 +151,10 @@
</param>
</block>
<block>
- <key>variable_slider</key>
+ <key>variable_qtgui_range</key>
<param>
<key>id</key>
- <value>g</value>
+ <value>ppm</value>
</param>
<param>
<key>_enabled</key>
@@ -142,38 +162,38 @@
</param>
<param>
<key>label</key>
- <value></value>
+ <value>clock_correction</value>
</param>
<param>
<key>value</key>
- <value>28</value>
+ <value>84</value>
</param>
<param>
- <key>min</key>
- <value>0</value>
+ <key>start</key>
+ <value>-100</value>
</param>
<param>
- <key>max</key>
- <value>50</value>
+ <key>stop</key>
+ <value>100</value>
</param>
<param>
- <key>num_steps</key>
- <value>100</value>
+ <key>step</key>
+ <value>1</value>
</param>
<param>
- <key>style</key>
- <value>wx.SL_HORIZONTAL</value>
+ <key>widget</key>
+ <value>counter</value>
</param>
<param>
- <key>converver</key>
- <value>float_converter</value>
+ <key>orient</key>
+ <value>Qt.Horizontal</value>
</param>
<param>
- <key>grid_pos</key>
- <value></value>
+ <key>min_len</key>
+ <value>100</value>
</param>
<param>
- <key>notebook</key>
+ <key>gui_hint</key>
<value></value>
</param>
<param>
@@ -182,7 +202,7 @@
</param>
<param>
<key>_coordinate</key>
- <value>(368, -1)</value>
+ <value>(462, 12)</value>
</param>
<param>
<key>_rotation</key>
@@ -190,10 +210,10 @@
</param>
</block>
<block>
- <key>variable_slider</key>
+ <key>variable_qtgui_range</key>
<param>
<key>id</key>
- <value>fc</value>
+ <value>g</value>
</param>
<param>
<key>_enabled</key>
@@ -201,38 +221,38 @@
</param>
<param>
<key>label</key>
- <value></value>
+ <value>gain</value>
</param>
<param>
<key>value</key>
- <value>937e6</value>
+ <value>30</value>
</param>
<param>
- <key>min</key>
- <value>900e6</value>
+ <key>start</key>
+ <value>0</value>
</param>
<param>
- <key>max</key>
- <value>1000e6</value>
+ <key>stop</key>
+ <value>50</value>
</param>
<param>
- <key>num_steps</key>
- <value>500</value>
+ <key>step</key>
+ <value>0.5</value>
</param>
<param>
- <key>style</key>
- <value>wx.SL_HORIZONTAL</value>
+ <key>widget</key>
+ <value>counter</value>
</param>
<param>
- <key>converver</key>
- <value>float_converter</value>
+ <key>orient</key>
+ <value>Qt.Horizontal</value>
</param>
<param>
- <key>grid_pos</key>
- <value></value>
+ <key>min_len</key>
+ <value>100</value>
</param>
<param>
- <key>notebook</key>
+ <key>gui_hint</key>
<value></value>
</param>
<param>
@@ -241,7 +261,7 @@
</param>
<param>
<key>_coordinate</key>
- <value>(236, 0)</value>
+ <value>(207, 12)</value>
</param>
<param>
<key>_rotation</key>
@@ -249,98 +269,100 @@
</param>
</block>
<block>
- <key>wxgui_fftsink2</key>
+ <key>gsm_get_bcch_or_ccch_bursts</key>
<param>
<key>id</key>
- <value>wxgui_fftsink2_0</value>
+ <value>gsm_get_bcch_or_ccch_bursts_0</value>
</param>
<param>
<key>_enabled</key>
<value>True</value>
</param>
<param>
- <key>type</key>
- <value>complex</value>
+ <key>d_fn51_start</key>
+ <value>2</value>
</param>
<param>
- <key>title</key>
- <value>FFT Plot</value>
+ <key>alias</key>
+ <value></value>
</param>
<param>
- <key>samp_rate</key>
- <value>samp_rate</value>
+ <key>affinity</key>
+ <value></value>
</param>
<param>
- <key>baseband_freq</key>
- <value>fc</value>
+ <key>minoutbuf</key>
+ <value>0</value>
</param>
<param>
- <key>y_per_div</key>
- <value>10</value>
+ <key>maxoutbuf</key>
+ <value>0</value>
</param>
<param>
- <key>y_divs</key>
- <value>10</value>
+ <key>_coordinate</key>
+ <value>(674, 268)</value>
</param>
<param>
- <key>ref_level</key>
+ <key>_rotation</key>
<value>0</value>
</param>
+ </block>
+ <block>
+ <key>gsm_message_printer</key>
<param>
- <key>ref_scale</key>
- <value>2.0</value>
+ <key>id</key>
+ <value>gsm_message_printer_0</value>
</param>
<param>
- <key>fft_size</key>
- <value>1024</value>
+ <key>_enabled</key>
+ <value>True</value>
</param>
<param>
- <key>fft_rate</key>
- <value>15</value>
+ <key>alias</key>
+ <value></value>
</param>
<param>
- <key>peak_hold</key>
- <value>False</value>
+ <key>affinity</key>
+ <value></value>
</param>
<param>
- <key>average</key>
- <value>False</value>
+ <key>_coordinate</key>
+ <value>(1160, 272)</value>
</param>
<param>
- <key>avg_alpha</key>
+ <key>_rotation</key>
<value>0</value>
</param>
+ </block>
+ <block>
+ <key>gsm_control_channels_decoder</key>
<param>
- <key>win</key>
- <value>None</value>
- </param>
- <param>
- <key>win_size</key>
- <value></value>
+ <key>id</key>
+ <value>gsm_control_channels_decoder_0</value>
</param>
<param>
- <key>grid_pos</key>
- <value>1,1,1,1</value>
+ <key>_enabled</key>
+ <value>True</value>
</param>
<param>
- <key>notebook</key>
+ <key>alias</key>
<value></value>
</param>
<param>
- <key>freqvar</key>
- <value>None</value>
+ <key>affinity</key>
+ <value></value>
</param>
<param>
- <key>alias</key>
- <value></value>
+ <key>minoutbuf</key>
+ <value>0</value>
</param>
<param>
- <key>affinity</key>
- <value></value>
+ <key>maxoutbuf</key>
+ <value>0</value>
</param>
<param>
<key>_coordinate</key>
- <value>(284, 367)</value>
+ <value>(916, 272)</value>
</param>
<param>
<key>_rotation</key>
@@ -348,26 +370,34 @@
</param>
</block>
<block>
- <key>gsm_receiver_hier</key>
+ <key>blocks_socket_pdu</key>
<param>
<key>id</key>
- <value>gsm_receiver_hier_0</value>
+ <value>blocks_socket_pdu_0</value>
</param>
<param>
<key>_enabled</key>
<value>True</value>
</param>
<param>
- <key>input_rate</key>
- <value>samp_rate</value>
+ <key>type</key>
+ <value>"UDP_CLIENT"</value>
</param>
<param>
- <key>osr</key>
- <value>4</value>
+ <key>host</key>
+ <value>127.0.0.1</value>
</param>
<param>
- <key>arfcn</key>
- <value>0</value>
+ <key>port</key>
+ <value>4729</value>
+ </param>
+ <param>
+ <key>mtu</key>
+ <value>10000</value>
+ </param>
+ <param>
+ <key>tcp_no_delay</key>
+ <value>False</value>
</param>
<param>
<key>alias</key>
@@ -387,7 +417,7 @@
</param>
<param>
<key>_coordinate</key>
- <value>(266, 269)</value>
+ <value>(1145, 343)</value>
</param>
<param>
<key>_rotation</key>
@@ -395,80 +425,234 @@
</param>
</block>
<block>
- <key>gsm_message_printer</key>
+ <key>qtgui_freq_sink_x</key>
<param>
<key>id</key>
- <value>gsm_message_printer_0</value>
+ <value>qtgui_freq_sink_x_0</value>
</param>
<param>
<key>_enabled</key>
<value>True</value>
</param>
<param>
- <key>alias</key>
+ <key>type</key>
+ <value>complex</value>
+ </param>
+ <param>
+ <key>name</key>
+ <value>""</value>
+ </param>
+ <param>
+ <key>fftsize</key>
+ <value>1024</value>
+ </param>
+ <param>
+ <key>wintype</key>
+ <value>firdes.WIN_BLACKMAN_hARRIS</value>
+ </param>
+ <param>
+ <key>fc</key>
+ <value>fc</value>
+ </param>
+ <param>
+ <key>bw</key>
+ <value>samp_rate</value>
+ </param>
+ <param>
+ <key>grid</key>
+ <value>False</value>
+ </param>
+ <param>
+ <key>autoscale</key>
+ <value>False</value>
+ </param>
+ <param>
+ <key>average</key>
+ <value>1.0</value>
+ </param>
+ <param>
+ <key>ymin</key>
+ <value>-140</value>
+ </param>
+ <param>
+ <key>ymax</key>
+ <value>10</value>
+ </param>
+ <param>
+ <key>nconnections</key>
+ <value>1</value>
+ </param>
+ <param>
+ <key>update_time</key>
+ <value>0.10</value>
+ </param>
+ <param>
+ <key>gui_hint</key>
<value></value>
</param>
<param>
- <key>affinity</key>
+ <key>showports</key>
+ <value>True</value>
+ </param>
+ <param>
+ <key>label1</key>
<value></value>
</param>
<param>
- <key>_coordinate</key>
- <value>(905, 272)</value>
+ <key>width1</key>
+ <value>1</value>
</param>
<param>
- <key>_rotation</key>
- <value>0</value>
+ <key>color1</key>
+ <value>"blue"</value>
</param>
- </block>
- <block>
- <key>gsm_control_channels_decoder</key>
<param>
- <key>id</key>
- <value>gsm_control_channels_decoder_0</value>
+ <key>alpha1</key>
+ <value>1.0</value>
</param>
<param>
- <key>_enabled</key>
- <value>True</value>
+ <key>label2</key>
+ <value></value>
</param>
<param>
- <key>alias</key>
+ <key>width2</key>
+ <value>1</value>
+ </param>
+ <param>
+ <key>color2</key>
+ <value>"red"</value>
+ </param>
+ <param>
+ <key>alpha2</key>
+ <value>1.0</value>
+ </param>
+ <param>
+ <key>label3</key>
<value></value>
</param>
<param>
- <key>affinity</key>
+ <key>width3</key>
+ <value>1</value>
+ </param>
+ <param>
+ <key>color3</key>
+ <value>"green"</value>
+ </param>
+ <param>
+ <key>alpha3</key>
+ <value>1.0</value>
+ </param>
+ <param>
+ <key>label4</key>
<value></value>
</param>
<param>
- <key>minoutbuf</key>
- <value>0</value>
+ <key>width4</key>
+ <value>1</value>
</param>
<param>
- <key>maxoutbuf</key>
- <value>0</value>
+ <key>color4</key>
+ <value>"black"</value>
</param>
<param>
- <key>_coordinate</key>
- <value>(694, 272)</value>
+ <key>alpha4</key>
+ <value>1.0</value>
</param>
<param>
- <key>_rotation</key>
- <value>0</value>
+ <key>label5</key>
+ <value></value>
</param>
- </block>
- <block>
- <key>gsm_get_bcch_or_ccch_bursts</key>
<param>
- <key>id</key>
- <value>gsm_get_bcch_or_ccch_bursts_0</value>
+ <key>width5</key>
+ <value>1</value>
</param>
<param>
- <key>_enabled</key>
- <value>True</value>
+ <key>color5</key>
+ <value>"cyan"</value>
</param>
<param>
- <key>d_fn51_start</key>
- <value>2</value>
+ <key>alpha5</key>
+ <value>1.0</value>
+ </param>
+ <param>
+ <key>label6</key>
+ <value></value>
+ </param>
+ <param>
+ <key>width6</key>
+ <value>1</value>
+ </param>
+ <param>
+ <key>color6</key>
+ <value>"magenta"</value>
+ </param>
+ <param>
+ <key>alpha6</key>
+ <value>1.0</value>
+ </param>
+ <param>
+ <key>label7</key>
+ <value></value>
+ </param>
+ <param>
+ <key>width7</key>
+ <value>1</value>
+ </param>
+ <param>
+ <key>color7</key>
+ <value>"yellow"</value>
+ </param>
+ <param>
+ <key>alpha7</key>
+ <value>1.0</value>
+ </param>
+ <param>
+ <key>label8</key>
+ <value></value>
+ </param>
+ <param>
+ <key>width8</key>
+ <value>1</value>
+ </param>
+ <param>
+ <key>color8</key>
+ <value>"dark red"</value>
+ </param>
+ <param>
+ <key>alpha8</key>
+ <value>1.0</value>
+ </param>
+ <param>
+ <key>label9</key>
+ <value></value>
+ </param>
+ <param>
+ <key>width9</key>
+ <value>1</value>
+ </param>
+ <param>
+ <key>color9</key>
+ <value>"dark green"</value>
+ </param>
+ <param>
+ <key>alpha9</key>
+ <value>1.0</value>
+ </param>
+ <param>
+ <key>label10</key>
+ <value></value>
+ </param>
+ <param>
+ <key>width10</key>
+ <value>1</value>
+ </param>
+ <param>
+ <key>color10</key>
+ <value>"dark blue"</value>
+ </param>
+ <param>
+ <key>alpha10</key>
+ <value>1.0</value>
</param>
<param>
<key>alias</key>
@@ -488,7 +672,7 @@
</param>
<param>
<key>_coordinate</key>
- <value>(452, 268)</value>
+ <value>(282, 433)</value>
</param>
<param>
<key>_rotation</key>
@@ -1182,21 +1366,117 @@
<value>0</value>
</param>
</block>
+ <block>
+ <key>gsm_receiver</key>
+ <param>
+ <key>id</key>
+ <value>gsm_receiver_0</value>
+ </param>
+ <param>
+ <key>_enabled</key>
+ <value>True</value>
+ </param>
+ <param>
+ <key>osr</key>
+ <value>4</value>
+ </param>
+ <param>
+ <key>cell_allocation</key>
+ <value>[0]</value>
+ </param>
+ <param>
+ <key>tseq_nums</key>
+ <value>[]</value>
+ </param>
+ <param>
+ <key>num_streams</key>
+ <value>1</value>
+ </param>
+ <param>
+ <key>alias</key>
+ <value></value>
+ </param>
+ <param>
+ <key>affinity</key>
+ <value></value>
+ </param>
+ <param>
+ <key>minoutbuf</key>
+ <value>0</value>
+ </param>
+ <param>
+ <key>maxoutbuf</key>
+ <value>0</value>
+ </param>
+ <param>
+ <key>_coordinate</key>
+ <value>(434, 272)</value>
+ </param>
+ <param>
+ <key>_rotation</key>
+ <value>0</value>
+ </param>
+ </block>
+ <block>
+ <key>gsm_input</key>
+ <param>
+ <key>id</key>
+ <value>gsm_input_0</value>
+ </param>
+ <param>
+ <key>_enabled</key>
+ <value>True</value>
+ </param>
+ <param>
+ <key>ppm</key>
+ <value>0</value>
+ </param>
+ <param>
+ <key>fc</key>
+ <value>fc</value>
+ </param>
+ <param>
+ <key>osr</key>
+ <value>4</value>
+ </param>
+ <param>
+ <key>samp_rate_in</key>
+ <value>samp_rate</value>
+ </param>
+ <param>
+ <key>alias</key>
+ <value></value>
+ </param>
+ <param>
+ <key>affinity</key>
+ <value></value>
+ </param>
+ <param>
+ <key>minoutbuf</key>
+ <value>0</value>
+ </param>
+ <param>
+ <key>maxoutbuf</key>
+ <value>0</value>
+ </param>
+ <param>
+ <key>_coordinate</key>
+ <value>(253, 289)</value>
+ </param>
+ <param>
+ <key>_rotation</key>
+ <value>0</value>
+ </param>
+ </block>
<connection>
<source_block_id>uhd_usrp_source_0</source_block_id>
- <sink_block_id>wxgui_fftsink2_0</sink_block_id>
- <source_key>0</source_key>
- <sink_key>0</sink_key>
- </connection>
- <connection>
- <source_block_id>uhd_usrp_source_0</source_block_id>
- <sink_block_id>gsm_receiver_hier_0</sink_block_id>
+ <sink_block_id>qtgui_freq_sink_x_0</sink_block_id>
<source_key>0</source_key>
<sink_key>0</sink_key>
</connection>
<connection>
- <source_block_id>gsm_receiver_hier_0</source_block_id>
- <sink_block_id>gsm_get_bcch_or_ccch_bursts_0</sink_block_id>
+ <source_block_id>gsm_get_bcch_or_ccch_bursts_0</source_block_id>
+ <sink_block_id>gsm_control_channels_decoder_0</sink_block_id>
<source_key>bursts</source_key>
<sink_key>bursts</sink_key>
</connection>
@@ -1207,9 +1487,27 @@
<sink_key>msgs</sink_key>
</connection>
<connection>
- <source_block_id>gsm_get_bcch_or_ccch_bursts_0</source_block_id>
- <sink_block_id>gsm_control_channels_decoder_0</sink_block_id>
- <source_key>bursts</source_key>
+ <source_block_id>gsm_control_channels_decoder_0</source_block_id>
+ <sink_block_id>blocks_socket_pdu_0</sink_block_id>
+ <source_key>msgs</source_key>
+ <sink_key>pdus</sink_key>
+ </connection>
+ <connection>
+ <source_block_id>gsm_receiver_0</source_block_id>
+ <sink_block_id>gsm_get_bcch_or_ccch_bursts_0</sink_block_id>
+ <source_key>C0</source_key>
<sink_key>bursts</sink_key>
</connection>
+ <connection>
+ <source_block_id>uhd_usrp_source_0</source_block_id>
+ <sink_block_id>gsm_input_0</sink_block_id>
+ <source_key>0</source_key>
+ <sink_key>0</sink_key>
+ </connection>
+ <connection>
+ <source_block_id>gsm_input_0</source_block_id>
+ <sink_block_id>gsm_receiver_0</sink_block_id>
+ <source_key>0</source_key>
+ <sink_key>0</sink_key>
+ </connection>
</flow_graph>
diff --git a/grc/receiver/gsm_receiver.xml b/grc/receiver/gsm_receiver.xml
index c555bf0..983f043 100644
--- a/grc/receiver/gsm_receiver.xml
+++ b/grc/receiver/gsm_receiver.xml
@@ -3,7 +3,7 @@
<name>GSM Receiver</name>
<key>gsm_receiver</key>
<import>import gsm</import>
- <make>gsm.receiver($osr, $arfcn)</make>
+ <make>gsm.receiver($osr, $cell_allocation, $tseq_nums)</make>
<param>
<name>Oversampling ratio</name>
@@ -13,10 +13,17 @@
</param>
<param>
- <name>ARFCN</name>
- <key>arfcn</key>
- <value>0</value>
- <type>int</type>
+ <name>Cell allocation</name>
+ <key>cell_allocation</key>
+ <value>[0]</value>
+ <type>float_vector</type>
+ </param>
+
+ <param>
+ <name>TSEQ numbers</name>
+ <key>tseq_nums</key>
+ <value>[]</value>
+ <type>int_vector</type>
</param>
<param>
@@ -34,12 +41,18 @@
</sink>
<source>
- <name>bursts</name>
+ <name>C0</name>
<type>message</type>
<optional>1</optional>
</source>
<source>
+ <name>CX</name>
+ <type>message</type>
+ <optional>1</optional>
+ </source>
+
+ <source>
<name>measurements</name>
<type>message</type>
<optional>1</optional>
diff --git a/hier_blocks/misc_utils/gsm_clock_offset_corrector.grc b/hier_blocks/misc_utils/gsm_clock_offset_corrector.grc
index 8621029..efc1275 100644
--- a/hier_blocks/misc_utils/gsm_clock_offset_corrector.grc
+++ b/hier_blocks/misc_utils/gsm_clock_offset_corrector.grc
@@ -1,55 +1,19 @@
<?xml version='1.0' encoding='ASCII'?>
<flow_graph>
- <timestamp>Wed Aug 13 19:09:32 2014</timestamp>
+ <timestamp>Thu Nov 6 10:22:20 2014</timestamp>
<block>
- <key>options</key>
+ <key>import</key>
<param>
<key>id</key>
- <value>clock_offset_corrector</value>
+ <value>math_imp</value>
</param>
<param>
<key>_enabled</key>
<value>True</value>
</param>
<param>
- <key>title</key>
- <value>Clock offset corrector</value>
- </param>
- <param>
- <key>author</key>
- <value>Piotr Krysik</value>
- </param>
- <param>
- <key>description</key>
- <value></value>
- </param>
- <param>
- <key>window_size</key>
- <value>1280, 1024</value>
- </param>
- <param>
- <key>generate_options</key>
- <value>hb</value>
- </param>
- <param>
- <key>category</key>
- <value>GSM</value>
- </param>
- <param>
- <key>run_options</key>
- <value>prompt</value>
- </param>
- <param>
- <key>run</key>
- <value>True</value>
- </param>
- <param>
- <key>max_nouts</key>
- <value>0</value>
- </param>
- <param>
- <key>realtime_scheduling</key>
- <value></value>
+ <key>import</key>
+ <value>import math</value>
</param>
<param>
<key>alias</key>
@@ -57,7 +21,7 @@
</param>
<param>
<key>_coordinate</key>
- <value>(10, 10)</value>
+ <value>(11, 125)</value>
</param>
<param>
<key>_rotation</key>
@@ -65,18 +29,30 @@
</param>
</block>
<block>
- <key>import</key>
+ <key>parameter</key>
<param>
<key>id</key>
- <value>math_imp</value>
+ <value>fc</value>
</param>
<param>
<key>_enabled</key>
<value>True</value>
</param>
<param>
- <key>import</key>
- <value>import math</value>
+ <key>label</key>
+ <value>fc</value>
+ </param>
+ <param>
+ <key>value</key>
+ <value>936.6e6</value>
+ </param>
+ <param>
+ <key>type</key>
+ <value>eng_float</value>
+ </param>
+ <param>
+ <key>short_id</key>
+ <value></value>
</param>
<param>
<key>alias</key>
@@ -84,7 +60,7 @@
</param>
<param>
<key>_coordinate</key>
- <value>(11, 125)</value>
+ <value>(274, 19)</value>
</param>
<param>
<key>_rotation</key>
@@ -92,46 +68,38 @@
</param>
</block>
<block>
- <key>fractional_resampler_xx</key>
+ <key>parameter</key>
<param>
<key>id</key>
- <value>fractional_resampler_xx_0</value>
+ <value>samp_rate_in</value>
</param>
<param>
<key>_enabled</key>
<value>True</value>
</param>
<param>
- <key>type</key>
- <value>complex</value>
+ <key>label</key>
+ <value>samp_rate_in</value>
</param>
<param>
- <key>phase_shift</key>
- <value>0</value>
+ <key>value</key>
+ <value>1625000.0/6.0*4.0</value>
</param>
<param>
- <key>resamp_ratio</key>
- <value>1</value>
+ <key>type</key>
+ <value>eng_float</value>
</param>
<param>
- <key>alias</key>
+ <key>short_id</key>
<value></value>
</param>
<param>
- <key>affinity</key>
+ <key>alias</key>
<value></value>
</param>
<param>
- <key>minoutbuf</key>
- <value>0</value>
- </param>
- <param>
- <key>maxoutbuf</key>
- <value>0</value>
- </param>
- <param>
<key>_coordinate</key>
- <value>(720, 303)</value>
+ <value>(368, 19)</value>
</param>
<param>
<key>_rotation</key>
@@ -139,10 +107,10 @@
</param>
</block>
<block>
- <key>pad_source</key>
+ <key>parameter</key>
<param>
<key>id</key>
- <value>pad_source_0</value>
+ <value>samp_rate_out</value>
</param>
<param>
<key>_enabled</key>
@@ -150,27 +118,27 @@
</param>
<param>
<key>label</key>
- <value>in</value>
+ <value>samp_rate_out</value>
</param>
<param>
- <key>type</key>
- <value>complex</value>
+ <key>value</key>
+ <value>1625000.0/6.0*4.0</value>
</param>
<param>
- <key>vlen</key>
- <value>1</value>
+ <key>type</key>
+ <value>eng_float</value>
</param>
<param>
- <key>num_streams</key>
- <value>1</value>
+ <key>short_id</key>
+ <value></value>
</param>
<param>
- <key>optional</key>
- <value>False</value>
+ <key>alias</key>
+ <value></value>
</param>
<param>
<key>_coordinate</key>
- <value>(14, 299)</value>
+ <value>(592, 20)</value>
</param>
<param>
<key>_rotation</key>
@@ -209,7 +177,7 @@
</param>
<param>
<key>_coordinate</key>
- <value>(1170, 333)</value>
+ <value>(1184, 333)</value>
</param>
<param>
<key>_rotation</key>
@@ -217,38 +185,46 @@
</param>
</block>
<block>
- <key>parameter</key>
+ <key>fractional_resampler_xx</key>
<param>
<key>id</key>
- <value>fc</value>
+ <value>fractional_resampler_xx_0</value>
</param>
<param>
<key>_enabled</key>
<value>True</value>
</param>
<param>
- <key>label</key>
- <value>fc</value>
+ <key>type</key>
+ <value>complex</value>
</param>
<param>
- <key>value</key>
- <value>936.6e6</value>
+ <key>phase_shift</key>
+ <value>0</value>
</param>
<param>
- <key>type</key>
- <value>eng_float</value>
+ <key>resamp_ratio</key>
+ <value>samp_rate_in/samp_rate_out</value>
</param>
<param>
- <key>short_id</key>
+ <key>alias</key>
<value></value>
</param>
<param>
- <key>alias</key>
+ <key>affinity</key>
<value></value>
</param>
<param>
+ <key>minoutbuf</key>
+ <value>0</value>
+ </param>
+ <param>
+ <key>maxoutbuf</key>
+ <value>0</value>
+ </param>
+ <param>
<key>_coordinate</key>
- <value>(274, 19)</value>
+ <value>(721, 303)</value>
</param>
<param>
<key>_rotation</key>
@@ -256,10 +232,10 @@
</param>
</block>
<block>
- <key>parameter</key>
+ <key>pad_source</key>
<param>
<key>id</key>
- <value>ppm</value>
+ <value>pad_source_0</value>
</param>
<param>
<key>_enabled</key>
@@ -267,27 +243,27 @@
</param>
<param>
<key>label</key>
- <value>ppm</value>
+ <value>in</value>
</param>
<param>
- <key>value</key>
- <value>0</value>
+ <key>type</key>
+ <value>complex</value>
</param>
<param>
- <key>type</key>
- <value>eng_float</value>
+ <key>vlen</key>
+ <value>1</value>
</param>
<param>
- <key>short_id</key>
- <value></value>
+ <key>num_streams</key>
+ <value>1</value>
</param>
<param>
- <key>alias</key>
- <value></value>
+ <key>optional</key>
+ <value>False</value>
</param>
<param>
<key>_coordinate</key>
- <value>(496, 19)</value>
+ <value>(14, 299)</value>
</param>
<param>
<key>_rotation</key>
@@ -295,38 +271,42 @@
</param>
</block>
<block>
- <key>parameter</key>
+ <key>gsm_controlled_rotator_cc</key>
<param>
<key>id</key>
- <value>samp_rate_in</value>
+ <value>gsm_controlled_rotator_cc_0</value>
</param>
<param>
<key>_enabled</key>
<value>True</value>
</param>
<param>
- <key>label</key>
- <value>samp_rate_in</value>
+ <key>phase_inc</key>
+ <value>0</value>
</param>
<param>
- <key>value</key>
- <value>1625000.0/6.0*4.0</value>
+ <key>samp_rate</key>
+ <value>samp_rate_out</value>
</param>
<param>
- <key>type</key>
- <value>eng_float</value>
+ <key>alias</key>
+ <value></value>
</param>
<param>
- <key>short_id</key>
+ <key>affinity</key>
<value></value>
</param>
<param>
- <key>alias</key>
- <value></value>
+ <key>minoutbuf</key>
+ <value>0</value>
+ </param>
+ <param>
+ <key>maxoutbuf</key>
+ <value>0</value>
</param>
<param>
<key>_coordinate</key>
- <value>(368, 19)</value>
+ <value>(968, 320)</value>
</param>
<param>
<key>_rotation</key>
@@ -334,38 +314,46 @@
</param>
</block>
<block>
- <key>pad_source</key>
+ <key>blocks_multiply_const_vxx</key>
<param>
<key>id</key>
- <value>ppm_in</value>
+ <value>blocks_multiply_const_vxx_0</value>
</param>
<param>
<key>_enabled</key>
<value>True</value>
</param>
<param>
- <key>label</key>
- <value>ppm_in</value>
+ <key>type</key>
+ <value>float</value>
</param>
<param>
- <key>type</key>
- <value>message</value>
+ <key>const</key>
+ <value>fc/samp_rate_out*(2*math.pi)/1e6</value>
</param>
<param>
<key>vlen</key>
<value>1</value>
</param>
<param>
- <key>num_streams</key>
- <value>1</value>
+ <key>alias</key>
+ <value></value>
</param>
<param>
- <key>optional</key>
- <value>True</value>
+ <key>affinity</key>
+ <value></value>
+ </param>
+ <param>
+ <key>minoutbuf</key>
+ <value>0</value>
+ </param>
+ <param>
+ <key>maxoutbuf</key>
+ <value>0</value>
</param>
<param>
<key>_coordinate</key>
- <value>(15, 217)</value>
+ <value>(435, 216)</value>
</param>
<param>
<key>_rotation</key>
@@ -373,38 +361,46 @@
</param>
</block>
<block>
- <key>parameter</key>
+ <key>fractional_resampler_xx</key>
<param>
<key>id</key>
- <value>samp_rate_out</value>
+ <value>fractional_resampler_xx_0_0</value>
</param>
<param>
<key>_enabled</key>
<value>True</value>
</param>
<param>
- <key>label</key>
- <value>samp_rate_out</value>
+ <key>type</key>
+ <value>float</value>
</param>
<param>
- <key>value</key>
- <value>1625000.0/6.0*4.0</value>
+ <key>phase_shift</key>
+ <value>0</value>
</param>
<param>
- <key>type</key>
- <value>eng_float</value>
+ <key>resamp_ratio</key>
+ <value>samp_rate_in/samp_rate_out</value>
</param>
<param>
- <key>short_id</key>
+ <key>alias</key>
<value></value>
</param>
<param>
- <key>alias</key>
+ <key>affinity</key>
<value></value>
</param>
<param>
+ <key>minoutbuf</key>
+ <value>0</value>
+ </param>
+ <param>
+ <key>maxoutbuf</key>
+ <value>0</value>
+ </param>
+ <param>
<key>_coordinate</key>
- <value>(592, 20)</value>
+ <value>(721, 220)</value>
</param>
<param>
<key>_rotation</key>
@@ -443,7 +439,7 @@
</param>
<param>
<key>_coordinate</key>
- <value>(183, 217)</value>
+ <value>(182, 216)</value>
</param>
<param>
<key>_rotation</key>
@@ -451,46 +447,77 @@
</param>
</block>
<block>
- <key>blocks_add_const_vxx</key>
+ <key>pad_source</key>
<param>
<key>id</key>
- <value>blocks_add_const_vxx_0</value>
+ <value>ppm_in</value>
</param>
<param>
<key>_enabled</key>
<value>True</value>
</param>
<param>
- <key>type</key>
- <value>float</value>
+ <key>label</key>
+ <value>ppm_in</value>
</param>
<param>
- <key>const</key>
- <value>samp_rate_in/samp_rate_out</value>
+ <key>type</key>
+ <value>message</value>
</param>
<param>
<key>vlen</key>
<value>1</value>
</param>
<param>
- <key>alias</key>
- <value></value>
+ <key>num_streams</key>
+ <value>1</value>
</param>
<param>
- <key>affinity</key>
- <value></value>
+ <key>optional</key>
+ <value>True</value>
</param>
<param>
- <key>minoutbuf</key>
+ <key>_coordinate</key>
+ <value>(13, 216)</value>
+ </param>
+ <param>
+ <key>_rotation</key>
<value>0</value>
</param>
+ </block>
+ <block>
+ <key>parameter</key>
<param>
- <key>maxoutbuf</key>
+ <key>id</key>
+ <value>ppm</value>
+ </param>
+ <param>
+ <key>_enabled</key>
+ <value>True</value>
+ </param>
+ <param>
+ <key>label</key>
+ <value>ppm</value>
+ </param>
+ <param>
+ <key>value</key>
<value>0</value>
</param>
<param>
+ <key>type</key>
+ <value>eng_float</value>
+ </param>
+ <param>
+ <key>short_id</key>
+ <value></value>
+ </param>
+ <param>
+ <key>alias</key>
+ <value></value>
+ </param>
+ <param>
<key>_coordinate</key>
- <value>(571, 333)</value>
+ <value>(496, 19)</value>
</param>
<param>
<key>_rotation</key>
@@ -537,7 +564,7 @@
</param>
<param>
<key>_coordinate</key>
- <value>(411, 333)</value>
+ <value>(410, 333)</value>
</param>
<param>
<key>_rotation</key>
@@ -545,22 +572,26 @@
</param>
</block>
<block>
- <key>gsm_controlled_rotator_cc</key>
+ <key>blocks_add_const_vxx</key>
<param>
<key>id</key>
- <value>gsm_controlled_rotator_cc_0</value>
+ <value>blocks_add_const_vxx_0</value>
</param>
<param>
<key>_enabled</key>
<value>True</value>
</param>
<param>
- <key>phase_inc</key>
- <value>0</value>
+ <key>type</key>
+ <value>float</value>
</param>
<param>
- <key>samp_rate</key>
- <value>samp_rate_out</value>
+ <key>const</key>
+ <value>samp_rate_in/samp_rate_out</value>
+ </param>
+ <param>
+ <key>vlen</key>
+ <value>1</value>
</param>
<param>
<key>alias</key>
@@ -580,7 +611,7 @@
</param>
<param>
<key>_coordinate</key>
- <value>(973, 320)</value>
+ <value>(571, 333)</value>
</param>
<param>
<key>_rotation</key>
@@ -588,46 +619,62 @@
</param>
</block>
<block>
- <key>blocks_multiply_const_vxx</key>
+ <key>options</key>
<param>
<key>id</key>
- <value>blocks_multiply_const_vxx_0</value>
+ <value>clock_offset_corrector</value>
</param>
<param>
<key>_enabled</key>
<value>True</value>
</param>
<param>
- <key>type</key>
- <value>float</value>
+ <key>title</key>
+ <value>Clock offset corrector</value>
</param>
<param>
- <key>const</key>
- <value>fc/samp_rate_out*(2*math.pi)/1e6</value>
+ <key>author</key>
+ <value>Piotr Krysik</value>
</param>
<param>
- <key>vlen</key>
- <value>1</value>
+ <key>description</key>
+ <value></value>
</param>
<param>
- <key>alias</key>
- <value></value>
+ <key>window_size</key>
+ <value>2280, 1024</value>
</param>
<param>
- <key>affinity</key>
- <value></value>
+ <key>generate_options</key>
+ <value>hb</value>
</param>
<param>
- <key>minoutbuf</key>
- <value>0</value>
+ <key>category</key>
+ <value>GSM</value>
</param>
<param>
- <key>maxoutbuf</key>
+ <key>run_options</key>
+ <value>prompt</value>
+ </param>
+ <param>
+ <key>run</key>
+ <value>True</value>
+ </param>
+ <param>
+ <key>max_nouts</key>
<value>0</value>
</param>
<param>
+ <key>realtime_scheduling</key>
+ <value></value>
+ </param>
+ <param>
+ <key>alias</key>
+ <value></value>
+ </param>
+ <param>
<key>_coordinate</key>
- <value>(724, 216)</value>
+ <value>(10, 10)</value>
</param>
<param>
<key>_rotation</key>
@@ -635,22 +682,34 @@
</param>
</block>
<connection>
- <source_block_id>blocks_add_const_vxx_0</source_block_id>
+ <source_block_id>ppm_in</source_block_id>
+ <sink_block_id>gsm_controlled_const_source_f_0</sink_block_id>
+ <source_key>0</source_key>
+ <sink_key>constant_msg</sink_key>
+ </connection>
+ <connection>
+ <source_block_id>gsm_controlled_const_source_f_0</source_block_id>
+ <sink_block_id>blocks_multiply_const_vxx_0</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>fractional_resampler_xx_0</sink_block_id>
<source_key>0</source_key>
- <sink_key>1</sink_key>
+ <sink_key>0</sink_key>
</connection>
<connection>
<source_block_id>blocks_multiply_const_vxx_0</source_block_id>
- <sink_block_id>gsm_controlled_rotator_cc_0</sink_block_id>
+ <sink_block_id>fractional_resampler_xx_0_0</sink_block_id>
<source_key>0</source_key>
- <sink_key>1</sink_key>
+ <sink_key>0</sink_key>
</connection>
<connection>
- <source_block_id>fractional_resampler_xx_0</source_block_id>
- <sink_block_id>gsm_controlled_rotator_cc_0</sink_block_id>
+ <source_block_id>blocks_add_const_vxx_0</source_block_id>
+ <sink_block_id>fractional_resampler_xx_0_0</sink_block_id>
<source_key>0</source_key>
- <sink_key>0</sink_key>
+ <sink_key>1</sink_key>
</connection>
<connection>
<source_block_id>gsm_controlled_rotator_cc_0</source_block_id>
@@ -659,16 +718,16 @@
<sink_key>0</sink_key>
</connection>
<connection>
- <source_block_id>pad_source_0</source_block_id>
- <sink_block_id>fractional_resampler_xx_0</sink_block_id>
+ <source_block_id>fractional_resampler_xx_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>blocks_multiply_const_vxx_0_0</source_block_id>
- <sink_block_id>blocks_add_const_vxx_0</sink_block_id>
+ <source_block_id>blocks_add_const_vxx_0</source_block_id>
+ <sink_block_id>fractional_resampler_xx_0</sink_block_id>
<source_key>0</source_key>
- <sink_key>0</sink_key>
+ <sink_key>1</sink_key>
</connection>
<connection>
<source_block_id>gsm_controlled_const_source_f_0</source_block_id>
@@ -677,15 +736,15 @@
<sink_key>0</sink_key>
</connection>
<connection>
- <source_block_id>ppm_in</source_block_id>
- <sink_block_id>gsm_controlled_const_source_f_0</sink_block_id>
+ <source_block_id>blocks_multiply_const_vxx_0_0</source_block_id>
+ <sink_block_id>blocks_add_const_vxx_0</sink_block_id>
<source_key>0</source_key>
- <sink_key>constant_msg</sink_key>
+ <sink_key>0</sink_key>
</connection>
<connection>
- <source_block_id>gsm_controlled_const_source_f_0</source_block_id>
- <sink_block_id>blocks_multiply_const_vxx_0</sink_block_id>
+ <source_block_id>fractional_resampler_xx_0_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>
+ <sink_key>1</sink_key>
</connection>
</flow_graph>
diff --git a/include/gsm/receiver/receiver.h b/include/gsm/receiver/receiver.h
index bf4580c..d2744e4 100644
--- a/include/gsm/receiver/receiver.h
+++ b/include/gsm/receiver/receiver.h
@@ -48,9 +48,10 @@ namespace gr {
* class. gsm::receiver::make is the public interface for
* creating new instances.
*/
- static sptr make(int osr, int arfcn);
+ static sptr make(int osr, const std::vector<float> &cell_allocation, const std::vector<int> &seq_nums);
- virtual void set_arfcn(int arfcn) = 0;
+ virtual void set_cell_allocation(const std::vector<float> &cell_allocation) = 0;
+ virtual void set_tseq_nums(const std::vector<int> & tseq_nums) = 0;
virtual void reset() = 0;
};
diff --git a/lib/receiver/receiver_impl.cc b/lib/receiver/receiver_impl.cc
index 77d41a4..bc1c2e4 100644
--- a/lib/receiver/receiver_impl.cc
+++ b/lib/receiver/receiver_impl.cc
@@ -55,16 +55,16 @@ typedef std::vector<float> vector_float;
typedef boost::circular_buffer<float> circular_buffer_float;
receiver::sptr
-receiver::make(int osr, int arfcn)
+receiver::make(int osr, const std::vector<float> &cell_allocation, const std::vector<int> &tseq_nums)
{
return gnuradio::get_initial_sptr
- (new receiver_impl(osr, arfcn));
+ (new receiver_impl(osr, cell_allocation, tseq_nums));
}
/*
* The private constructor
*/
-receiver_impl::receiver_impl(int osr, int arfcn)
+receiver_impl::receiver_impl(int osr, const std::vector<float> &cell_allocation, const std::vector<int> &tseq_nums)
: gr::sync_block("receiver",
gr::io_signature::make(1, -1, sizeof(gr_complex)),
gr::io_signature::make(0, 0, 0)),
@@ -76,8 +76,9 @@ receiver_impl::receiver_impl(int osr, int arfcn)
d_state(fcch_search),
d_burst_nr(osr),
d_failed_sch(0),
- d_arfcn((int)(arfcn)),
- d_signal_dbm(-120)
+ d_signal_dbm(-120),
+ d_tseq_nums(tseq_nums),
+ d_cell_allocation(cell_allocation)
{
int i;
//don't send samples to the receiver until there are at least samples for one
@@ -89,7 +90,8 @@ receiver_impl::receiver_impl(int osr, int arfcn)
//if first bit of the seqeunce ==1 first symbol ==-1
gmsk_mapper(train_seq[i], N_TRAIN_BITS, d_norm_training_seq[i], startpoint);
}
- message_port_register_out(pmt::mp("bursts"));
+ message_port_register_out(pmt::mp("C0"));
+ message_port_register_out(pmt::mp("CX"));
message_port_register_out(pmt::mp("measurements"));
configure_receiver(); //configure the receiver - tell it where to find which burst type
}
@@ -193,7 +195,7 @@ receiver_impl::work(int noutput_items,
burst_type b_type;
- for(int input_nr=0;input_nr<input_items.size();input_nr++)
+ for(int input_nr=0; input_nr<d_cell_allocation.size(); input_nr++)
{
double signal_pwr = 0;
input = (gr_complex *)input_items[input_nr];
@@ -225,7 +227,7 @@ receiver_impl::work(int noutput_items,
const unsigned last_sample = first_sample + USEFUL_BITS * d_OSR - TAIL_BITS * d_OSR;
double freq_offset_tmp = compute_freq_offset(input, first_sample, last_sample); //extract frequency offset from it
- send_burst(d_burst_nr, fc_fb, b_type);
+ send_burst(d_burst_nr, fc_fb, b_type, input_nr);
pmt::pmt_t msg = pmt::make_tuple(pmt::mp("freq_offset"),pmt::from_double(freq_offset_tmp-d_freq_offset_setting),pmt::mp("synchronized"));
message_port_pub(pmt::mp("measurements"), msg);
@@ -237,7 +239,7 @@ receiver_impl::work(int noutput_items,
d_c0_burst_start = get_sch_chan_imp_resp(input, &channel_imp_resp[0]); //get channel impulse response
detect_burst(input, &channel_imp_resp[0], d_c0_burst_start, output_binary); //MLSE detection of bits
- send_burst(d_burst_nr, output_binary, b_type);
+ send_burst(d_burst_nr, output_binary, b_type, input_nr);
if (decode_sch(&output_binary[3], &t1, &t2, &t3, &d_ncc, &d_bcc) == 0) //and decode SCH data
{
// d_burst_nr.set(t1, t2, t3, 0); //but only to check if burst_start value is correct
@@ -263,7 +265,7 @@ receiver_impl::work(int noutput_items,
float normal_corr_max; //if it's normal burst
d_c0_burst_start = get_norm_chan_imp_resp(input, &channel_imp_resp[0], &normal_corr_max, d_bcc); //get channel impulse response for given training sequence number - d_bcc
detect_burst(input, &channel_imp_resp[0], d_c0_burst_start, output_binary); //MLSE detection of bits
- send_burst(d_burst_nr, output_binary, b_type);
+ send_burst(d_burst_nr, output_binary, b_type, input_nr);
break;
}
case dummy_or_normal:
@@ -278,19 +280,19 @@ receiver_impl::work(int noutput_items,
{
d_c0_burst_start = normal_burst_start;
detect_burst(input, &channel_imp_resp[0], normal_burst_start, output_binary);
- send_burst(d_burst_nr, output_binary, b_type);
+ send_burst(d_burst_nr, output_binary, b_type, input_nr);
}
else
{
d_c0_burst_start = dummy_burst_start;
- send_burst(d_burst_nr, dummy_burst, b_type);
+ send_burst(d_burst_nr, dummy_burst, b_type, input_nr);
}
break;
}
case rach_burst:
break;
case dummy:
- send_burst(d_burst_nr, dummy_burst, b_type);
+ send_burst(d_burst_nr, dummy_burst, b_type, input_nr);
break;
case normal_or_noise:
{
@@ -301,19 +303,34 @@ receiver_impl::work(int noutput_items,
std::vector<gr_complex> v(input, input + noutput_items);
if(d_signal_dbm>=d_c0_signal_dbm-13)
{
- plot(v);
-
- burst_start = get_norm_chan_imp_resp(input, &channel_imp_resp[0], &normal_corr_max, 7);
-// if(abs(d_c0_burst_start-burst_start)<=2){
+ if(d_tseq_nums.size()==0) //there is no information about training sequence
+ { //however the receiver can detect it
+ get_norm_chan_imp_resp(input, &channel_imp_resp[0], &normal_corr_max, 0);
+ float ts_max=normal_corr_max; //with use of a very simple algorithm based on finding
+ int ts_max_num=0; //maximum correlation
+ for(int ss=1; ss<=7; ss++)
+ {
+ get_norm_chan_imp_resp(input, &channel_imp_resp[0], &normal_corr_max, ss);
+ if(ts_max<normal_corr_max)
+ {
+ ts_max = normal_corr_max;
+ ts_max_num = ss;
+ }
+ }
+ d_tseq_nums.push_back(ts_max_num);
+ }
+ int tseq_num;
+ if(input_nr<=d_tseq_nums.size()){
+ tseq_num = d_tseq_nums[input_nr-1];
+ } else {
+ tseq_num = d_tseq_nums.back();
+ }
+ burst_start = get_norm_chan_imp_resp(input, &channel_imp_resp[0], &normal_corr_max, tseq_num);
+// if(abs(d_c0_burst_start-burst_start)<=2){ //unused check/filter based on timing
if((normal_corr_max/sqrt(signal_pwr))>=0.9){
- std::cout << static_cast<int>(d_signal_dbm) << std::endl;
- COUT("d_c0_burst_start: " << d_c0_burst_start);
- COUT("burst_start: " << burst_start);
- std::cout << "corr max to signal ratio: " << (normal_corr_max/sqrt(signal_pwr)) << std::endl;
- usleep(4e6);
+ detect_burst(input, &channel_imp_resp[0], burst_start, output_binary);
+ send_burst(d_burst_nr, output_binary, b_type, input_nr);
}
- detect_burst(input, &channel_imp_resp[0], burst_start, output_binary);
- send_burst(d_burst_nr, output_binary, b_type);
}
break;
}
@@ -622,7 +639,6 @@ int receiver_impl::get_sch_chan_imp_resp(const gr_complex *input, gr_complex * c
}
-
void receiver_impl::detect_burst(const gr_complex * input, gr_complex * chan_imp_resp, int burst_start, unsigned char * output_binary)
{
float output[BURST_SIZE];
@@ -743,7 +759,7 @@ int receiver_impl::get_norm_chan_imp_resp(const gr_complex *input, gr_complex *
correlation_buffer.push_back(correlation);
power_buffer.push_back(std::pow(abs(correlation), 2));
}
- //plot(power_buffer);
+// plot(power_buffer);
//compute window energies
vector_float::iterator iter = power_buffer.begin();
bool loop_end = false;
@@ -788,7 +804,7 @@ int receiver_impl::get_norm_chan_imp_resp(const gr_complex *input, gr_complex *
// d_channel_imp_resp.push_back(correlation);
chan_imp_resp[ii] = correlation;
}
-
+
*corr_max = max_correlation;
//DCOUT("strongest_window_nr_new: " << strongest_window_nr);
@@ -799,7 +815,7 @@ int receiver_impl::get_norm_chan_imp_resp(const gr_complex *input, gr_complex *
}
-void receiver_impl::send_burst(burst_counter burst_nr, const unsigned char * burst_binary, burst_type b_type)
+void receiver_impl::send_burst(burst_counter burst_nr, const unsigned char * burst_binary, burst_type b_type, unsigned int input_nr)
{
boost::scoped_ptr<gsmtap_hdr> tap_header(new gsmtap_hdr());
@@ -809,13 +825,17 @@ void receiver_impl::send_burst(burst_counter burst_nr, const unsigned char * bur
tap_header->timeslot = static_cast<uint8_t>(d_burst_nr.get_timeslot_nr());
tap_header->frame_number = d_burst_nr.get_frame_nr();
tap_header->sub_type = static_cast<uint8_t>(b_type);
- tap_header->arfcn = d_arfcn;
+ tap_header->arfcn = d_cell_allocation[input_nr];
tap_header->signal_dbm = static_cast<int8_t>(d_signal_dbm);
pmt::pmt_t header_blob=pmt::make_blob(tap_header.get(),sizeof(gsmtap_hdr));
pmt::pmt_t burst_binary_blob=pmt::make_blob(burst_binary,BURST_SIZE);
pmt::pmt_t msg = pmt::cons(header_blob, burst_binary_blob);
- message_port_pub(pmt::mp("bursts"), msg);
+ if(input_nr==0){
+ message_port_pub(pmt::mp("C0"), msg);
+ } else {
+ message_port_pub(pmt::mp("CX"), msg);
+ }
}
void receiver_impl::configure_receiver()
@@ -843,9 +863,14 @@ void receiver_impl::configure_receiver()
d_channel_conf.set_burst_types(TIMESLOT7, TEST51, sizeof(TEST51) / sizeof(unsigned), dummy_or_normal);
}
-void receiver_impl::set_arfcn(int arfcn) //!!
+void receiver_impl::set_cell_allocation(const std::vector<float> &cell_allocation)
+{
+ d_cell_allocation = cell_allocation;
+}
+
+void receiver_impl::set_tseq_nums(const std::vector<int> & tseq_nums)
{
- d_arfcn = arfcn;
+ d_tseq_nums = tseq_nums;
}
void receiver_impl::reset()
diff --git a/lib/receiver/receiver_impl.h b/lib/receiver/receiver_impl.h
index 08a2c44..22d92ab 100644
--- a/lib/receiver/receiver_impl.h
+++ b/lib/receiver/receiver_impl.h
@@ -40,8 +40,9 @@ namespace gr {
//@{
const int d_OSR; ///< oversampling ratio
const int d_chan_imp_length; ///< channel impulse length
- uint16_t d_arfcn;
float d_signal_dbm;
+ std::vector<int> d_tseq_nums; ///< stores training sequence numbers for channels different than C0
+ std::vector<float> d_cell_allocation; ///< stores cell allocation - absolute rf channel numbers (ARFCNs) assigned to the given cell. The variable should at least contain C0 channel number.
//@}
gr_complex d_sch_training_seq[N_SYNC_BITS]; ///<encoded training sequence of a SCH burst
@@ -82,7 +83,7 @@ namespace gr {
burst_counter d_burst_nr; ///< frame number and timeslot number
channel_configuration d_channel_conf; ///< mapping of burst_counter to burst_type
//@}
-
+
unsigned d_failed_sch; ///< number of subsequent erroneous SCH bursts
/** Function whis is used to search a FCCH burst and to compute frequency offset before
@@ -184,23 +185,28 @@ namespace gr {
int get_norm_chan_imp_resp(const gr_complex *input, gr_complex * chan_imp_resp, float *corr_max, int bcc);
/**
+ * Sends burst through a C0 (for burst from C0 channel) or Cx (for other bursts) message port
*
+ * @param burst_nr - frame number of the burst
+ * @param burst_binary - content of the burst
+ * @b_type - type of the burst
*/
- void send_burst(burst_counter burst_nr, const unsigned char * burst_binary, burst_type b_type);
+ void send_burst(burst_counter burst_nr, const unsigned char * burst_binary, burst_type b_type, unsigned int input_nr);
/**
- *
+ * Configures burst types in different channels
*/
void configure_receiver();
public:
- receiver_impl(int osr, int arfcn);
+ receiver_impl(int osr, const std::vector<float> &cell_allocation, const std::vector<int> &tseq_nums);
~receiver_impl();
int work(int noutput_items, gr_vector_const_void_star &input_items, gr_vector_void_star &output_items);
- virtual void set_arfcn(int arfcn);
+ virtual void set_cell_allocation(const std::vector<float> &cell_allocation);
+ virtual void set_tseq_nums(const std::vector<int> & tseq_nums);
virtual void reset();
};
} // namespace gsm
diff --git a/python/misc_utils/clock_offset_corrector.py b/python/misc_utils/clock_offset_corrector.py
index 807e6cc..0633ae5 100644
--- a/python/misc_utils/clock_offset_corrector.py
+++ b/python/misc_utils/clock_offset_corrector.py
@@ -3,7 +3,7 @@
# Gnuradio Python Flow Graph
# Title: Clock offset corrector
# Author: Piotr Krysik
-# Generated: Wed Aug 13 16:43:12 2014
+# Generated: Thu Nov 6 10:22:24 2014
##################################################
from gnuradio import blocks
@@ -15,7 +15,7 @@ import math
class clock_offset_corrector(gr.hier_block2):
- 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):
+ def __init__(self, fc=936.6e6, samp_rate_in=1625000.0/6.0*4.0, samp_rate_out=1625000.0/6.0*4.0, ppm=0):
gr.hier_block2.__init__(
self, "Clock offset corrector",
gr.io_signature(1, 1, gr.sizeof_gr_complex*1),
@@ -26,9 +26,9 @@ class clock_offset_corrector(gr.hier_block2):
# Parameters
##################################################
self.fc = fc
- self.ppm = ppm
self.samp_rate_in = samp_rate_in
self.samp_rate_out = samp_rate_out
+ self.ppm = ppm
##################################################
# Blocks
@@ -36,7 +36,8 @@ class clock_offset_corrector(gr.hier_block2):
self.ppm_in = None;self.message_port_register_hier_out("ppm_in")
self.gsm_controlled_rotator_cc_0 = gsm.controlled_rotator_cc(0,samp_rate_out)
self.gsm_controlled_const_source_f_0 = gsm.controlled_const_source_f(ppm)
- self.fractional_resampler_xx_0 = filter.fractional_resampler_cc(0, 1)
+ self.fractional_resampler_xx_0_0 = filter.fractional_resampler_ff(0, samp_rate_in/samp_rate_out)
+ self.fractional_resampler_xx_0 = filter.fractional_resampler_cc(0, samp_rate_in/samp_rate_out)
self.blocks_multiply_const_vxx_0_0 = blocks.multiply_const_vff((1.0e-6*samp_rate_in/samp_rate_out, ))
self.blocks_multiply_const_vxx_0 = blocks.multiply_const_vff((fc/samp_rate_out*(2*math.pi)/1e6, ))
self.blocks_add_const_vxx_0 = blocks.add_const_vff((samp_rate_in/samp_rate_out, ))
@@ -44,14 +45,16 @@ class clock_offset_corrector(gr.hier_block2):
##################################################
# Connections
##################################################
- self.connect((self.blocks_add_const_vxx_0, 0), (self.fractional_resampler_xx_0, 1))
- self.connect((self.blocks_multiply_const_vxx_0, 0), (self.gsm_controlled_rotator_cc_0, 1))
- self.connect((self.fractional_resampler_xx_0, 0), (self.gsm_controlled_rotator_cc_0, 0))
- self.connect((self.gsm_controlled_rotator_cc_0, 0), (self, 0))
+ self.connect((self.gsm_controlled_const_source_f_0, 0), (self.blocks_multiply_const_vxx_0, 0))
self.connect((self, 0), (self.fractional_resampler_xx_0, 0))
- self.connect((self.blocks_multiply_const_vxx_0_0, 0), (self.blocks_add_const_vxx_0, 0))
+ self.connect((self.blocks_multiply_const_vxx_0, 0), (self.fractional_resampler_xx_0_0, 0))
+ self.connect((self.blocks_add_const_vxx_0, 0), (self.fractional_resampler_xx_0_0, 1))
+ self.connect((self.gsm_controlled_rotator_cc_0, 0), (self, 0))
+ self.connect((self.fractional_resampler_xx_0, 0), (self.gsm_controlled_rotator_cc_0, 0))
+ self.connect((self.blocks_add_const_vxx_0, 0), (self.fractional_resampler_xx_0, 1))
self.connect((self.gsm_controlled_const_source_f_0, 0), (self.blocks_multiply_const_vxx_0_0, 0))
- self.connect((self.gsm_controlled_const_source_f_0, 0), (self.blocks_multiply_const_vxx_0, 0))
+ self.connect((self.blocks_multiply_const_vxx_0_0, 0), (self.blocks_add_const_vxx_0, 0))
+ self.connect((self.fractional_resampler_xx_0_0, 0), (self.gsm_controlled_rotator_cc_0, 1))
##################################################
# Asynch Message Connections
@@ -66,28 +69,32 @@ class clock_offset_corrector(gr.hier_block2):
self.fc = fc
self.blocks_multiply_const_vxx_0.set_k((self.fc/self.samp_rate_out*(2*math.pi)/1e6, ))
- def get_ppm(self):
- return self.ppm
-
- def set_ppm(self, ppm):
- self.ppm = ppm
- self.gsm_controlled_const_source_f_0.set_constant(self.ppm)
-
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.blocks_add_const_vxx_0.set_k((self.samp_rate_in/self.samp_rate_out, ))
+ self.fractional_resampler_xx_0.set_resamp_ratio(self.samp_rate_in/self.samp_rate_out)
+ self.fractional_resampler_xx_0_0.set_resamp_ratio(self.samp_rate_in/self.samp_rate_out)
self.blocks_multiply_const_vxx_0_0.set_k((1.0e-6*self.samp_rate_in/self.samp_rate_out, ))
+ self.blocks_add_const_vxx_0.set_k((self.samp_rate_in/self.samp_rate_out, ))
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.fractional_resampler_xx_0.set_resamp_ratio(self.samp_rate_in/self.samp_rate_out)
+ self.gsm_controlled_rotator_cc_0.set_samp_rate(self.samp_rate_out)
self.blocks_multiply_const_vxx_0.set_k((self.fc/self.samp_rate_out*(2*math.pi)/1e6, ))
- self.blocks_add_const_vxx_0.set_k((self.samp_rate_in/self.samp_rate_out, ))
+ self.fractional_resampler_xx_0_0.set_resamp_ratio(self.samp_rate_in/self.samp_rate_out)
self.blocks_multiply_const_vxx_0_0.set_k((1.0e-6*self.samp_rate_in/self.samp_rate_out, ))
- self.gsm_controlled_rotator_cc_0.set_samp_rate(self.samp_rate_out)
+ self.blocks_add_const_vxx_0.set_k((self.samp_rate_in/self.samp_rate_out, ))
+
+ def get_ppm(self):
+ return self.ppm
+
+ def set_ppm(self, ppm):
+ self.ppm = ppm
+ self.gsm_controlled_const_source_f_0.set_constant(self.ppm)