diff options
-rw-r--r-- | decoder/README.md | 21 | ||||
-rw-r--r-- | decoder/analyse_capture.grc | 1676 | ||||
-rwxr-xr-x | decoder/analyse_capture.py | 132 | ||||
-rwxr-xr-x | decoder/varidecode.py | 113 |
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") + |