diff options
author | ptrkrysik <ptrkrysik@gmail.com> | 2014-11-06 14:50:59 +0100 |
---|---|---|
committer | ptrkrysik <ptrkrysik@gmail.com> | 2014-11-06 14:50:59 +0100 |
commit | e518bbfedde679650e538edcab9bb46997985e52 (patch) | |
tree | e22645c8aa45229c2beae6b4eae4004881addc37 | |
parent | dcba50ff7043994cbcae353401d82048607a6f50 (diff) |
Added capability to receive multiple channels of a single BTS to the receiver. It is now possible to receive bursts on channels for which frequency hopping was used. Changed examples to work without hierarhical GSM Receiver block.
-rw-r--r-- | examples/receiver_file.grc | 199 | ||||
-rw-r--r-- | examples/receiver_rtlsdr.grc | 752 | ||||
-rw-r--r-- | examples/receiver_usrp.grc | 586 | ||||
-rw-r--r-- | grc/receiver/gsm_receiver.xml | 25 | ||||
-rw-r--r-- | hier_blocks/misc_utils/gsm_clock_offset_corrector.grc | 443 | ||||
-rw-r--r-- | include/gsm/receiver/receiver.h | 5 | ||||
-rw-r--r-- | lib/receiver/receiver_impl.cc | 89 | ||||
-rw-r--r-- | lib/receiver/receiver_impl.h | 18 | ||||
-rw-r--r-- | python/misc_utils/clock_offset_corrector.py | 47 |
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) |