Improved Morse decoding

The AGC block in the Morse decoding flowgraph is placed now at the
proper position. The output of the matched filter produces now a clear
and distinguishable signal during the presence of a pulse. This makes
the work for the signal to symbol decoder more easy.
This commit is contained in:
Manolis Surligas 2016-01-30 21:37:36 +02:00
parent f8b847077e
commit 1e210087f3
8 changed files with 929 additions and 186 deletions

View File

@ -97,7 +97,7 @@
</param>
<param>
<key>_coordinate</key>
<value>(136, 120)</value>
<value>(216, 25)</value>
</param>
<param>
<key>gui_hint</key>
@ -171,6 +171,96 @@
<value>8000</value>
</param>
</block>
<block>
<key>variable_qtgui_range</key>
<param>
<key>comment</key>
<value></value>
</param>
<param>
<key>value</key>
<value>0</value>
</param>
<param>
<key>_enabled</key>
<value>True</value>
</param>
<param>
<key>_coordinate</key>
<value>(392, 49)</value>
</param>
<param>
<key>gui_hint</key>
<value></value>
</param>
<param>
<key>_rotation</key>
<value>0</value>
</param>
<param>
<key>id</key>
<value>switch</value>
</param>
<param>
<key>label</key>
<value>Switch</value>
</param>
<param>
<key>min_len</key>
<value>200</value>
</param>
<param>
<key>orient</key>
<value>Qt.Horizontal</value>
</param>
<param>
<key>start</key>
<value>0</value>
</param>
<param>
<key>step</key>
<value>1</value>
</param>
<param>
<key>stop</key>
<value>1</value>
</param>
<param>
<key>rangeType</key>
<value>float</value>
</param>
<param>
<key>widget</key>
<value>counter_slider</value>
</param>
</block>
<block>
<key>variable</key>
<param>
<key>comment</key>
<value></value>
</param>
<param>
<key>_enabled</key>
<value>True</value>
</param>
<param>
<key>_coordinate</key>
<value>(16, 237)</value>
</param>
<param>
<key>_rotation</key>
<value>0</value>
</param>
<param>
<key>id</key>
<value>taps</value>
</param>
<param>
<key>value</key>
<value>12</value>
</param>
</block>
<block>
<key>analog_agc2_xx</key>
<param>
@ -199,7 +289,7 @@
</param>
<param>
<key>_coordinate</key>
<value>(672, 320)</value>
<value>(584, 368)</value>
</param>
<param>
<key>_rotation</key>
@ -211,7 +301,7 @@
</param>
<param>
<key>id</key>
<value>analog_agc2_xx_0</value>
<value>analog_agc2_xx_0_0</value>
</param>
<param>
<key>max_gain</key>
@ -293,53 +383,6 @@
<value>8192</value>
</param>
</block>
<block>
<key>audio_sink</key>
<param>
<key>alias</key>
<value></value>
</param>
<param>
<key>comment</key>
<value></value>
</param>
<param>
<key>affinity</key>
<value></value>
</param>
<param>
<key>device_name</key>
<value></value>
</param>
<param>
<key>_enabled</key>
<value>1</value>
</param>
<param>
<key>_coordinate</key>
<value>(1032, 348)</value>
</param>
<param>
<key>_rotation</key>
<value>0</value>
</param>
<param>
<key>id</key>
<value>audio_sink_0</value>
</param>
<param>
<key>num_inputs</key>
<value>1</value>
</param>
<param>
<key>ok_to_block</key>
<value>True</value>
</param>
<param>
<key>samp_rate</key>
<value>samp_rate</value>
</param>
</block>
<block>
<key>blocks_add_xx</key>
<param>
@ -391,6 +434,57 @@
<value>1</value>
</param>
</block>
<block>
<key>blocks_file_sink</key>
<param>
<key>append</key>
<value>False</value>
</param>
<param>
<key>alias</key>
<value></value>
</param>
<param>
<key>comment</key>
<value></value>
</param>
<param>
<key>affinity</key>
<value></value>
</param>
<param>
<key>_enabled</key>
<value>True</value>
</param>
<param>
<key>file</key>
<value>/home/surligas/test.dat</value>
</param>
<param>
<key>_coordinate</key>
<value>(1104, 296)</value>
</param>
<param>
<key>_rotation</key>
<value>0</value>
</param>
<param>
<key>id</key>
<value>blocks_file_sink_0</value>
</param>
<param>
<key>type</key>
<value>float</value>
</param>
<param>
<key>unbuffered</key>
<value>False</value>
</param>
<param>
<key>vlen</key>
<value>1</value>
</param>
</block>
<block>
<key>blocks_moving_average_xx</key>
<param>
@ -411,7 +505,7 @@
</param>
<param>
<key>_coordinate</key>
<value>(728, 134)</value>
<value>(880, 158)</value>
</param>
<param>
<key>_rotation</key>
@ -423,7 +517,7 @@
</param>
<param>
<key>length</key>
<value>8</value>
<value>taps</value>
</param>
<param>
<key>max_iter</key>
@ -470,7 +564,7 @@
</param>
<param>
<key>_coordinate</key>
<value>(344, 276)</value>
<value>(216, 276)</value>
</param>
<param>
<key>_rotation</key>
@ -497,6 +591,108 @@
<value>1</value>
</param>
</block>
<block>
<key>blocks_multiply_const_vxx</key>
<param>
<key>alias</key>
<value></value>
</param>
<param>
<key>comment</key>
<value></value>
</param>
<param>
<key>const</key>
<value>const</value>
</param>
<param>
<key>affinity</key>
<value></value>
</param>
<param>
<key>_enabled</key>
<value>True</value>
</param>
<param>
<key>_coordinate</key>
<value>(416, 396)</value>
</param>
<param>
<key>_rotation</key>
<value>0</value>
</param>
<param>
<key>id</key>
<value>blocks_multiply_const_vxx_0_0</value>
</param>
<param>
<key>type</key>
<value>float</value>
</param>
<param>
<key>maxoutbuf</key>
<value>0</value>
</param>
<param>
<key>minoutbuf</key>
<value>0</value>
</param>
<param>
<key>vlen</key>
<value>1</value>
</param>
</block>
<block>
<key>blocks_multiply_const_vxx</key>
<param>
<key>alias</key>
<value></value>
</param>
<param>
<key>comment</key>
<value></value>
</param>
<param>
<key>const</key>
<value>switch</value>
</param>
<param>
<key>affinity</key>
<value></value>
</param>
<param>
<key>_enabled</key>
<value>2</value>
</param>
<param>
<key>_coordinate</key>
<value>(872, 340)</value>
</param>
<param>
<key>_rotation</key>
<value>180</value>
</param>
<param>
<key>id</key>
<value>blocks_multiply_const_vxx_1</value>
</param>
<param>
<key>type</key>
<value>float</value>
</param>
<param>
<key>maxoutbuf</key>
<value>0</value>
</param>
<param>
<key>minoutbuf</key>
<value>0</value>
</param>
<param>
<key>vlen</key>
<value>1</value>
</param>
</block>
<block>
<key>blocks_multiply_xx</key>
<param>
@ -517,7 +713,7 @@
</param>
<param>
<key>_coordinate</key>
<value>(616, 136)</value>
<value>(768, 256)</value>
</param>
<param>
<key>_rotation</key>
@ -548,6 +744,61 @@
<value>1</value>
</param>
</block>
<block>
<key>blocks_throttle</key>
<param>
<key>alias</key>
<value></value>
</param>
<param>
<key>comment</key>
<value></value>
</param>
<param>
<key>affinity</key>
<value></value>
</param>
<param>
<key>_enabled</key>
<value>True</value>
</param>
<param>
<key>_coordinate</key>
<value>(368, 276)</value>
</param>
<param>
<key>_rotation</key>
<value>0</value>
</param>
<param>
<key>id</key>
<value>blocks_throttle_0</value>
</param>
<param>
<key>ignoretag</key>
<value>True</value>
</param>
<param>
<key>maxoutbuf</key>
<value>0</value>
</param>
<param>
<key>minoutbuf</key>
<value>0</value>
</param>
<param>
<key>samples_per_second</key>
<value>samp_rate</value>
</param>
<param>
<key>type</key>
<value>float</value>
</param>
<param>
<key>vlen</key>
<value>1</value>
</param>
</block>
<block>
<key>blocks_wavfile_source</key>
<param>
@ -572,7 +823,7 @@
</param>
<param>
<key>_coordinate</key>
<value>(96, 237)</value>
<value>(40, 365)</value>
</param>
<param>
<key>_rotation</key>
@ -631,7 +882,7 @@
</param>
<param>
<key>_coordinate</key>
<value>(1032, 166)</value>
<value>(1096, 110)</value>
</param>
<param>
<key>gui_hint</key>
@ -735,7 +986,7 @@
</param>
<param>
<key>label3</key>
<value>Square</value>
<value></value>
</param>
<param>
<key>marker3</key>
@ -899,7 +1150,7 @@
</param>
<param>
<key>nconnections</key>
<value>3</value>
<value>1</value>
</param>
<param>
<key>size</key>
@ -958,6 +1209,37 @@
<value>-1</value>
</param>
</block>
<block>
<key>satnogs_clear_text_msg_sink</key>
<param>
<key>alias</key>
<value></value>
</param>
<param>
<key>comment</key>
<value></value>
</param>
<param>
<key>affinity</key>
<value></value>
</param>
<param>
<key>_enabled</key>
<value>True</value>
</param>
<param>
<key>_coordinate</key>
<value>(1080, 544)</value>
</param>
<param>
<key>_rotation</key>
<value>0</value>
</param>
<param>
<key>id</key>
<value>satnogs_clear_text_msg_sink_0</value>
</param>
</block>
<block>
<key>satnogs_cw_matched_filter_ff</key>
<param>
@ -982,7 +1264,7 @@
</param>
<param>
<key>_coordinate</key>
<value>(480, 262)</value>
<value>(536, 270)</value>
</param>
<param>
<key>_rotation</key>
@ -1009,27 +1291,107 @@
<value>20</value>
</param>
</block>
<block>
<key>satnogs_cw_to_symbol</key>
<param>
<key>threshold</key>
<value>20e3</value>
</param>
<param>
<key>alias</key>
<value></value>
</param>
<param>
<key>comment</key>
<value></value>
</param>
<param>
<key>conf_level</key>
<value>0.85</value>
</param>
<param>
<key>affinity</key>
<value></value>
</param>
<param>
<key>_enabled</key>
<value>True</value>
</param>
<param>
<key>_coordinate</key>
<value>(856, 383)</value>
</param>
<param>
<key>_rotation</key>
<value>0</value>
</param>
<param>
<key>id</key>
<value>satnogs_cw_to_symbol_0</value>
</param>
<param>
<key>maxoutbuf</key>
<value>0</value>
</param>
<param>
<key>minoutbuf</key>
<value>0</value>
</param>
<param>
<key>sampling_rate</key>
<value>samp_rate</value>
</param>
<param>
<key>wpm</key>
<value>20</value>
</param>
</block>
<block>
<key>satnogs_morse_decoder</key>
<param>
<key>alias</key>
<value></value>
</param>
<param>
<key>comment</key>
<value></value>
</param>
<param>
<key>affinity</key>
<value></value>
</param>
<param>
<key>_enabled</key>
<value>True</value>
</param>
<param>
<key>_coordinate</key>
<value>(848, 540)</value>
</param>
<param>
<key>_rotation</key>
<value>0</value>
</param>
<param>
<key>id</key>
<value>satnogs_morse_decoder_0</value>
</param>
<param>
<key>maxoutbuf</key>
<value>0</value>
</param>
<param>
<key>minoutbuf</key>
<value>0</value>
</param>
<param>
<key>unrecognized_char</key>
<value>ord('#')</value>
</param>
</block>
<connection>
<source_block_id>analog_agc2_xx_0</source_block_id>
<sink_block_id>audio_sink_0</sink_block_id>
<source_key>0</source_key>
<sink_key>0</sink_key>
</connection>
<connection>
<source_block_id>analog_agc2_xx_0</source_block_id>
<sink_block_id>blocks_multiply_xx_0</sink_block_id>
<source_key>0</source_key>
<sink_key>0</sink_key>
</connection>
<connection>
<source_block_id>analog_agc2_xx_0</source_block_id>
<sink_block_id>blocks_multiply_xx_0</sink_block_id>
<source_key>0</source_key>
<sink_key>1</sink_key>
</connection>
<connection>
<source_block_id>analog_agc2_xx_0</source_block_id>
<sink_block_id>qtgui_time_sink_x_0</sink_block_id>
<source_block_id>analog_agc2_xx_0_0</source_block_id>
<sink_block_id>satnogs_cw_matched_filter_ff_0</sink_block_id>
<source_key>0</source_key>
<sink_key>0</sink_key>
</connection>
@ -1045,15 +1407,39 @@
<source_key>0</source_key>
<sink_key>0</sink_key>
</connection>
<connection>
<source_block_id>blocks_moving_average_xx_0</source_block_id>
<sink_block_id>blocks_file_sink_0</sink_block_id>
<source_key>0</source_key>
<sink_key>0</sink_key>
</connection>
<connection>
<source_block_id>blocks_moving_average_xx_0</source_block_id>
<sink_block_id>blocks_multiply_const_vxx_1</sink_block_id>
<source_key>0</source_key>
<sink_key>0</sink_key>
</connection>
<connection>
<source_block_id>blocks_moving_average_xx_0</source_block_id>
<sink_block_id>qtgui_time_sink_x_0</sink_block_id>
<source_key>0</source_key>
<sink_key>2</sink_key>
<sink_key>0</sink_key>
</connection>
<connection>
<source_block_id>blocks_multiply_const_vxx_0</source_block_id>
<sink_block_id>satnogs_cw_matched_filter_ff_0</sink_block_id>
<sink_block_id>blocks_throttle_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>analog_agc2_xx_0_0</sink_block_id>
<source_key>0</source_key>
<sink_key>0</sink_key>
</connection>
<connection>
<source_block_id>blocks_multiply_const_vxx_1</source_block_id>
<sink_block_id>satnogs_cw_to_symbol_0</sink_block_id>
<source_key>0</source_key>
<sink_key>0</sink_key>
</connection>
@ -1063,6 +1449,12 @@
<source_key>0</source_key>
<sink_key>0</sink_key>
</connection>
<connection>
<source_block_id>blocks_throttle_0</source_block_id>
<sink_block_id>blocks_multiply_const_vxx_0_0</sink_block_id>
<source_key>0</source_key>
<sink_key>0</sink_key>
</connection>
<connection>
<source_block_id>blocks_wavfile_source_0</source_block_id>
<sink_block_id>blocks_add_xx_0</sink_block_id>
@ -1071,14 +1463,26 @@
</connection>
<connection>
<source_block_id>satnogs_cw_matched_filter_ff_0</source_block_id>
<sink_block_id>analog_agc2_xx_0</sink_block_id>
<sink_block_id>blocks_multiply_xx_0</sink_block_id>
<source_key>0</source_key>
<sink_key>0</sink_key>
</connection>
<connection>
<source_block_id>satnogs_cw_matched_filter_ff_0</source_block_id>
<sink_block_id>qtgui_time_sink_x_0</sink_block_id>
<sink_block_id>blocks_multiply_xx_0</sink_block_id>
<source_key>0</source_key>
<sink_key>1</sink_key>
</connection>
<connection>
<source_block_id>satnogs_cw_to_symbol_0</source_block_id>
<sink_block_id>satnogs_morse_decoder_0</sink_block_id>
<source_key>out</source_key>
<sink_key>in</sink_key>
</connection>
<connection>
<source_block_id>satnogs_morse_decoder_0</source_block_id>
<sink_block_id>satnogs_clear_text_msg_sink_0</sink_block_id>
<source_key>out</source_key>
<sink_key>in</sink_key>
</connection>
</flow_graph>

View File

@ -81,6 +81,69 @@
<value></value>
</param>
</block>
<block>
<key>variable_qtgui_range</key>
<param>
<key>comment</key>
<value></value>
</param>
<param>
<key>value</key>
<value>1</value>
</param>
<param>
<key>_enabled</key>
<value>True</value>
</param>
<param>
<key>_coordinate</key>
<value>(152, 113)</value>
</param>
<param>
<key>gui_hint</key>
<value></value>
</param>
<param>
<key>_rotation</key>
<value>0</value>
</param>
<param>
<key>id</key>
<value>const</value>
</param>
<param>
<key>label</key>
<value>Signal Amplitude</value>
</param>
<param>
<key>min_len</key>
<value>200</value>
</param>
<param>
<key>orient</key>
<value>Qt.Horizontal</value>
</param>
<param>
<key>start</key>
<value>0</value>
</param>
<param>
<key>step</key>
<value>0.01</value>
</param>
<param>
<key>stop</key>
<value>5</value>
</param>
<param>
<key>rangeType</key>
<value>float</value>
</param>
<param>
<key>widget</key>
<value>counter_slider</value>
</param>
</block>
<block>
<key>variable</key>
<param>
@ -108,6 +171,33 @@
<value>8000</value>
</param>
</block>
<block>
<key>variable</key>
<param>
<key>comment</key>
<value></value>
</param>
<param>
<key>_enabled</key>
<value>True</value>
</param>
<param>
<key>_coordinate</key>
<value>(8, 229)</value>
</param>
<param>
<key>_rotation</key>
<value>0</value>
</param>
<param>
<key>id</key>
<value>taps</value>
</param>
<param>
<key>value</key>
<value>12</value>
</param>
</block>
<block>
<key>analog_agc2_xx</key>
<param>
@ -128,7 +218,7 @@
</param>
<param>
<key>decay_rate</key>
<value>2e-6</value>
<value>6.25e-4</value>
</param>
<param>
<key>_enabled</key>
@ -136,7 +226,7 @@
</param>
<param>
<key>_coordinate</key>
<value>(752, 320)</value>
<value>(536, 384)</value>
</param>
<param>
<key>_rotation</key>
@ -148,7 +238,7 @@
</param>
<param>
<key>id</key>
<value>analog_agc2_xx_0</value>
<value>analog_agc2_xx_0_0</value>
</param>
<param>
<key>max_gain</key>
@ -230,53 +320,6 @@
<value>8192</value>
</param>
</block>
<block>
<key>audio_sink</key>
<param>
<key>alias</key>
<value></value>
</param>
<param>
<key>comment</key>
<value></value>
</param>
<param>
<key>affinity</key>
<value></value>
</param>
<param>
<key>device_name</key>
<value></value>
</param>
<param>
<key>_enabled</key>
<value>1</value>
</param>
<param>
<key>_coordinate</key>
<value>(1032, 348)</value>
</param>
<param>
<key>_rotation</key>
<value>0</value>
</param>
<param>
<key>id</key>
<value>audio_sink_0</value>
</param>
<param>
<key>num_inputs</key>
<value>1</value>
</param>
<param>
<key>ok_to_block</key>
<value>True</value>
</param>
<param>
<key>samp_rate</key>
<value>samp_rate</value>
</param>
</block>
<block>
<key>blocks_add_xx</key>
<param>
@ -297,7 +340,7 @@
</param>
<param>
<key>_coordinate</key>
<value>(416, 440)</value>
<value>(240, 344)</value>
</param>
<param>
<key>_rotation</key>
@ -328,6 +371,218 @@
<value>1</value>
</param>
</block>
<block>
<key>blocks_moving_average_xx</key>
<param>
<key>alias</key>
<value></value>
</param>
<param>
<key>comment</key>
<value></value>
</param>
<param>
<key>affinity</key>
<value></value>
</param>
<param>
<key>_enabled</key>
<value>True</value>
</param>
<param>
<key>_coordinate</key>
<value>(936, 150)</value>
</param>
<param>
<key>_rotation</key>
<value>0</value>
</param>
<param>
<key>id</key>
<value>blocks_moving_average_xx_0</value>
</param>
<param>
<key>length</key>
<value>taps</value>
</param>
<param>
<key>max_iter</key>
<value>4000</value>
</param>
<param>
<key>maxoutbuf</key>
<value>0</value>
</param>
<param>
<key>minoutbuf</key>
<value>0</value>
</param>
<param>
<key>scale</key>
<value>1</value>
</param>
<param>
<key>type</key>
<value>float</value>
</param>
</block>
<block>
<key>blocks_multiply_const_vxx</key>
<param>
<key>alias</key>
<value></value>
</param>
<param>
<key>comment</key>
<value></value>
</param>
<param>
<key>const</key>
<value>const</value>
</param>
<param>
<key>affinity</key>
<value></value>
</param>
<param>
<key>_enabled</key>
<value>True</value>
</param>
<param>
<key>_coordinate</key>
<value>(424, 508)</value>
</param>
<param>
<key>_rotation</key>
<value>0</value>
</param>
<param>
<key>id</key>
<value>blocks_multiply_const_vxx_0</value>
</param>
<param>
<key>type</key>
<value>float</value>
</param>
<param>
<key>maxoutbuf</key>
<value>0</value>
</param>
<param>
<key>minoutbuf</key>
<value>0</value>
</param>
<param>
<key>vlen</key>
<value>1</value>
</param>
</block>
<block>
<key>blocks_multiply_xx</key>
<param>
<key>alias</key>
<value></value>
</param>
<param>
<key>comment</key>
<value></value>
</param>
<param>
<key>affinity</key>
<value></value>
</param>
<param>
<key>_enabled</key>
<value>True</value>
</param>
<param>
<key>_coordinate</key>
<value>(768, 176)</value>
</param>
<param>
<key>_rotation</key>
<value>0</value>
</param>
<param>
<key>id</key>
<value>blocks_multiply_xx_0</value>
</param>
<param>
<key>type</key>
<value>float</value>
</param>
<param>
<key>maxoutbuf</key>
<value>0</value>
</param>
<param>
<key>minoutbuf</key>
<value>0</value>
</param>
<param>
<key>num_inputs</key>
<value>2</value>
</param>
<param>
<key>vlen</key>
<value>1</value>
</param>
</block>
<block>
<key>blocks_throttle</key>
<param>
<key>alias</key>
<value></value>
</param>
<param>
<key>comment</key>
<value></value>
</param>
<param>
<key>affinity</key>
<value></value>
</param>
<param>
<key>_enabled</key>
<value>True</value>
</param>
<param>
<key>_coordinate</key>
<value>(344, 356)</value>
</param>
<param>
<key>_rotation</key>
<value>0</value>
</param>
<param>
<key>id</key>
<value>blocks_throttle_0</value>
</param>
<param>
<key>ignoretag</key>
<value>True</value>
</param>
<param>
<key>maxoutbuf</key>
<value>0</value>
</param>
<param>
<key>minoutbuf</key>
<value>0</value>
</param>
<param>
<key>samples_per_second</key>
<value>samp_rate</value>
</param>
<param>
<key>type</key>
<value>float</value>
</param>
<param>
<key>vlen</key>
<value>1</value>
</param>
</block>
<block>
<key>blocks_wavfile_source</key>
<param>
@ -411,7 +666,7 @@
</param>
<param>
<key>_coordinate</key>
<value>(952, 166)</value>
<value>(1112, 166)</value>
</param>
<param>
<key>gui_hint</key>
@ -679,7 +934,7 @@
</param>
<param>
<key>nconnections</key>
<value>2</value>
<value>1</value>
</param>
<param>
<key>size</key>
@ -762,7 +1017,7 @@
</param>
<param>
<key>_coordinate</key>
<value>(536, 222)</value>
<value>(488, 182)</value>
</param>
<param>
<key>_rotation</key>
@ -790,14 +1045,8 @@
</param>
</block>
<connection>
<source_block_id>analog_agc2_xx_0</source_block_id>
<sink_block_id>audio_sink_0</sink_block_id>
<source_key>0</source_key>
<sink_key>0</sink_key>
</connection>
<connection>
<source_block_id>analog_agc2_xx_0</source_block_id>
<sink_block_id>qtgui_time_sink_x_0</sink_block_id>
<source_block_id>analog_agc2_xx_0_0</source_block_id>
<sink_block_id>satnogs_cw_matched_filter_ff_0</sink_block_id>
<source_key>0</source_key>
<sink_key>0</sink_key>
</connection>
@ -809,7 +1058,31 @@
</connection>
<connection>
<source_block_id>blocks_add_xx_0</source_block_id>
<sink_block_id>satnogs_cw_matched_filter_ff_0</sink_block_id>
<sink_block_id>blocks_throttle_0</sink_block_id>
<source_key>0</source_key>
<sink_key>0</sink_key>
</connection>
<connection>
<source_block_id>blocks_moving_average_xx_0</source_block_id>
<sink_block_id>qtgui_time_sink_x_0</sink_block_id>
<source_key>0</source_key>
<sink_key>0</sink_key>
</connection>
<connection>
<source_block_id>blocks_multiply_const_vxx_0</source_block_id>
<sink_block_id>analog_agc2_xx_0_0</sink_block_id>
<source_key>0</source_key>
<sink_key>0</sink_key>
</connection>
<connection>
<source_block_id>blocks_multiply_xx_0</source_block_id>
<sink_block_id>blocks_moving_average_xx_0</sink_block_id>
<source_key>0</source_key>
<sink_key>0</sink_key>
</connection>
<connection>
<source_block_id>blocks_throttle_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>
@ -821,13 +1094,13 @@
</connection>
<connection>
<source_block_id>satnogs_cw_matched_filter_ff_0</source_block_id>
<sink_block_id>analog_agc2_xx_0</sink_block_id>
<sink_block_id>blocks_multiply_xx_0</sink_block_id>
<source_key>0</source_key>
<sink_key>0</sink_key>
</connection>
<connection>
<source_block_id>satnogs_cw_matched_filter_ff_0</source_block_id>
<sink_block_id>qtgui_time_sink_x_0</sink_block_id>
<sink_block_id>blocks_multiply_xx_0</sink_block_id>
<source_key>0</source_key>
<sink_key>1</sink_key>
</connection>

View File

@ -4,7 +4,7 @@
<key>satnogs_cw_to_symbol</key>
<category>satnogs</category>
<import>import satnogs</import>
<make>satnogs.cw_to_symbol($sampling_rate, $threshold, $wpm)</make>
<make>satnogs.cw_to_symbol($sampling_rate, $threshold, $conf_level, $wpm)</make>
<param>
<name>Sampling Rate</name>
@ -18,6 +18,13 @@
<key>threshold</key>
<type>real</type>
</param>
<param>
<name>Confidence Level</name>
<key>conf_level</key>
<value>0.9</value>
<type>real</type>
</param>
<param>
<name>Words per Minute</name>

View File

@ -51,9 +51,15 @@ namespace gr {
*
* @param sampling_rate the sampling rate of the signal
* @param threshold the activation threshold
* @param conf_level the confidence level, for the decisions made by
* the decoder. Higher values, means that the decoder would be more
* conservative, whereas lower may help in noisy environments but may
* trigger false alarms too, especially for the case of short pauses
* symbols
* @param wpm Morse code Words per Minute
*/
static sptr make(double sampling_rate, float threshold, size_t wpm = 20);
static sptr make(double sampling_rate, float threshold,
float conf_level = 0.9, size_t wpm = 20);
};
} // namespace satnogs

View File

@ -24,7 +24,6 @@
#include <gnuradio/io_signature.h>
#include <satnogs/log.h>
#include <satnogs/morse.h>
#include "cw_to_symbol_impl.h"
namespace gr
@ -33,34 +32,42 @@ namespace gr
{
cw_to_symbol::sptr
cw_to_symbol::make (double sampling_rate, float threshold, size_t wpm)
cw_to_symbol::make (double sampling_rate, float threshold,
float conf_level, size_t wpm)
{
return gnuradio::get_initial_sptr (
new cw_to_symbol_impl (sampling_rate, threshold, wpm));
new cw_to_symbol_impl (sampling_rate, threshold, conf_level, wpm));
}
/*
* The private constructor
*/
cw_to_symbol_impl::cw_to_symbol_impl (double sampling_rate, float threshold,
size_t wpm) :
float conf_level, size_t wpm) :
gr::sync_block ("cw_to_symbol",
gr::io_signature::make (1, 1, sizeof(float)),
gr::io_signature::make (0, 0, 0)),
d_sampling_rate(sampling_rate),
d_act_thrshld(threshold),
d_confidence_level(0.90),
d_confidence_level(conf_level),
d_dot_samples((1.2/wpm) / (1.0 / sampling_rate)),
d_dash_samples(3 * d_dot_samples),
d_short_pause_samples(3 * d_dot_samples),
d_long_pause_samples(7 * d_dot_samples),
d_state(IDLE),
d_state_cnt(0),
d_pause_cnt(0)
d_pause_cnt(0),
d_seq_started(false)
{
message_port_register_out(pmt::mp("out"));
}
inline void
cw_to_symbol_impl::send_symbol_msg (morse_symbol_t s)
{
message_port_pub(pmt::mp("out"), pmt::from_long(s));
}
/*
* Our virtual destructor.
*/
@ -71,6 +78,7 @@ namespace gr
inline void
cw_to_symbol_impl::set_idle ()
{
LOG_WARN("Enter IDLE");
d_state = IDLE;
d_state_cnt = 0;
d_pause_cnt = 0;
@ -79,33 +87,32 @@ namespace gr
inline void
cw_to_symbol_impl::set_short_on ()
{
LOG_WARN("Enter SHORT ON");
d_state = SHORT_ON_PERIOD;
d_state_cnt = 1;
d_pause_cnt = 0;
}
inline void
cw_to_symbol_impl::set_long_on ()
{
LOG_WARN("Enter LONG ON");
d_state = LONG_ON_PERIOD;
d_pause_cnt = 0;
}
inline void
cw_to_symbol_impl::set_short_off (size_t borrow_cnt)
cw_to_symbol_impl::set_short_off ()
{
LOG_WARN("Enter SHORT OFF");
d_state = SHORT_OFF_PERIOD;
d_state_cnt = 0;
d_pause_cnt += borrow_cnt;
/* Due to time-slots borrowing we may be already at the Long pause */
if(d_pause_cnt > d_short_pause_samples) {
d_state = LONG_OFF_PERIOD;
}
d_pause_cnt = 1;
}
inline void
cw_to_symbol_impl::set_long_off ()
{
LOG_WARN("Enter LONG OFF");
d_state = LONG_OFF_PERIOD;
}
@ -124,7 +131,6 @@ namespace gr
if(in[i] > d_act_thrshld) {
set_short_on();
}
// TODO Avoid unnecessary pause messages
break;
case SHORT_ON_PERIOD:
@ -140,17 +146,16 @@ namespace gr
* Before going to short pause, check the confidence level.
* Perhaps a short symbol should be produced.
*
* Otherwise, it was a false alarm. So the time-slots counted
* so far should be assigned as pause time-slots.
* Otherwise, it was a false alarm.
*/
conf_lvl = ((float) d_state_cnt) / d_dot_samples;
if(conf_lvl > d_confidence_level){
message_port_pub(pmt::mp("out"), pmt::from_long(MORSE_DOT));
set_short_off(0);
}
else{
set_short_off(d_state_cnt);
LOG_DEBUG("Short space");
send_symbol_msg(MORSE_S_SPACE);
}
/* Go find a possible short pause symbol */
set_short_off();
}
break;
@ -158,25 +163,37 @@ namespace gr
if( in[i] > d_act_thrshld ) {
d_state_cnt++;
}
else{
/*
* In this case the FSM should continue at the SHORT_OFF state.
* Before this depending the confidence for a long pulse, produce
* a short or long pulse message
*/
else {
conf_lvl = ((float) d_state_cnt) / d_dash_samples;
if(conf_lvl > d_confidence_level){
message_port_pub(pmt::mp("out"), pmt::from_long(MORSE_DASH));
if(conf_lvl > d_confidence_level) {
LOG_DEBUG("DASH");
send_symbol_msg(MORSE_DASH);
set_short_off();
break;
}
else{
message_port_pub(pmt::mp("out"), pmt::from_long(MORSE_DOT));
/* Perhaps this was a short on symbol */
conf_lvl = ((float) d_state_cnt) / d_dot_samples;
if(conf_lvl > d_confidence_level) {
LOG_DEBUG("DOT");
send_symbol_msg(MORSE_DOT);
set_short_off();
}
set_short_off(0);
}
break;
case SHORT_OFF_PERIOD:
if(in[i] > d_act_thrshld) {
/*
* Before going to ON state, again check if a short pause symbol
* should be produced
*/
conf_lvl = ((float) d_pause_cnt) / d_short_pause_samples;
if(conf_lvl > d_confidence_level) {
LOG_DEBUG("Short space");
send_symbol_msg(MORSE_S_SPACE);
}
set_short_on();
}
else {
@ -186,14 +203,32 @@ namespace gr
}
}
break;
case LONG_OFF_PERIOD:
if(in[i] > d_act_thrshld) {
conf_lvl = ((float) d_pause_cnt) / d_long_pause_samples;
if (conf_lvl > d_confidence_level) {
LOG_DEBUG("Long space");
send_symbol_msg (MORSE_L_SPACE);
set_idle();
break;
}
else {
LOG_DEBUG("Short space");
send_symbol_msg (MORSE_S_SPACE);
}
set_short_on();
}
else {
d_pause_cnt++;
/*
* If the pause duration is greater than the long pause symbol,
* definitely a long pause symbol should be produced
*/
if(d_pause_cnt > d_long_pause_samples) {
message_port_pub(pmt::mp("out"), pmt::from_long(MORSE_L_SPACE));
LOG_DEBUG("Long space");
send_symbol_msg(MORSE_L_SPACE);
d_seq_started = false;
set_idle();
}
}

View File

@ -21,6 +21,7 @@
#ifndef INCLUDED_SATNOGS_CW_TO_SYMBOL_IMPL_H
#define INCLUDED_SATNOGS_CW_TO_SYMBOL_IMPL_H
#include <satnogs/morse.h>
#include <satnogs/cw_to_symbol.h>
namespace gr
@ -48,6 +49,7 @@ namespace gr
cw_state_t d_state;
size_t d_state_cnt;
size_t d_pause_cnt;
bool d_seq_started;
inline void
set_idle ();
@ -59,13 +61,17 @@ namespace gr
set_long_on ();
inline void
set_short_off (size_t borrow_cnt);
set_short_off ();
inline void
set_long_off ();
inline void
send_symbol_msg (morse_symbol_t s);
public:
cw_to_symbol_impl (double sampling_rate, float threshold, size_t wpm);
cw_to_symbol_impl (double sampling_rate, float threshold,
float conf_level, size_t wpm);
~cw_to_symbol_impl ();
// Where all the action really happens

View File

@ -56,6 +56,11 @@ namespace gr
* word
*/
case MORSE_L_SPACE:
/* Just ignore the word separator if no word is yet decoded */
if (d_morse_tree.get_word_len() == 0) {
res = true;
break;
}
str = d_morse_tree.get_word();
d_morse_tree.reset();
message_port_pub(pmt::mp("out"), pmt::make_blob(str.c_str(),

View File

@ -217,6 +217,13 @@ namespace gr
}
break;
case MORSE_S_SPACE:
/*
* A short space received, but the decoder is still at the root.
* This is not in general an error so we return true
*/
if(d_current == d_root){
return true;
}
c = d_current->get_char ();
d_current = d_root;
/*