Analiza komunikatów ZEVS

Rosja do komunikacji ze swoimi podwodnymi okrętami atomowymi używa komunikacji w paśmie ELF na częstotliwości 82 Hz (tak: herce, nie kiloherce, nie megaherce). Nadajnik nazywa się ZEVS, więcej informacji tu: http://www.vlf.it/zevs/zevs.htm

Na stronie KLUBNL.PL uruchomiłem wiele lat temu grabber pokazujący widmo w okolicach 82Hz dostępny tu: https://klubnl.pl/wpr/index.php/klubnl-pl-grabbers/grabber-zevs-82hz/

Grabber liczy co 60s widmo w zakresie 80-84 Hz i wykonuje z tego wykresy. Pliki z widmem nie są kasowane, więc przez szczęśliwy przypadek dysponuję historią plików od 25 sierpnia 2021 roku do teraz (10 lipca 2022 roku).

A skoro już miałem dane, postanowiłem zrobić analizę jak wyglądają te komunikaty i jak często są nadawane.

Example ZEVS transmission
Widmo przykładowej transmisji ZEVS. Sygnał w okolicy 83.3-83.5Hz to lokalne zakłócenia

Co to jest ZEVS

ZEVS jest nadajnikiem zlokalizowanym na półwyspie Kola w Rosji. Nadaje on na częstotliwości około 82Hz.

Fale radiowe są w stanie wniknąć w przewodnik na głębokość proporcjonalną do długości fali (tzw efekt naskórkowości). Przy częstotliwości 82Hz długość fali to około 3500km, więc fale radiowe o tej częstotliwości potrafią wniknąć bardzo głęboko nawet w dobrze przewodzące medium. A takim przewodzącym medium jest też słona woda oceaniczna, w której głęboko schowana jest rosyjska flota atomowych okrętów podwodnych.

Jak wygląda transmiSja ZEVS

ZEVS używa modulacji MFSK (multiple frequency shift keying). Nadawane są 4-minutowe sygnały na częstotliwościach wokół 82Hz co 0.2Hz: 80.8Hz, 81.0Hz, 81.2Hz, 81.4Hz, 81.6Hz, 81.8Hz, 82.0Hz, 82.2Hz, 82.4Hz, 82.6Hz, 82.8Hz, 83.0Hz, 83.2Hz.

Komunikat zaczyna się sygnałem na 82Hz który trwa przynajmniej 4 minuty (czas jednego symbolu). Potem nadawane jest zwykle 7 symboli (o częstotliwości innej niż 82Hz). Następnie nadawane jest 82Hz przez przynajmniej czas jednego symbolu (zwykle dłużej), potem może być nadany kolejny komunikat.

Prędkość transmisji jest bardzo mała. Jeden symbol trwa 4 minuty, więc prędkość to 0.00416 baud. Jeden symbol może mieć 12 możliwych wartości (częstotliwości), więc wypadkowa prędkość transmisji jest  0.05 bit/s.

Przy tej prędkości transmisji możliwe są jedynie komunikaty typu “wynurz się i nawiąż z nami łączność” (czyli transmisji na wyższych częstotliwościach, albo łączności satelitarnej).

Analiza ZEVS

Grabber ZEVS używa vtnspec z pakietu oprogramowania vlfrx-tools. Moje skrypty produkują co 60 sekund pliki zawierające amplitudę i fazę sygnału na częstotliwościach w przedziale 80-84Hz. Pliki te nie są kasowane, więc mam historię od czasu uruchomienia grabbera (25 sierpnia 2021 roku).

Oprogramowanie do analizy dostępne jest na github: https://github.com/sq5bpf/zevs-analysis , surowe dane dostępne są na stronie https://klubnl.pl/zevs/ .

Nazwy plików to czas unixowy (sekundy od 1 stycznia 1970). Interesuje nas pierwsza kolumna – częstotliwość i czwarta kolumna – wartość skuteczna sygnału. Poniżej przykładowy fragment pliku:

80.00000800 2.080809e-05 -6.614392e-06 1.543902e-05
80.01667460 -9.690319e-07 -1.231563e-05 8.735385e-06
80.03334120 -1.651825e-05 -1.124793e-05 1.413097e-05
80.05000780 3.791154e-05 4.053642e-05 3.924593e-05
80.06667440 -1.471637e-05 5.985279e-06 1.123377e-05
80.08334100 -9.629256e-06 -3.050421e-05 2.261890e-05
80.10000760 2.780673e-05 -5.441355e-05 4.320908e-05
80.11667420 1.100251e-05 -1.696162e-05 1.429601e-05
80.13334080 -9.189010e-06 9.730371e-06 9.463563e-06
80.15000740 -1.405457e-05 1.576747e-05 1.493560e-05
80.16667400 1.738760e-05 -1.409283e-05 1.582618e-05
80.18334060 -1.262028e-05 1.509170e-05 1.391098e-05
80.20000720 8.167513e-06 -4.741268e-06 6.677870e-06

Napisałem skrypt parse_zevsdir.py pokazujący dla każdej częstotliwości ZEVS która częstotliwość (80.8Hz, 81.0Hz, 81.2Hz, 81.4Hz, 81.6Hz, 81.8Hz, 82.0Hz, 82.2Hz, 82.4Hz, 82.6Hz, 82.8Hz, 83.0Hz, 83.2Hz) ma najsilniejszy poziom sygnału. Kolumny to czas unixowy, częstotliwość, numer tej częstotliwości, stosunek poziomu sygnału na tej częstotliwości do średniego poziomu sygnału dla reszty częstotliwości. Poniżej przykładowy fragment pliku produkowanego przez ten program zevs_freqs_sort.txt:

1632377640 82.0 6 3.995966126481902
1632377700 82.0 6 4.556940016791662
1632377760 82.0 6 4.633025466806067
1632377820 82.0 6 3.3868055060207185
1632377880 82.0 6 4.740975119809921
1632377940 82.0 6 5.11617772048708
1632378000 81.8 5 4.459848476522538
1632378060 81.8 5 4.015745251712207
1632378120 81.8 5 4.694808175258413
1632378180 81.8 5 4.106103048877824
1632378240 81.0 1 3.5646719240089353
1632378300 81.0 1 3.615036406798705
1632378360 81.0 1 4.2008744417491215
1632378420 81.0 1 5.590069419164877
1632378480 82.2 7 3.146938764362389
1632378540 82.2 7 4.295193254532285
1632378600 82.2 7 4.868673065778755
1632378660 82.2 7 4.732058527394183
1632378720 80.8 0 4.15435113800186
1632378780 80.8 0 4.522000216433235

Drugi skrypt find_zevs_transmissions.py szuka w tych danych sekwencji:82Hz , komunikat z częstotliwości innych niż 82Hz, 82Hz. Kolumny w pliku wynikowym to: data i czas UTC, ilość tonów w komunikacie, częstotliwości tonów w komunikacie, częstotliwości zmienione na format tekstowy (każdej częstotliwości przyporządkowana jest jedna litera), ilość wystąpień tego komunikatu w pliku. Przykładowy fragment pliku produkowanego przez ten program zevs_messages.txt:

2021-08-26 04:08:00+00:00 | 7 tones: [81.8, 81.8, 81.8, 80.8, 81.8, 81.8, 81.8] fffAfff ( 1 )
2021-08-26 04:40:00+00:00 | 7 tones: [82.4, 81.6, 81.4, 80.8, 82.4, 81.6, 81.4] IEdAIEd ( 1 )
2021-08-27 06:04:00+00:00 | 7 tones: [81.4, 82.6, 82.6, 80.8, 81.4, 82.6, 82.6] djjAdjj ( 1 )
2021-08-27 06:36:00+00:00 | 7 tones: [82.6, 82.8, 81.0, 80.8, 82.6, 82.8, 81.0] jKbAjKb ( 1 )
2021-08-27 11:52:00+00:00 | 7 tones: [81.0, 81.0, 82.8, 80.8, 81.0, 81.0, 82.8] bbKAbbK ( 2 )
2021-08-27 22:48:00+00:00 | 7 tones: [82.2, 82.2, 81.0, 80.8, 82.2, 82.2, 81.0] hhbAhhb ( 1 )
2021-08-28 03:32:00+00:00 | 7 tones: [82.4, 81.0, 82.6, 80.8, 82.4, 81.0, 82.6] IbjAIbj ( 1 )
2021-08-29 05:16:00+00:00 | 7 tones: [81.6, 81.4, 81.8, 80.8, 81.6, 81.4, 81.8] EdfAEdf ( 1 )
2021-08-30 04:28:00+00:00 | 7 tones: [82.8, 81.0, 81.0, 80.8, 82.8, 81.0, 81.0] KbbAKbb ( 1 )
2021-08-31 03:48:00+00:00 | 7 tones: [81.0, 81.4, 82.8, 80.8, 81.0, 81.4, 82.8] bdKAbdK ( 1 )
2021-09-01 05:40:00+00:00 | 7 tones: [81.2, 83.0, 82.6, 80.8, 81.2, 83.0, 82.6] CljAClj ( 1 )
2021-09-10 07:28:00+00:00 | 7 tones: [82.4, 81.6, 81.0, 80.8, 82.4, 81.6, 81.0] IEbAIEb ( 1 )
2021-09-11 03:20:00+00:00 | 7 tones: [82.8, 83.0, 82.6, 80.8, 82.8, 83.0, 82.6] KljAKlj ( 1 )

Dzięki temu oprogramowaniu możemy znaleźć zarówno sekwencję tonów poszczególnych komunikatów, jak i wygenerować spektrogramy poszczególnych transmisji. I dzięki temu mamy przegląd typowych komunikatów ZEVS.

Typy komunikatów ZEVS

Najczęstszy komunikat zaczyna się od  częstotliwości 82Hz (czas symbolu 4 minuty), potem 7 symboli (częstotliwości inne niż 82Hz, czas symbolu 4 minuty), a potem znów 82Hz, zwykle przez dłuższy czas (wielokrotnie więcej niż 4 minuty). Ten typ kounikatu występuje najczęściej.

Często również nadawana jest częstotliwość 82Hz przez długi czas (nawet wielu godzin), potem  7 symboli, a potem znów 82Hz.

W wielu systemach stosujących sygnalizację MFSK stosowany jest dodatkowy ton sygnalizujący powtórzenie poprzedniego (repeat tone). W przypadku ZEVS nie jest to stosowane i widzimy tony podwójnej, lub nawet potrójnej długości. Poniżej widać trzy symbole o tej samej częstotliwości obok siebie:

Komunikaty mogą być wysyłane dosyć często, jeden po drugim. W takim przypadku po transmisji nadawane jest 82Hz, do czasu drugiego komunikatu. Poniżej widzimy nośną 82Hz, potem 7 symboli, potem znów nośną 82Hz, znów 7 symboli (najprawdopodobniej od drugiego komunikatu) i znów nośną 82Hz:

W niektórych przypadkach nośna 82Hz pomiędzy komunikatami skrócona jest do czasu jednego symbolu. Poniżej trzy komunikaty wysłane w krótkim czasie po sobie: długa nośna 82Hz, komunikat 7 symboli, 82Hz o długości 2 symboli, komunikat 7 symboli, 82Hz o długości jednego symbolu, komunikat 7 symboli, długa nośna 82Hz:

Okazuje się że zdarzają się komunikaty, które mają inną liczbę symboli niż 7. Poniżej nośna 82Hz, 2 symbole, nośna 82Hz, 7 symboli, nośna 82Hz. Nie wiemy czy to jest jeden komunikat, czy dwa komunikaty (z czego jeden ma tylko 2 symbole):

Możliwe są również komunikaty nie kończące się 82Hz. Poniżej jeden symbol 82Hz, 4 symbole komunikatu, długa przerwa, jeden symbol 82Hz, komunikat 7 symboli i długa nośna 82Hz. Nie wiem czy to jest próba odwołania komunikatu, czy w pierwszym komunikacie sygnał został stłumiony przez złą propagację (nie wygląda na to):

Sekwencja symboli w drugim komunikacie może być również inna niż 7 symboli. Poniżej mamy nośną 82Hz, 7 symboli, 1 symbol 82Hz, 8 dobrze widocznych symboli, 2 mniej widoczne symbole o częstotliwości 80.8Hz (nie można być pewnym czy to nie jest zakłócenie), nośna 82Hz:

Czasem również zdarzają się przeskoki częstotliwości poza częstotliwości normalnie używane przez ZEVS. Poniżej widać dodatkową częstotliwość która się pojawiła na początku czwartego symbolu. Nie wiem czy to jest zakłócenie, czy faktycznie zostało to nadawne przez ZEVS:

Jak często pojawiają się poszczególne komunikaty

Komunikaty powinny być zaszyfrowane, a więc losowe dla postronnego obserwatora.. W przedstawionej analizie pojedyńczy komunikat nie powtarza się częściej niż 3 razy (około 316 unikalnych komunikatów z 401 wykrytych).

Podsumowanie

Opublikowałem zestaw danych z nasłuchu ZEVS z okresu 9 miesięcy (z przerwami około 2 miesięcy). Opublikowałem również oprogramowanie które umożliwia automatyczną analizę tych danych:

  • znajdowanie częstotliwości transmicji ZEVS
  • znajdowanie komunikatów ZEVS
  • analiza i wizualizacja tych danych
  • przetworzenie wykrytych transmisji z powrotem na spektrogram, w celu oceny ich wiarygosności

Mam nadzieję że zostaną opublikowane inne zestawy danych do analizy np. z obserwatoriów geofizycznych lub od innych hobbystów.

Mam nadzieję że inni przeanalizują przedstawione dane i będą próbowali rozszerzyć lub podważyć te analizy. Zastosowane algorytmy analizy są dosyć naiwne. Dane wymagają przejrzenia ręcznego i znalezienia czy nie ma tam innych komunikatów, których nie wychwycił algorytm sprawdzający.

Jeśli użyjesz gdzieś tej pracy lub masz jakieś komentarze do niej, wyślij mi proszę maila

Autor: Jacek Lipkowski SQ5BPF  < sq5bpf (at) lipkowski.org >

Ten artykół jest opublikowany na licencji Attribution 4.0 International (CC BY 4.0)
https://creativecommons.org/licenses/by/4.0/