Decoding a 7-character ebnaut message on 6470Hz

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 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 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:


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
for t in 10 100
 echo a=$a t=$t
 vtblank -v -a$a -d0 -t$t < $PLIK2 | \ vtmult -f ${FREQ} | \ vtresample -r 240 > ${PLIK2}_${a}_${t}

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):

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.