Dekodowanie 7-znakowej wiadomości na 6470Hz

3 lipca 2017 roku Stefan DK7FC nadał 7-godzinną transmisję ebnaut zawierającą 7 znaków. Poprzednio byłem w stanie zdekodować2-3 znakowe transmisje wysłane w podobnym czasie, więc 7 znaków wydawało się być nie do odebrania. Artykuł pokazuje w jaki sposób ta transmisja została jednak zdekodowana i może być ciekawym przewodnikiem dla osób które zaczynają uzywać linuxa i/lub vlfrx-tools.

Transmisja miała takie parametry:

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

Do odbioru użyłem skryptu opisanego tu: Używanie vlfrx-tools

Niestety komunikat nie został zdekodowany poprawnie z ustawieniami vtblank jakich zwykle używam (-a2 -d0 -t 10). Plik resampled_file jest plikiem wygenerowanym przez skrypt do dekodowania ebnaut opisany w Używanie vlfrx-tools. Przetworzyłem ten plik za pomoca vtraw i ebnaut z dodaną opcją -f9 (skopiowałem ostatnią linijkę skryptu i dodałem parametr -f9 i logowanie do pliku o nazwie decwy):

$ vtraw -oa < resampled_file | ./ebnaut -d -N7 -p 16K21A -S 24 -k 5 -r240 -c2 -PS -v -L 20000 2>&1 |tee decwy

Spróbujmy wyodrębnić z tego pliku wszystkie możliwe komunikaty, posortować je i wybrać tylko te unikalne i policzyć je. Niestety przy tylko 5 bitach CRC mamy wiele możliwych komunikatów:

$ grep found decwy |cut -d \[ -f 2 |cut -d \] -f 1 |sort -u | wc -l
67495

67495 unikalnych komunikatów to jest za dużo aby obejrzeć każdy w nich i zadecydować który z nich wygląda “poprawnie”.

Spróbujmy trochę oszukać:  Paul Nicholson (który poprawnie zdekodował ten komunikat) napisał że jest to sławne nazwisko. Możemy przyjąć hipotezę, że komunikat zawiera tylko litery. Spróbujmy policzyć wszystkie możliwe komunikaty które zawierają tylko litery:

$ grep found decwy |cut -d \[ -f 2 |cut -d \] -f 1 |sort -u |egrep '^[A-Z]+$' |wc -l
352

352 komunikatów to nie tak dużo, więc możemy je obejrzeć i zadecydować który wygląda “sensownie”:

$ grep found decwy |cut -d \[ -f 2 |cut -d \] -f 1 |sort -u |egrep '^[A-Z]+$' | less

Jedyny komunikat który wygląda sensownie to: MARCONI 🙂

Z logu dekodera (plik decwy) wyciągnąłem najlepszy przypadek kiedy zdekodował się ten komunikat:

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

Spróbujmy teraz znaleźć optymalne ustawienia ogranicznika trzasków (vtblank). Te których używałem były optymalne dla 8270Hz, dla 6470Hz najlepsze mogą być zupełnie inne wartości. Wyodrębnimy plik o nazwie wskazanej przez zmienną PLIK2 zawierający segment 3kHz w okolicy 6470.1Hz. Następnie wypróbujemy kombinacje parametrów vtblank  -a (wypróbowałem 1.2 1.4 1.6 1.8 2 2.2 2.4 2.6) i -t (wypróbowałem 10 i 100) , zresamplujemy wynik do 240 sampli/s i umieścimy wynik w oddielnych plikach o nazwie takiej jak PLIK2, ale z dodanym do nazwy _A_T e (gdzie A jest wartością parametru -a ,  T jets wartością parametru -t).

Poniższy skrypt wykonuje te czynności:

#!/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

Stworzone zostały pliki o nazwach plik_dk7fc_20170603_1_raw1_XX_YY (gdzie XX jest parametrem -a vtblank , a YY jest parametrem -t vtblank). Dla każdego z tych plików sprawdźmy naszą hipotezę że komunikato to MARCONI. Użyjemy do tego ebnaut w trybie analizy:

$ 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

... skrypt pokazuje analizę dla każdego z tych plików. Wśród tych plików ten wydaje się być najlepszy (carrier Eb/N0 i carrier S/N są najlepsze):

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

Spróbujmy zdekodować  plik_dk7fc_20170603_1_raw1_1.4_100 bez opcji -f9 i zobaczmy czy dekoder znajdzie komunikat:

$ 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

Jak widać znalazł komunikat MARCONI za pierwszą próbą. Okazuje się że dla tej transmisji najlepsze ustawienia vtblank to -a1.4 -d0 -t100.

Ostatnio próbowałem przeszukiwać znacznie większy zakres parametrów vtblank dla innej transmisji na 6470.1Hz i okazuje się że optymalne wartości były dużo większe: vtblank -a 1.7 -t 8050 -d0. Być może opiszę to w innym artykule.