Napisałem i przetestowałem sobie program zamieniający kod Morsa na litery i cyfry.

Źródłem jest dźwięk nagrywany w czasie rzeczywistym lub z pliku WAV. Stosuję częstotliwość próbkowania 8000 lub 11025Hz.

Algorytm testowałem na http://websdr.ewi.utwente.nl:8901/ wyszukując transmisje Morsa lub na plikach dźwiękowych http://www.komsta.net/telegrafia .

Algorytmy w zasadzie mam dwa podobne lub jeden w dwóch wariantach, zależy, jak na to patrzeć. W każdym punkcie na wejściu jest sygnał spróbkowany, a na wyjściu jest sygnał spróbkowany po przetworzeniu i ten sygnał jest wejściem dla następnego punktu.

Pierwszy to algorytm bez sygnału referencyjnego:

  1. Sygnał wejściowy filtruję wąskim filtrem pasmowym FIR zawierający interesujący sygnał transmisji.
  2. Dla próbek przefiltrowanego sygnału obliczam poziom głośności w taki sposób, że dla każdej próbki jest to średnia arytmetyczna lub mediana lub maksymalna wartość z X wartości bezwzględnych ostatnich próbek (wartość X oraz sposób liczenia ustawiam w interfejsie).
  3. Na podstawie sygnału głośności otrzymuję sygnał dyskretny (poziom albo jest wysoki, albo jest niski) w taki sposób, że jeżeli sygnał jest głośniejszy od wartości A przez B kolejnych próbek, to stan sygnału dyskretnego zmienia się na wysoki, a jeżeli sygnał jest cichszy od wartości C przez D kolejnych próbek, to stan sygnału dyskretnego zmienia się na niski. Wartość A nie może być mniejsza od C, a wartości B i D mogą zaczynać się od 0, służą do eliminacji niechcianych krótkich impulsów.
  4. Otrzymuję sygnał dyskretny mający tylko 2 poziomy, który jest sygnałem wejściowym do dalszej analizy kodu na podstawie długości dźwięków i odstępów między nimi.

Drugi to algorytm z sygnałem referencyjnym:

  1. Sygnał wejściowy filtruję dwoma wąskimi filtrami pasmowymi FIR otrzymując dwa sygnały wejściowe. Jeden sygnał to sygnał zawierający transmisję kodem Morsa, a drugi to filtr na pobliskiej częstotliwości, na której jest sam szum tła.
  2. Dla obu sygnałów obliczam na bieżąco poziom głośności podobnie, jak w poprzednim algorytmie, czyli średnia/mediana/maksimum wartości bezwzględnych X ostatnich próbek
  3. Wytwarzam sygnał dyskretny (tylko dwa poziomy głośności, niski i wysoki) tak samo, jak w poprzednim algorytmie z tą różnicą, że progi zadziałania (wartości A i C) to nie poziom głośności danego sygnału, tylko stosunek głośności sygnału badanego do głośności sygnału referencyjnego wyrażony liczbą ułamkową od 1 w górę.
  4. Otrzymuję sygnał dyskretny do dalszego przetwarzania.

Testowałem oba algorytmy przy różnych parametrach i działają bardzo dobrze przy silnych i stabilnych sygnałach, jednak przy słabszych lub niestabilnych, ale słyszalnych (takich, że człowiek umiejący dekodować Morsa w głowie na słuch odczyta bez problemu) sygnałach nie bardzo sobie radzą, tzn, że w sygnale dyskretnym są zniekształcenia w postaci niechcianych zmian sygnału dyskretnego, co fałszuje analizator, dla którego jest przeznaczony sygnał. Dodatkowo wartości parametrów należy często korygować stosownie do odbieranego sygnału.

Czy można jakoś ulepszyć te algorytmy? Jakie algorytmy są stosowane w innych programach do odbioru kodu Morsa?

Szczególnie interesuje mnie algorytm od dźwięku wejściowego z odbiornika do otrzymania czystego sygnału zawierające dźwięki "kresek" i "kropek" bez zakłóceń. Z dalszym etapem dekodowania prawidłowo uformowanego sygnału poradziłem sobie sam, łącznie z automatycznym wykrywaniem prędkości nadawania.