aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorMatthias P. Braendli <matthias.braendli@mpb.li>2019-07-18 16:47:20 +0200
committerMatthias P. Braendli <matthias.braendli@mpb.li>2019-07-18 16:47:20 +0200
commit6c7fb8a8e93b79b13c80a5ce0256ae3190ca53d2 (patch)
tree0fa07aa18a7f7ab1076c4a736c766c4d8ad9b54f
parentac80c2d52febc19c7194e3f1aac6529f2d119968 (diff)
downloadglutte-o-matic-6c7fb8a8e93b79b13c80a5ce0256ae3190ca53d2.tar.gz
glutte-o-matic-6c7fb8a8e93b79b13c80a5ce0256ae3190ca53d2.tar.bz2
glutte-o-matic-6c7fb8a8e93b79b13c80a5ce0256ae3190ca53d2.zip
Add PSK125 decoder script
-rw-r--r--decoder/README.md21
-rw-r--r--decoder/analyse_capture.grc1676
-rwxr-xr-xdecoder/analyse_capture.py132
-rwxr-xr-xdecoder/varidecode.py113
4 files changed, 1942 insertions, 0 deletions
diff --git a/decoder/README.md b/decoder/README.md
new file mode 100644
index 0000000..6ca6b9a
--- /dev/null
+++ b/decoder/README.md
@@ -0,0 +1,21 @@
+Introduction
+------------
+
+This folder contains a set of scripts that can be used to automatically decode the PSK125 beacon at 22:00
+
+Dependencies
+------------
+
+* Python 3
+* GNURadio 3.7
+* An SDR device and a suitable I/Q capture tool
+
+Principle of operation
+----------------------
+
+1. Capture I/Q data, in u8 format, at 20148ksps, centered on 145.700MHz, into a file called `iq.raw`
+1. Demodulate FM and PSK using the GNURadio flowgraph `analyse_capture.grc`. It will write a file called `psk125.bit`
+1. Run the `varidecode.py` script, which will read `psk125.bit` and write `psk125.txt` with decoded beacon data
+
+Example for RTLSDR: `rtl_sdr -f 145700000 -n 204800000 iq.raw` will capture 100 seconds worth of IQ data.
+
diff --git a/decoder/analyse_capture.grc b/decoder/analyse_capture.grc
new file mode 100644
index 0000000..e844934
--- /dev/null
+++ b/decoder/analyse_capture.grc
@@ -0,0 +1,1676 @@
+<?xml version='1.0' encoding='utf-8'?>
+<?grc format='1' created='3.7.13'?>
+<flow_graph>
+ <timestamp>Wed Jul 17 22:04:54 2019</timestamp>
+ <block>
+ <key>options</key>
+ <param>
+ <key>author</key>
+ <value>HB9EGM</value>
+ </param>
+ <param>
+ <key>window_size</key>
+ <value></value>
+ </param>
+ <param>
+ <key>category</key>
+ <value>[GRC Hier Blocks]</value>
+ </param>
+ <param>
+ <key>comment</key>
+ <value></value>
+ </param>
+ <param>
+ <key>description</key>
+ <value></value>
+ </param>
+ <param>
+ <key>_enabled</key>
+ <value>True</value>
+ </param>
+ <param>
+ <key>_coordinate</key>
+ <value>(8, 8)</value>
+ </param>
+ <param>
+ <key>_rotation</key>
+ <value>0</value>
+ </param>
+ <param>
+ <key>generate_options</key>
+ <value>no_gui</value>
+ </param>
+ <param>
+ <key>hier_block_src_path</key>
+ <value>.:</value>
+ </param>
+ <param>
+ <key>id</key>
+ <value>analyse_capture</value>
+ </param>
+ <param>
+ <key>max_nouts</key>
+ <value>0</value>
+ </param>
+ <param>
+ <key>qt_qss_theme</key>
+ <value></value>
+ </param>
+ <param>
+ <key>realtime_scheduling</key>
+ <value></value>
+ </param>
+ <param>
+ <key>run_command</key>
+ <value>{python} -u {filename}</value>
+ </param>
+ <param>
+ <key>run_options</key>
+ <value>run</value>
+ </param>
+ <param>
+ <key>run</key>
+ <value>True</value>
+ </param>
+ <param>
+ <key>sizing_mode</key>
+ <value>fixed</value>
+ </param>
+ <param>
+ <key>thread_safe_setters</key>
+ <value></value>
+ </param>
+ <param>
+ <key>title</key>
+ <value>Analyse RTLSDR capture</value>
+ </param>
+ <param>
+ <key>placement</key>
+ <value>(0,0)</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>(12, 229)</value>
+ </param>
+ <param>
+ <key>_rotation</key>
+ <value>0</value>
+ </param>
+ <param>
+ <key>id</key>
+ <value>audio_rate</value>
+ </param>
+ <param>
+ <key>value</key>
+ <value>int(32e3)</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>(12, 296)</value>
+ </param>
+ <param>
+ <key>_rotation</key>
+ <value>0</value>
+ </param>
+ <param>
+ <key>id</key>
+ <value>decim</value>
+ </param>
+ <param>
+ <key>value</key>
+ <value>16</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, 160)</value>
+ </param>
+ <param>
+ <key>_rotation</key>
+ <value>0</value>
+ </param>
+ <param>
+ <key>id</key>
+ <value>samp_rate</value>
+ </param>
+ <param>
+ <key>value</key>
+ <value>2048000</value>
+ </param>
+ </block>
+ <block>
+ <key>variable_low_pass_filter_taps</key>
+ <param>
+ <key>beta</key>
+ <value>6.76</value>
+ </param>
+ <param>
+ <key>comment</key>
+ <value></value>
+ </param>
+ <param>
+ <key>cutoff_freq</key>
+ <value>3e3</value>
+ </param>
+ <param>
+ <key>_enabled</key>
+ <value>True</value>
+ </param>
+ <param>
+ <key>_coordinate</key>
+ <value>(385, 15)</value>
+ </param>
+ <param>
+ <key>_rotation</key>
+ <value>0</value>
+ </param>
+ <param>
+ <key>gain</key>
+ <value>1.0/256</value>
+ </param>
+ <param>
+ <key>id</key>
+ <value>taps</value>
+ </param>
+ <param>
+ <key>samp_rate</key>
+ <value>samp_rate</value>
+ </param>
+ <param>
+ <key>width</key>
+ <value>10e2</value>
+ </param>
+ <param>
+ <key>win</key>
+ <value>firdes.WIN_HAMMING</value>
+ </param>
+ </block>
+ <block>
+ <key>analog_agc_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>(612, 257)</value>
+ </param>
+ <param>
+ <key>_rotation</key>
+ <value>0</value>
+ </param>
+ <param>
+ <key>gain</key>
+ <value>1.0</value>
+ </param>
+ <param>
+ <key>id</key>
+ <value>analog_agc_xx_0</value>
+ </param>
+ <param>
+ <key>max_gain</key>
+ <value>1</value>
+ </param>
+ <param>
+ <key>maxoutbuf</key>
+ <value>0</value>
+ </param>
+ <param>
+ <key>minoutbuf</key>
+ <value>0</value>
+ </param>
+ <param>
+ <key>rate</key>
+ <value>1e-4</value>
+ </param>
+ <param>
+ <key>reference</key>
+ <value>0.2</value>
+ </param>
+ <param>
+ <key>type</key>
+ <value>float</value>
+ </param>
+ </block>
+ <block>
+ <key>analog_const_source_x</key>
+ <param>
+ <key>alias</key>
+ <value></value>
+ </param>
+ <param>
+ <key>comment</key>
+ <value></value>
+ </param>
+ <param>
+ <key>const</key>
+ <value>0</value>
+ </param>
+ <param>
+ <key>affinity</key>
+ <value></value>
+ </param>
+ <param>
+ <key>_enabled</key>
+ <value>True</value>
+ </param>
+ <param>
+ <key>_coordinate</key>
+ <value>(42, 453)</value>
+ </param>
+ <param>
+ <key>_rotation</key>
+ <value>0</value>
+ </param>
+ <param>
+ <key>id</key>
+ <value>analog_const_source_x_0</value>
+ </param>
+ <param>
+ <key>maxoutbuf</key>
+ <value>0</value>
+ </param>
+ <param>
+ <key>minoutbuf</key>
+ <value>0</value>
+ </param>
+ <param>
+ <key>type</key>
+ <value>float</value>
+ </param>
+ </block>
+ <block>
+ <key>analog_nbfm_rx</key>
+ <param>
+ <key>audio_rate</key>
+ <value>audio_rate</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>_coordinate</key>
+ <value>(428, 257)</value>
+ </param>
+ <param>
+ <key>_rotation</key>
+ <value>0</value>
+ </param>
+ <param>
+ <key>id</key>
+ <value>analog_nbfm_rx_0</value>
+ </param>
+ <param>
+ <key>max_dev</key>
+ <value>5e3</value>
+ </param>
+ <param>
+ <key>maxoutbuf</key>
+ <value>0</value>
+ </param>
+ <param>
+ <key>minoutbuf</key>
+ <value>0</value>
+ </param>
+ <param>
+ <key>quad_rate</key>
+ <value>samp_rate/decim</value>
+ </param>
+ <param>
+ <key>tau</key>
+ <value>75e-6</value>
+ </param>
+ </block>
+ <block>
+ <key>analog_sig_source_x</key>
+ <param>
+ <key>amp</key>
+ <value>1</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>freq</key>
+ <value>588</value>
+ </param>
+ <param>
+ <key>_coordinate</key>
+ <value>(202, 502)</value>
+ </param>
+ <param>
+ <key>_rotation</key>
+ <value>0</value>
+ </param>
+ <param>
+ <key>id</key>
+ <value>analog_sig_source_x_1</value>
+ </param>
+ <param>
+ <key>maxoutbuf</key>
+ <value>0</value>
+ </param>
+ <param>
+ <key>minoutbuf</key>
+ <value>0</value>
+ </param>
+ <param>
+ <key>offset</key>
+ <value>0</value>
+ </param>
+ <param>
+ <key>type</key>
+ <value>complex</value>
+ </param>
+ <param>
+ <key>samp_rate</key>
+ <value>audio_rate</value>
+ </param>
+ <param>
+ <key>waveform</key>
+ <value>analog.GR_COS_WAVE</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>0</value>
+ </param>
+ <param>
+ <key>_coordinate</key>
+ <value>(832, 281)</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>audio_rate</value>
+ </param>
+ </block>
+ <block>
+ <key>blocks_complex_to_float</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>(410, 726)</value>
+ </param>
+ <param>
+ <key>_rotation</key>
+ <value>0</value>
+ </param>
+ <param>
+ <key>id</key>
+ <value>blocks_complex_to_float_0</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_deinterleave</key>
+ <param>
+ <key>alias</key>
+ <value></value>
+ </param>
+ <param>
+ <key>blocksize</key>
+ <value>1</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>(361, 168)</value>
+ </param>
+ <param>
+ <key>_rotation</key>
+ <value>0</value>
+ </param>
+ <param>
+ <key>id</key>
+ <value>blocks_deinterleave_0</value>
+ </param>
+ <param>
+ <key>type</key>
+ <value>byte</value>
+ </param>
+ <param>
+ <key>maxoutbuf</key>
+ <value>0</value>
+ </param>
+ <param>
+ <key>minoutbuf</key>
+ <value>0</value>
+ </param>
+ <param>
+ <key>num_streams</key>
+ <value>2</value>
+ </param>
+ <param>
+ <key>vlen</key>
+ <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>./psk125.bit</value>
+ </param>
+ <param>
+ <key>_coordinate</key>
+ <value>(760, 702)</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>byte</value>
+ </param>
+ <param>
+ <key>unbuffered</key>
+ <value>False</value>
+ </param>
+ <param>
+ <key>vlen</key>
+ <value>1</value>
+ </param>
+ </block>
+ <block>
+ <key>blocks_file_source</key>
+ <param>
+ <key>begin_tag</key>
+ <value>pmt.PMT_NIL</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>./iq.raw</value>
+ </param>
+ <param>
+ <key>_coordinate</key>
+ <value>(153, 156)</value>
+ </param>
+ <param>
+ <key>_rotation</key>
+ <value>0</value>
+ </param>
+ <param>
+ <key>id</key>
+ <value>blocks_file_source_0</value>
+ </param>
+ <param>
+ <key>maxoutbuf</key>
+ <value>0</value>
+ </param>
+ <param>
+ <key>minoutbuf</key>
+ <value>0</value>
+ </param>
+ <param>
+ <key>type</key>
+ <value>byte</value>
+ </param>
+ <param>
+ <key>repeat</key>
+ <value>False</value>
+ </param>
+ <param>
+ <key>vlen</key>
+ <value>1</value>
+ </param>
+ </block>
+ <block>
+ <key>blocks_float_to_complex</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>(636, 162)</value>
+ </param>
+ <param>
+ <key>_rotation</key>
+ <value>0</value>
+ </param>
+ <param>
+ <key>id</key>
+ <value>blocks_float_to_complex_0</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_float_to_complex</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>(214, 438)</value>
+ </param>
+ <param>
+ <key>_rotation</key>
+ <value>0</value>
+ </param>
+ <param>
+ <key>id</key>
+ <value>blocks_float_to_complex_1</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>(386, 481)</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>complex</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_uchar_to_float</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>(495, 165)</value>
+ </param>
+ <param>
+ <key>_rotation</key>
+ <value>0</value>
+ </param>
+ <param>
+ <key>id</key>
+ <value>blocks_uchar_to_float_0</value>
+ </param>
+ <param>
+ <key>maxoutbuf</key>
+ <value>0</value>
+ </param>
+ <param>
+ <key>minoutbuf</key>
+ <value>0</value>
+ </param>
+ </block>
+ <block>
+ <key>blocks_uchar_to_float</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>(495, 195)</value>
+ </param>
+ <param>
+ <key>_rotation</key>
+ <value>0</value>
+ </param>
+ <param>
+ <key>id</key>
+ <value>blocks_uchar_to_float_0_0</value>
+ </param>
+ <param>
+ <key>maxoutbuf</key>
+ <value>0</value>
+ </param>
+ <param>
+ <key>minoutbuf</key>
+ <value>0</value>
+ </param>
+ </block>
+ <block>
+ <key>digital_binary_slicer_fb</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>(613, 723)</value>
+ </param>
+ <param>
+ <key>_rotation</key>
+ <value>0</value>
+ </param>
+ <param>
+ <key>id</key>
+ <value>digital_binary_slicer_fb_0</value>
+ </param>
+ <param>
+ <key>maxoutbuf</key>
+ <value>0</value>
+ </param>
+ <param>
+ <key>minoutbuf</key>
+ <value>0</value>
+ </param>
+ </block>
+ <block>
+ <key>digital_diff_phasor_cc</key>
+ <param>
+ <key>alias</key>
+ <value></value>
+ </param>
+ <param>
+ <key>comment</key>
+ <value></value>
+ </param>
+ <param>
+ <key>affinity</key>
+ <value></value>
+ </param>
+ <param>
+ <key>_enabled</key>
+ <value>True</value>
+ </param>
+ <param>
+ <key>_coordinate</key>
+ <value>(214, 735)</value>
+ </param>
+ <param>
+ <key>_rotation</key>
+ <value>0</value>
+ </param>
+ <param>
+ <key>id</key>
+ <value>digital_diff_phasor_cc_0</value>
+ </param>
+ <param>
+ <key>maxoutbuf</key>
+ <value>0</value>
+ </param>
+ <param>
+ <key>minoutbuf</key>
+ <value>0</value>
+ </param>
+ </block>
+ <block>
+ <key>digital_mpsk_receiver_cc</key>
+ <param>
+ <key>alias</key>
+ <value></value>
+ </param>
+ <param>
+ <key>comment</key>
+ <value></value>
+ </param>
+ <param>
+ <key>affinity</key>
+ <value></value>
+ </param>
+ <param>
+ <key>_enabled</key>
+ <value>True</value>
+ </param>
+ <param>
+ <key>_coordinate</key>
+ <value>(778, 419)</value>
+ </param>
+ <param>
+ <key>_rotation</key>
+ <value>0</value>
+ </param>
+ <param>
+ <key>gain_mu</key>
+ <value>0.04</value>
+ </param>
+ <param>
+ <key>gain_omega</key>
+ <value>64*64/4</value>
+ </param>
+ <param>
+ <key>id</key>
+ <value>digital_mpsk_receiver_cc_0</value>
+ </param>
+ <param>
+ <key>w</key>
+ <value>cmath.pi/100.0</value>
+ </param>
+ <param>
+ <key>M</key>
+ <value>2</value>
+ </param>
+ <param>
+ <key>fmax</key>
+ <value>0.25</value>
+ </param>
+ <param>
+ <key>maxoutbuf</key>
+ <value>0</value>
+ </param>
+ <param>
+ <key>fmin</key>
+ <value>-0.25</value>
+ </param>
+ <param>
+ <key>minoutbuf</key>
+ <value>0</value>
+ </param>
+ <param>
+ <key>mu</key>
+ <value>0.25</value>
+ </param>
+ <param>
+ <key>omega_relative_limit</key>
+ <value>0.005</value>
+ </param>
+ <param>
+ <key>omega</key>
+ <value>64</value>
+ </param>
+ <param>
+ <key>theta</key>
+ <value>0</value>
+ </param>
+ </block>
+ <block>
+ <key>freq_xlating_fft_filter_ccc</key>
+ <param>
+ <key>alias</key>
+ <value></value>
+ </param>
+ <param>
+ <key>center_freq</key>
+ <value>145725e3-145700e3</value>
+ </param>
+ <param>
+ <key>comment</key>
+ <value></value>
+ </param>
+ <param>
+ <key>affinity</key>
+ <value></value>
+ </param>
+ <param>
+ <key>decim</key>
+ <value>decim</value>
+ </param>
+ <param>
+ <key>_enabled</key>
+ <value>True</value>
+ </param>
+ <param>
+ <key>_coordinate</key>
+ <value>(177, 251)</value>
+ </param>
+ <param>
+ <key>_rotation</key>
+ <value>0</value>
+ </param>
+ <param>
+ <key>id</key>
+ <value>freq_xlating_fft_filter_ccc_0</value>
+ </param>
+ <param>
+ <key>maxoutbuf</key>
+ <value>0</value>
+ </param>
+ <param>
+ <key>minoutbuf</key>
+ <value>0</value>
+ </param>
+ <param>
+ <key>nthreads</key>
+ <value>1</value>
+ </param>
+ <param>
+ <key>samp_delay</key>
+ <value>0</value>
+ </param>
+ <param>
+ <key>samp_rate</key>
+ <value>samp_rate</value>
+ </param>
+ <param>
+ <key>taps</key>
+ <value>taps</value>
+ </param>
+ </block>
+ <block>
+ <key>low_pass_filter</key>
+ <param>
+ <key>beta</key>
+ <value>6.76</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>cutoff_freq</key>
+ <value>200</value>
+ </param>
+ <param>
+ <key>decim</key>
+ <value>4</value>
+ </param>
+ <param>
+ <key>_enabled</key>
+ <value>True</value>
+ </param>
+ <param>
+ <key>type</key>
+ <value>fir_filter_ccf</value>
+ </param>
+ <param>
+ <key>_coordinate</key>
+ <value>(515, 438)</value>
+ </param>
+ <param>
+ <key>_rotation</key>
+ <value>0</value>
+ </param>
+ <param>
+ <key>gain</key>
+ <value>1</value>
+ </param>
+ <param>
+ <key>id</key>
+ <value>low_pass_filter_0</value>
+ </param>
+ <param>
+ <key>interp</key>
+ <value>1</value>
+ </param>
+ <param>
+ <key>maxoutbuf</key>
+ <value>0</value>
+ </param>
+ <param>
+ <key>minoutbuf</key>
+ <value>0</value>
+ </param>
+ <param>
+ <key>samp_rate</key>
+ <value>audio_rate</value>
+ </param>
+ <param>
+ <key>width</key>
+ <value>20</value>
+ </param>
+ <param>
+ <key>win</key>
+ <value>firdes.WIN_HAMMING</value>
+ </param>
+ </block>
+ <block>
+ <key>qtgui_const_sink_x</key>
+ <param>
+ <key>autoscale</key>
+ <value>False</value>
+ </param>
+ <param>
+ <key>axislabels</key>
+ <value>True</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>0</value>
+ </param>
+ <param>
+ <key>_coordinate</key>
+ <value>(1017, 481)</value>
+ </param>
+ <param>
+ <key>gui_hint</key>
+ <value></value>
+ </param>
+ <param>
+ <key>_rotation</key>
+ <value>0</value>
+ </param>
+ <param>
+ <key>grid</key>
+ <value>False</value>
+ </param>
+ <param>
+ <key>id</key>
+ <value>qtgui_const_sink_x_1</value>
+ </param>
+ <param>
+ <key>legend</key>
+ <value>True</value>
+ </param>
+ <param>
+ <key>alpha1</key>
+ <value>1.0</value>
+ </param>
+ <param>
+ <key>color1</key>
+ <value>"blue"</value>
+ </param>
+ <param>
+ <key>label1</key>
+ <value></value>
+ </param>
+ <param>
+ <key>marker1</key>
+ <value>0</value>
+ </param>
+ <param>
+ <key>style1</key>
+ <value>0</value>
+ </param>
+ <param>
+ <key>width1</key>
+ <value>1</value>
+ </param>
+ <param>
+ <key>alpha10</key>
+ <value>1.0</value>
+ </param>
+ <param>
+ <key>color10</key>
+ <value>"red"</value>
+ </param>
+ <param>
+ <key>label10</key>
+ <value></value>
+ </param>
+ <param>
+ <key>marker10</key>
+ <value>0</value>
+ </param>
+ <param>
+ <key>style10</key>
+ <value>0</value>
+ </param>
+ <param>
+ <key>width10</key>
+ <value>1</value>
+ </param>
+ <param>
+ <key>alpha2</key>
+ <value>1.0</value>
+ </param>
+ <param>
+ <key>color2</key>
+ <value>"red"</value>
+ </param>
+ <param>
+ <key>label2</key>
+ <value></value>
+ </param>
+ <param>
+ <key>marker2</key>
+ <value>0</value>
+ </param>
+ <param>
+ <key>style2</key>
+ <value>0</value>
+ </param>
+ <param>
+ <key>width2</key>
+ <value>1</value>
+ </param>
+ <param>
+ <key>alpha3</key>
+ <value>1.0</value>
+ </param>
+ <param>
+ <key>color3</key>
+ <value>"red"</value>
+ </param>
+ <param>
+ <key>label3</key>
+ <value></value>
+ </param>
+ <param>
+ <key>marker3</key>
+ <value>0</value>
+ </param>
+ <param>
+ <key>style3</key>
+ <value>0</value>
+ </param>
+ <param>
+ <key>width3</key>
+ <value>1</value>
+ </param>
+ <param>
+ <key>alpha4</key>
+ <value>1.0</value>
+ </param>
+ <param>
+ <key>color4</key>
+ <value>"red"</value>
+ </param>
+ <param>
+ <key>label4</key>
+ <value></value>
+ </param>
+ <param>
+ <key>marker4</key>
+ <value>0</value>
+ </param>
+ <param>
+ <key>style4</key>
+ <value>0</value>
+ </param>
+ <param>
+ <key>width4</key>
+ <value>1</value>
+ </param>
+ <param>
+ <key>alpha5</key>
+ <value>1.0</value>
+ </param>
+ <param>
+ <key>color5</key>
+ <value>"red"</value>
+ </param>
+ <param>
+ <key>label5</key>
+ <value></value>
+ </param>
+ <param>
+ <key>marker5</key>
+ <value>0</value>
+ </param>
+ <param>
+ <key>style5</key>
+ <value>0</value>
+ </param>
+ <param>
+ <key>width5</key>
+ <value>1</value>
+ </param>
+ <param>
+ <key>alpha6</key>
+ <value>1.0</value>
+ </param>
+ <param>
+ <key>color6</key>
+ <value>"red"</value>
+ </param>
+ <param>
+ <key>label6</key>
+ <value></value>
+ </param>
+ <param>
+ <key>marker6</key>
+ <value>0</value>
+ </param>
+ <param>
+ <key>style6</key>
+ <value>0</value>
+ </param>
+ <param>
+ <key>width6</key>
+ <value>1</value>
+ </param>
+ <param>
+ <key>alpha7</key>
+ <value>1.0</value>
+ </param>
+ <param>
+ <key>color7</key>
+ <value>"red"</value>
+ </param>
+ <param>
+ <key>label7</key>
+ <value></value>
+ </param>
+ <param>
+ <key>marker7</key>
+ <value>0</value>
+ </param>
+ <param>
+ <key>style7</key>
+ <value>0</value>
+ </param>
+ <param>
+ <key>width7</key>
+ <value>1</value>
+ </param>
+ <param>
+ <key>alpha8</key>
+ <value>1.0</value>
+ </param>
+ <param>
+ <key>color8</key>
+ <value>"red"</value>
+ </param>
+ <param>
+ <key>label8</key>
+ <value></value>
+ </param>
+ <param>
+ <key>marker8</key>
+ <value>0</value>
+ </param>
+ <param>
+ <key>style8</key>
+ <value>0</value>
+ </param>
+ <param>
+ <key>width8</key>
+ <value>1</value>
+ </param>
+ <param>
+ <key>alpha9</key>
+ <value>1.0</value>
+ </param>
+ <param>
+ <key>color9</key>
+ <value>"red"</value>
+ </param>
+ <param>
+ <key>label9</key>
+ <value></value>
+ </param>
+ <param>
+ <key>marker9</key>
+ <value>0</value>
+ </param>
+ <param>
+ <key>style9</key>
+ <value>0</value>
+ </param>
+ <param>
+ <key>width9</key>
+ <value>1</value>
+ </param>
+ <param>
+ <key>name</key>
+ <value>""</value>
+ </param>
+ <param>
+ <key>nconnections</key>
+ <value>1</value>
+ </param>
+ <param>
+ <key>size</key>
+ <value>32</value>
+ </param>
+ <param>
+ <key>tr_chan</key>
+ <value>0</value>
+ </param>
+ <param>
+ <key>tr_level</key>
+ <value>0.0</value>
+ </param>
+ <param>
+ <key>tr_mode</key>
+ <value>qtgui.TRIG_MODE_FREE</value>
+ </param>
+ <param>
+ <key>tr_slope</key>
+ <value>qtgui.TRIG_SLOPE_POS</value>
+ </param>
+ <param>
+ <key>tr_tag</key>
+ <value>""</value>
+ </param>
+ <param>
+ <key>type</key>
+ <value>complex</value>
+ </param>
+ <param>
+ <key>update_time</key>
+ <value>0.10</value>
+ </param>
+ <param>
+ <key>xmax</key>
+ <value>2</value>
+ </param>
+ <param>
+ <key>xmin</key>
+ <value>-2</value>
+ </param>
+ <param>
+ <key>ymax</key>
+ <value>2</value>
+ </param>
+ <param>
+ <key>ymin</key>
+ <value>-2</value>
+ </param>
+ </block>
+ <connection>
+ <source_block_id>analog_agc_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_agc_xx_0</source_block_id>
+ <sink_block_id>blocks_float_to_complex_1</sink_block_id>
+ <source_key>0</source_key>
+ <sink_key>0</sink_key>
+ </connection>
+ <connection>
+ <source_block_id>analog_const_source_x_0</source_block_id>
+ <sink_block_id>blocks_float_to_complex_1</sink_block_id>
+ <source_key>0</source_key>
+ <sink_key>1</sink_key>
+ </connection>
+ <connection>
+ <source_block_id>analog_nbfm_rx_0</source_block_id>
+ <sink_block_id>analog_agc_xx_0</sink_block_id>
+ <source_key>0</source_key>
+ <sink_key>0</sink_key>
+ </connection>
+ <connection>
+ <source_block_id>analog_sig_source_x_1</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>blocks_complex_to_float_0</source_block_id>
+ <sink_block_id>digital_binary_slicer_fb_0</sink_block_id>
+ <source_key>0</source_key>
+ <sink_key>0</sink_key>
+ </connection>
+ <connection>
+ <source_block_id>blocks_deinterleave_0</source_block_id>
+ <sink_block_id>blocks_uchar_to_float_0</sink_block_id>
+ <source_key>0</source_key>
+ <sink_key>0</sink_key>
+ </connection>
+ <connection>
+ <source_block_id>blocks_deinterleave_0</source_block_id>
+ <sink_block_id>blocks_uchar_to_float_0_0</sink_block_id>
+ <source_key>1</source_key>
+ <sink_key>0</sink_key>
+ </connection>
+ <connection>
+ <source_block_id>blocks_file_source_0</source_block_id>
+ <sink_block_id>blocks_deinterleave_0</sink_block_id>
+ <source_key>0</source_key>
+ <sink_key>0</sink_key>
+ </connection>
+ <connection>
+ <source_block_id>blocks_float_to_complex_0</source_block_id>
+ <sink_block_id>freq_xlating_fft_filter_ccc_0</sink_block_id>
+ <source_key>0</source_key>
+ <sink_key>0</sink_key>
+ </connection>
+ <connection>
+ <source_block_id>blocks_float_to_complex_1</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>blocks_multiply_xx_0</source_block_id>
+ <sink_block_id>low_pass_filter_0</sink_block_id>
+ <source_key>0</source_key>
+ <sink_key>0</sink_key>
+ </connection>
+ <connection>
+ <source_block_id>blocks_uchar_to_float_0</source_block_id>
+ <sink_block_id>blocks_float_to_complex_0</sink_block_id>
+ <source_key>0</source_key>
+ <sink_key>0</sink_key>
+ </connection>
+ <connection>
+ <source_block_id>blocks_uchar_to_float_0_0</source_block_id>
+ <sink_block_id>blocks_float_to_complex_0</sink_block_id>
+ <source_key>0</source_key>
+ <sink_key>1</sink_key>
+ </connection>
+ <connection>
+ <source_block_id>digital_binary_slicer_fb_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>digital_diff_phasor_cc_0</source_block_id>
+ <sink_block_id>blocks_complex_to_float_0</sink_block_id>
+ <source_key>0</source_key>
+ <sink_key>0</sink_key>
+ </connection>
+ <connection>
+ <source_block_id>digital_mpsk_receiver_cc_0</source_block_id>
+ <sink_block_id>digital_diff_phasor_cc_0</sink_block_id>
+ <source_key>0</source_key>
+ <sink_key>0</sink_key>
+ </connection>
+ <connection>
+ <source_block_id>digital_mpsk_receiver_cc_0</source_block_id>
+ <sink_block_id>qtgui_const_sink_x_1</sink_block_id>
+ <source_key>0</source_key>
+ <sink_key>0</sink_key>
+ </connection>
+ <connection>
+ <source_block_id>freq_xlating_fft_filter_ccc_0</source_block_id>
+ <sink_block_id>analog_nbfm_rx_0</sink_block_id>
+ <source_key>0</source_key>
+ <sink_key>0</sink_key>
+ </connection>
+ <connection>
+ <source_block_id>low_pass_filter_0</source_block_id>
+ <sink_block_id>digital_mpsk_receiver_cc_0</sink_block_id>
+ <source_key>0</source_key>
+ <sink_key>0</sink_key>
+ </connection>
+</flow_graph>
diff --git a/decoder/analyse_capture.py b/decoder/analyse_capture.py
new file mode 100755
index 0000000..69fd714
--- /dev/null
+++ b/decoder/analyse_capture.py
@@ -0,0 +1,132 @@
+#!/usr/bin/env python2
+# -*- coding: utf-8 -*-
+##################################################
+# GNU Radio Python Flow Graph
+# Title: Analyse RTLSDR capture
+# Author: HB9EGM
+# GNU Radio version: 3.7.13.5
+##################################################
+
+
+from gnuradio import analog
+from gnuradio import blocks
+from gnuradio import digital
+from gnuradio import digital;import cmath
+from gnuradio import eng_notation
+from gnuradio import filter
+from gnuradio import gr
+from gnuradio.eng_option import eng_option
+from gnuradio.filter import firdes
+from optparse import OptionParser
+import pmt
+
+
+class analyse_capture(gr.top_block):
+
+ def __init__(self):
+ gr.top_block.__init__(self, "Analyse RTLSDR capture")
+
+ ##################################################
+ # Variables
+ ##################################################
+ self.samp_rate = samp_rate = 2048000
+
+ self.taps = taps = firdes.low_pass(1.0/256, samp_rate, 3e3, 10e2, firdes.WIN_HAMMING, 6.76)
+
+ self.decim = decim = 16
+ self.audio_rate = audio_rate = int(32e3)
+
+ ##################################################
+ # Blocks
+ ##################################################
+ self.low_pass_filter_0 = filter.fir_filter_ccf(4, firdes.low_pass(
+ 1, audio_rate, 200, 20, firdes.WIN_HAMMING, 6.76))
+ self.freq_xlating_fft_filter_ccc_0 = filter.freq_xlating_fft_filter_ccc(decim, (taps), 145725e3-145700e3, samp_rate)
+ self.freq_xlating_fft_filter_ccc_0.set_nthreads(1)
+ self.freq_xlating_fft_filter_ccc_0.declare_sample_delay(0)
+ self.digital_mpsk_receiver_cc_0 = digital.mpsk_receiver_cc(2, 0, cmath.pi/100.0, -0.25, 0.25, 0.25, 0.04, 64, 64*64/4, 0.005)
+ self.digital_diff_phasor_cc_0 = digital.diff_phasor_cc()
+ self.digital_binary_slicer_fb_0 = digital.binary_slicer_fb()
+ self.blocks_uchar_to_float_0_0 = blocks.uchar_to_float()
+ self.blocks_uchar_to_float_0 = blocks.uchar_to_float()
+ self.blocks_multiply_xx_0 = blocks.multiply_vcc(1)
+ self.blocks_float_to_complex_1 = blocks.float_to_complex(1)
+ self.blocks_float_to_complex_0 = blocks.float_to_complex(1)
+ self.blocks_file_source_0 = blocks.file_source(gr.sizeof_char*1, './iq.raw', False)
+ self.blocks_file_source_0.set_begin_tag(pmt.PMT_NIL)
+ self.blocks_file_sink_0 = blocks.file_sink(gr.sizeof_char*1, './psk125.bit', False)
+ self.blocks_file_sink_0.set_unbuffered(False)
+ self.blocks_deinterleave_0 = blocks.deinterleave(gr.sizeof_char*1, 1)
+ self.blocks_complex_to_float_0 = blocks.complex_to_float(1)
+ self.analog_sig_source_x_1 = analog.sig_source_c(audio_rate, analog.GR_COS_WAVE, 588, 1, 0)
+ self.analog_nbfm_rx_0 = analog.nbfm_rx(
+ audio_rate=audio_rate,
+ quad_rate=samp_rate/decim,
+ tau=75e-6,
+ max_dev=5e3,
+ )
+ self.analog_const_source_x_0 = analog.sig_source_f(0, analog.GR_CONST_WAVE, 0, 0, 0)
+ self.analog_agc_xx_0 = analog.agc_ff(1e-4, 0.2, 1.0)
+ self.analog_agc_xx_0.set_max_gain(1)
+
+
+
+ ##################################################
+ # Connections
+ ##################################################
+ self.connect((self.analog_agc_xx_0, 0), (self.blocks_float_to_complex_1, 0))
+ self.connect((self.analog_const_source_x_0, 0), (self.blocks_float_to_complex_1, 1))
+ self.connect((self.analog_nbfm_rx_0, 0), (self.analog_agc_xx_0, 0))
+ self.connect((self.analog_sig_source_x_1, 0), (self.blocks_multiply_xx_0, 1))
+ self.connect((self.blocks_complex_to_float_0, 0), (self.digital_binary_slicer_fb_0, 0))
+ self.connect((self.blocks_deinterleave_0, 0), (self.blocks_uchar_to_float_0, 0))
+ self.connect((self.blocks_deinterleave_0, 1), (self.blocks_uchar_to_float_0_0, 0))
+ self.connect((self.blocks_file_source_0, 0), (self.blocks_deinterleave_0, 0))
+ self.connect((self.blocks_float_to_complex_0, 0), (self.freq_xlating_fft_filter_ccc_0, 0))
+ self.connect((self.blocks_float_to_complex_1, 0), (self.blocks_multiply_xx_0, 0))
+ self.connect((self.blocks_multiply_xx_0, 0), (self.low_pass_filter_0, 0))
+ self.connect((self.blocks_uchar_to_float_0, 0), (self.blocks_float_to_complex_0, 0))
+ self.connect((self.blocks_uchar_to_float_0_0, 0), (self.blocks_float_to_complex_0, 1))
+ self.connect((self.digital_binary_slicer_fb_0, 0), (self.blocks_file_sink_0, 0))
+ self.connect((self.digital_diff_phasor_cc_0, 0), (self.blocks_complex_to_float_0, 0))
+ self.connect((self.digital_mpsk_receiver_cc_0, 0), (self.digital_diff_phasor_cc_0, 0))
+ self.connect((self.freq_xlating_fft_filter_ccc_0, 0), (self.analog_nbfm_rx_0, 0))
+ self.connect((self.low_pass_filter_0, 0), (self.digital_mpsk_receiver_cc_0, 0))
+
+ def get_samp_rate(self):
+ return self.samp_rate
+
+ def set_samp_rate(self, samp_rate):
+ self.samp_rate = samp_rate
+
+ def get_taps(self):
+ return self.taps
+
+ def set_taps(self, taps):
+ self.taps = taps
+ self.freq_xlating_fft_filter_ccc_0.set_taps((self.taps))
+
+ def get_decim(self):
+ return self.decim
+
+ def set_decim(self, decim):
+ self.decim = decim
+
+ def get_audio_rate(self):
+ return self.audio_rate
+
+ def set_audio_rate(self, audio_rate):
+ self.audio_rate = audio_rate
+ self.low_pass_filter_0.set_taps(firdes.low_pass(1, self.audio_rate, 200, 20, firdes.WIN_HAMMING, 6.76))
+ self.analog_sig_source_x_1.set_sampling_freq(self.audio_rate)
+
+
+def main(top_block_cls=analyse_capture, options=None):
+
+ tb = top_block_cls()
+ tb.start()
+ tb.wait()
+
+
+if __name__ == '__main__':
+ main()
diff --git a/decoder/varidecode.py b/decoder/varidecode.py
new file mode 100755
index 0000000..11b0ed0
--- /dev/null
+++ b/decoder/varidecode.py
@@ -0,0 +1,113 @@
+#!/usr/bin/env python3
+import re
+import struct
+
+varicode = { # {{{
+ '1010101011' : '\x00', '1011011011' : '\x01',
+ '1011101101' : '\x02', '1101110111' : '\x03',
+ '1011101011' : '\x04', '1101011111' : '\x05',
+ '1011101111' : '\x06', '1011111101' : '\x07',
+ '1011111111' : '\x08', '11101111' : '\x09',
+ '11101' : '\x0A', '1101101111' : '\x0B',
+ '1011011101' : '\x0C', '11111' : '\x0D',
+ '1101110101' : '\x0E', '1110101011' : '\x0F',
+ '1011110111' : '\x10', '1011110101' : '\x11',
+ '1110101101' : '\x12', '1110101111' : '\x13',
+ '1101011011' : '\x14', '1101101011' : '\x15',
+ '1101101101' : '\x16', '1101010111' : '\x17',
+ '1101111011' : '\x18', '1101111101' : '\x19',
+ '1110110111' : '\x1A', '1101010101' : '\x1B',
+ '1101011101' : '\x1C', '1110111011' : '\x1D',
+ '1011111011' : '\x1E', '1101111111' : '\x1F',
+ '1' : ' ', '111111111' : '!',
+ '101011111' : '"', '111110101' : '#',
+ '111011011' : '$', '1011010101' : '%',
+ '1010111011' : '&', '101111111' : '\'',
+ '11111011' : '(', '11110111' : ')',
+ '101101111' : '*', '111011111' : '+',
+ '1110101' : ',', '110101' : '-',
+ '1010111' : '.', '110101111' : '/',
+ '10110111' : '0', '10111101' : '1',
+ '11101101' : '2', '11111111' : '3',
+ '101110111' : '4', '101011011' : '5',
+ '101101011' : '6', '110101101' : '7',
+ '110101011' : '8', '110110111' : '9',
+ '11110101' : ':', '110111101' : ';',
+ '111101101' : '<', '1010101' : '=',
+ '111010111' : '>', '1010101111' : '?',
+ '1010111101' : '@', '1111101' : 'A',
+ '11101011' : 'B', '10101101' : 'C',
+ '10110101' : 'D', '1110111' : 'E',
+ '11011011' : 'F', '11111101' : 'G',
+ '101010101' : 'H', '1111111' : 'I',
+ '111111101' : 'J', '101111101' : 'K',
+ '11010111' : 'L', '10111011' : 'M',
+ '11011101' : 'N', '10101011' : 'O',
+ '11010101' : 'P', '111011101' : 'Q',
+ '10101111' : 'R', '1101111' : 'S',
+ '1101101' : 'T', '101010111' : 'U',
+ '110110101' : 'V', '101011101' : 'W',
+ '101110101' : 'X', '101111011' : 'Y',
+ '1010101101' : 'Z', '111110111' : '[',
+ '111101111' : '\\', '111111011' : ']',
+ '1010111111' : '^', '101101101' : '_',
+ '1011011111' : '`', '1011' : 'a',
+ '1011111' : 'b', '101111' : 'c',
+ '101101' : 'd', '11' : 'e',
+ '111101' : 'f', '1011011' : 'g',
+ '101011' : 'h', '1101' : 'i',
+ '111101011' : 'j', '10111111' : 'k',
+ '11011' : 'l', '111011' : 'm',
+ '1111' : 'n', '111' : 'o',
+ '111111' : 'p', '110111111' : 'q',
+ '10101' : 'r', '10111' : 's',
+ '101' : 't', '110111' : 'u',
+ '1111011' : 'v', '1101011' : 'w',
+ '11011111' : 'x', '1011101' : 'y',
+ '111010101' : 'z', '1010110111' : '{',
+ '110111011' : '|', '1010110101' : '}',
+ '1011010111' : '~', '1110110101' : '\x7F' }
+ # }}}
+
+infile = open('./psk125.bit', mode='rb')
+
+# Initialize the loop
+bit_stream = ''
+
+# Read 1 byte at a time and add it to the bit stream.
+curr_bit = infile.read(1)
+while curr_bit != b"":
+ bit_stream = bit_stream+str(struct.unpack('B', curr_bit)[0])
+ curr_bit = infile.read(1)
+
+#print("Bit Stream:", bit_stream)
+
+# Use regular expression to separate the characters
+# by splitting on two or more 0s
+char_list = re.split('00+', bit_stream)
+#print("Character List:", char_list)
+
+# Use the dictionary to decode the characters
+output_str = ''
+for char in char_list:
+ if char in varicode:
+ output_str = output_str+varicode[char]
+
+start_ix = output_str.find("HB9G")
+
+if start_ix == -1:
+ start_ix = 0
+
+output_str = output_str[start_ix:]
+
+end_ix = output_str.rfind("Sat GPS=")
+if end_ix != -1:
+ while end_ix < len(output_str) and output_str[end_ix] != '\n':
+ end_ix += 1
+
+output_str = output_str[:end_ix]
+
+outfile = open('./psk125.txt', 'w')
+outfile.write(output_str)
+outfile.write("\n")
+