On 3 June 2017 Stefan DK7FC did an 7 hour ebnaut transmission on 6470Hz with 7 characters. Previously i’ve been able to receive 2-3 character massages sent in a similar amount of time, however 7 characters seemed to be unreceivable. This article shows how the message was decoded, and may be useful to people starting to use linux and/or vlfrx-tools.
The transmission had the following parameters:
f = 6470.100000 Hz Start time: 03.Jun.2017 3:00:00 UTC Symbol period: 24 s Characters: 7 CRC bits: 5 Coding 16K21A Duration: 7h, 8min, 48 sec Antenna current: ~ 440 mA
I used my usual receive setup, described here: Using vlfrx-tools
Unfortunately the message didn’t decode correctly at first with the noiseblanker settings i’ve used (-a2 -d0 -t 10). resampled_file is the file produced by the ebnaut decode script in the Using vlfrx-tools article. I’ve fed it to vtraw and ebnaut, but with the -f9 option (copied the last line of the script and added -f9 and logging to a file named decwy):
$ vtraw -oa < resampled_file | ./ebnaut -d -N7 -p 16K21A -S 24 -k 5 -r240 -c2 -PS -v -L 20000 2>&1 |tee decwy
Let’s extract all messages in the decwy file (the ebnaut decoder output), sort and display only unique messages and count them. Unfortunately with only 5 bits of crc there are many decodes:
$ grep found decwy |cut -d \[ -f 2 |cut -d \] -f 1 |sort -u | wc -l 67495
67495 of unique decodes is not good, we can’t sift through this manually and it will have a lot of valid looking messages.
Let’s cheat a bit: Paul Nicholson, who decoded the message, wrote that it is a famous name, so we can hypothesize that it will be only letters. Let’s extract all messages which are only letters:
$ grep found decwy |cut -d \[ -f 2 |cut -d \] -f 1 |sort -u |egrep '^[A-Z]+$' |wc -l 352
352 is much better, i can look through all of the messages manually:
$ grep found decwy |cut -d \[ -f 2 |cut -d \] -f 1 |sort -u |egrep '^[A-Z]+$' | less
And the only message which makes sense is MARCONI 🙂
I dug out the best message from the ebnaut decoder logs (decwy file):
found rank 13961 ber 4.0858e-01 Eb/N0 -1.4 M -8.404992819e-01 [MARCONI] ps[ 83 -90 -60 -90 -60] carrier phase: 5.1 deg carrier Eb/N0: -4.1 dB carrier Es/N0: -18.44 dB carrier S/N: 11.87 dB in 38.9 uHz, -32.24 dB in 1Hz, -66.22 dB in 2.5kHz elapsed 1334
Now let’s try to find the best noiseblanker settings. The ones which i’ve used have been optimised for 8270Hz, while the optimal settings for 6470Hz may be completely different. We’ll extract a 3kHz segment around 6470.1Hz to the filename set by the PLIK2 variable. Then we’ll try to loop through possible combinations of the vtblank -a (i’ve tried1.2 1.4 1.6 1.8 2 2.2 2.4 2.6) and -t (i’ve tried 10 and 100) parameters, resample to 240 samples/s, and put the result in files named like in PLIK2, but with _A_T appended to the name (where A is the value of the -a parameter, and T is the value of the -t parameter)
The following script does this:
#!/bin/bash PLIK2=plik_dk7fc_20170603_1_raw1 FREQ=6470.1 TT=2017-06-03_03:00:00,+25728 vtread -T$TT /mnt/rawvlf | vtfilter -h bp,f=${FREQ},w=3000 > $PLIK2 for a in 1.2 1.4 1.6 1.8 2 2.2 2.4 2.6 do for t in 10 100 do echo a=$a t=$t vtblank -v -a$a -d0 -t$t < $PLIK2 | \ vtmult -f ${FREQ} | \ vtresample -r 240 > ${PLIK2}_${a}_${t} done done
This will create files called plik_dk7fc_20170603_1_raw1_XX_YY (where XX is the -a vtblank setting and YY is the -t setting). Lets go through these files and see how they match our hypothesis that the message is MARCONI. For this we’ll use ebnaut in message analysis mode:
$ for i in plik_dk7fc_20170603_1_raw1_*; do echo $i; vtraw -oa < $i | ./ebnaut -d -N7 -p 16K21A -S 24 -k 5 -r240 -c2 -PS -v -L 20000 -f15 -f16 -M MARCONI; echo; done
... after a lot of output this one looks best (carrier Eb/N0 and carrier S/N is the highest):
plik_dk7fc_20170603_1_raw1_1.4_100 padded 0.267 seconds at end initial reference phase -0.2 amplitude 2.277e-02 carrier phase: 2.4 carrier Eb/N0: -2.7 dB carrier S/N: 13.28 dB in 38.9 uHz
Let's try to decode the plik_dk7fc_20170603_1_raw1_1.4_100 file without the -f9 option and see how that works:
$ vtraw -oa < plik_dk7fc_20170603_1_raw1_1.4_100 | ./ebnaut -d -N7 -p 16K21A -S 24 -k 5 -r240 -c2 -PS -v -L 200000 padded 0.267 seconds at end initial reference phase -0.2 amplitude 2.277e-02 prep [ 0 0 0 0 0] found rank 141 ber 4.1884e-01 Eb/N0 -2.4 M -6.664184332e-01 [MARCONI] ps [ 0 0 0 0 0] carrier phase: 2.6 deg carrier Eb/N0: -2.7 dB carrier Es/N0: -17.02 dB carrier S/N: 13.28 dB in 38.9 uHz, -30.82 dB in 1Hz, -64.80 dB in 2.5kHz elapsed 42
Yes, it works, and decodes the MARCONI message on the first try. Turns out that the best vtblank settings among the ones which were tested for this transmission were -a1.4 -d0 -t100.
Recently i've run a script to try to find the best noiseblanker parameters for a much wider range of parameters, and it turned out that the optimal parameters were much higher: vtblank -a 1.7 -t 8050 -d0. Maybe this will be described in another article.