Elektroda.pl
Elektroda.pl
X

Search our partners

Please add exception to AdBlock for elektroda.pl.
If you watch the ads, you support portal and users.

Program do analizy widma, nadawania i odbioru kodu Morse'a

andrzejlisek 01 Nov 2016 12:52 12321 15
  • Program do analizy widma, nadawania i odbioru kodu Morse'a
    Zainteresowało mnie krótkofalarstwo i szukałem dobrego programu do dekodowania kodu Morse'a, który często i gęsto można usłyszeć na pasmach amatorskich i nie tylko.

    Ponieważ jestem programistą, napisałem dla siebie program, który umożliwia, a właściwie ułatwia dekodowanie kod Morse'a. Wcześniej myślałem o małym urządzeniu z AVR podłączanym do radia, który na wyświetlaczu miałby dekodować tekst, więc na komputerze chciałem opracować i przetestować algorytm. Okazało się, że sprawa jest trudniejsza, niż się wydawało, szczególnie w sytuacji, gdy odbierany sygnał jest słaby, ale słyszalny.

    Według głównych założeń, program miał działać i działa według algorytmu:
    1. Pobranie odbieranego dźwięku do analizy.
    2. Filtrowanie pasmowoprzepustowe w celu przepuszczenia częstotliwości sygnału, który mnie interesuje i odrzucenia innych sygnałów.
    3. Zamiana przefiltrowanego dźwięku zawierającego sygnały na postać binarną (w danej chwili czasu albo jest sygnał, albo go nie ma, bez rozróżniania głośności), istnienie lub nieistnienie dźwięku jest rozróżniane na podstawie głośności sygnału.
    6. Każdy sygnał i przerwa powinien mieć minimalną długość dobraną do parametrów samego przekazu, krótsze są odrzucane.
    5. Zachowywanie czasów trwania poszczególnych sygnałów i przerw między nimi w buforze.
    6. Mając zadaną lub obliczoną granice długości sygnałów i przerw, następuje podział sygnałów na krótkie (kropka) i długie (kreska), a przerwy na międzysygnałowe, międzyliterowe i międzywyrazowe.
    7. Mając sygnały określone jako kropki i kreski, przerwy określone jako międzysygnałowe, międzyliterowe i międzywyrazowe, w połączeniu ze słownikiem można odczytać nadawany przekaz.

    Okazało się, ze powyższy algorytm nie jest odporny na zmiany głośności odbioru spowodowane działaniem automatycznej regulacji wzmocnienia odbiornika. Z tego względu, wymyśliłem drugi, podobny algorytm, który korzysta z sygnału referencyjnego. Sygnał referencyjny to jest sygnał wejściowy przepuszczony przez filtr pasmowy o tak dobranych częstotliwościach granicznych, że przepuszczane pasmo zawiera szum tła. Wtedy rozróżnia się istnienie dźwięku i brak dźwięku na podstawie stosunku głośności sygnału głównego do głośności sygnału referencyjnego. Zmiana wzmocnienia odbioru zmienia głośność obu sygnałów, dlatego ten algorytm jest odporny na zmianę głośności i na zakłócenia impulsowe, które pojawiają się w obu sygnałach.

    W praktyce program mniej więcej działa, w czasie pracy trzeba mieć bezpośredni dostęp do parametrów filtrowania i formowania sygnałów, dlatego regulatory są wyświetlone w głównym oknie interfejsu. Pomimo dobrego dobrania parametrów zawsze pojawiają się błędy polegające na uformowanie krótkiego impulsu z powodu zakłóceń, pominięciu impulsów lub podziału impulsu na dwa krótkie w przypadku chwilowego osłabienia sygnału itp. Z tego samego powodu program na bieżąco maluje spektrogram i umożliwia bieżącą korekcję sygnałów. Najpierw są malowane zdekodowane impulsy, a dopiero podczas malowania kolejnej warstwy te impulsy wchodzą do dekodowania. Przez czas wyświetlania można poprawić impulsy klikając myszką.

    Mając na względnie brak ideału, doimplementowałem pętlę opóźniającą, dzięki której można spowolnić lub chwilowo wstrzymać odbiór, a potem go przyspieszyć, a także ponownie zdekodować informacje zgubione przed dobraniem parametrów filtrowania i odbioru. Siłą rzeczy, każdy odbiór jest rejestrowany w pliku WAV.

    Okazuje się, że program może służyć do czegoś więcej niż do dekodowania kodu Morse'a. Może służyć do oglądania widma dowolnego sygnału audio, a także teoretycznie do dekodowania RTTY, tylko musiałbym zaimplementować algorytm dekodujący RTTY na podstawie impulsów.

    Wielokrotnie testowałem teoretyczną zdolność algorytmu do dekodowania RTTY na WebSdr i wygląda obiecująco. RTTY można traktować jako sygnał szybko przeskakujący pomiędzy dwiema określonymi częstotliwościami zgodnie z zawartą informacją, a sygnał na jednej z tych częstotliwości trwa tyle, co wielokrotność jednostki, której długość zależy od parametrów sygnału i częstotliwości próbkowania. Wtedy można ustawić dekodowanie z sygnałem referencyjnym tak, że filtr sygnału głównego jest na jednej częstotliwości, a filtr sygnału referencyjnego na drugiej częstotliwości, a stosunek głośności do sygnału referencyjnego należy ustawić na 1.

    Myślę, że po RTTY nie ma sensu implementować innych kodować, bo jest masa innych programów służących do tego celu, więc nie ma po co dublować.



    Program jest napisany w C++ z użyciem Qt. Załączam program i opis do niego. Program jest przystosowany do pracy w rozdzielczości nie mniejszej niż 1280x1024 lub 1366x768. Jako filtry są stosowane filtry FIR typu "Brickwall" https://en.wikipedia.org/wiki/Sinc_filter#Brick-wall_filters

    Przy pierwszym uruchomieniu należy doświadczalnie dobrać parametry bufora wejściowego do swojego komputera tak, żeby wizualizowany sygnał był prawidłowy przy jak najmniejszym opóźnieniu.

    Może ktoś wie, jaki algorytm jest stosowany w innych programach i urządzenia do automatycznego dekodowania kodu Morse'a w trudnych warunkach odbioru? Nie chodzi tu o zabawki, które przyjmują sygnał dwustanowy z klucza lub przycisku, bo w nich nie ma problemu niestabilności sygnału i nie ma innych sygnałów towarzyszących, które trzeba odrzucić.

    Odbiór kodu Morse'a be sygnału referencyjnego:
    Program do analizy widma, nadawania i odbioru kodu Morse'a

    Odbiór kodu Morse'a z sygnałem referencyjnym:
    Program do analizy widma, nadawania i odbioru kodu Morse'a

    Odbiór RTTY w celu sprawdzenia potencjalnej zdolności algorytmu formującego sygnał dwustanowy, zamiana na tekst nie jest zaimplementowana:
    Program do analizy widma, nadawania i odbioru kodu Morse'a

    Wizualizacja nagrania muzycznego:
    Program do analizy widma, nadawania i odbioru kodu Morse'a

    Dobrym "poligonem" do testowania tego programu i każdego innego służącego do odbioru kodu Morse'a i RTTY wydaje się być http://websdr.ewi.utwente.nl:8901/.

    Oprócz wykonywania całej roboty, program może służyć do wspomagania odbioru, jak ktoś odbiera na słuch, to jak uciekną jakieś znaki, to może spojrzeć na spektrogram i je uzupełnić, a nawet "przewinąć" sygnał do tyłu w krokach 15 sekund i nieco przyspieszyć wizualizację, żeby uzupełnić to, co uciekło (np. znak wywoławczy korespondenta w paśmie amatorskim).

    Wysyłanie kodu Morse'a polega na generowaniu dźwięku o częstotliwości równej częstotliwości środkowej filtru sygnału głównego. Teoretycznie, można próbować "wyjść na eter" dysponując transceiverem wyposażonym w możliwość podłączenia do karty dźwiękowej tak, żeby nagrywać usłyszany sygnał, a generowany dźwięk sterował kluczem.

    Cool? Ranking DIY
    Can you write similar article? Send message to me and you will get SD card 64GB.
    About Author
    andrzejlisek
    Level 28  
    Offline 
    Has specialization in: informatyk
    andrzejlisek wrote 2821 posts with rating 434, helped 55 times. Live in city Poznań. Been with us since 2005 year.
  • #3
    andrzejlisek
    Level 28  
    deus.ex.machina wrote:
    Był jakiś szczególny powód dla którego nie skorzystałeś z Spectrum Lab http://www.qsl.net/dl4yhf/spectra1.html stworzonego właśnie do takich zadań?


    Nie było i nie ma szczególnego powodu, żeby korzystać lub nie korzystać z jakiegoś programu, ale też nie trafiłem na Spectrum lab. Testowałem FlDigi i program jest OK, więc nie zamierzam go kopiować. Teraz zainstalowałem Spectrum Lab, jak rozpoznam jego możliwości, to będę z niego również korzystać. Do analizy widma nadaje się dobrze.
  • #4
    Rasel
    Level 22  
    Do detekcji tonu na tle silnych zakłóceń zdecydowanie lepiej zastosować pętlę PLL niż filtry. Sprzętowo można to zrobić na układzie NE567. Budowałem wiele takich układów i w porównaniu z filtrami działają rewelacyjnie.
  • #6
    andrzejlisek
    Level 28  
    zaxoniec wrote:
    Hmm, kolejny krotkofalarz na skroty. Nie prosciej sie jednak tego Morse nauczyc i posluchac? Do detetekcji tonow i zaklócen , sa ......sluchawki ;)


    Jestem właśnie w trakcie nauki i dążę do odbioru na słuch bez korzystania z tego programu ani żadnego innego o podobnym zastosowaniu, a najlepiej bez komputera (chodzi o utrwalenie wybrzmiewania, a nie widoku znaków). Pomysł na ten program zrodził się dużo wcześniej, kiedy nie miałem jeszcze zamiaru robić licencji, a chciałem zobaczyć, co słychać na pasmach. Potem plany się zmieniły i robię licencję (egzamin za sobą, teraz czekam na formalności urzędowe) i stwierdziłem, że najlepiej to nauczyć się biegle posługiwać kodem Morsa używając tradycyjnego klucza sztorcowego. Tym bardziej, że eksperymenty wykazały, że zastosowany algorytm nie daje 100% pewności, tylko od 70 do 90% w zależności od jakości sygnału i ustawień. Ciekawe, jak radzą sobie aplikacje na Androida, które niby dekodują kod Morsa, czy lepiej, czy gorzej, niż mój program. Idę o zakład, że w aplikacjach na Androida nie ustawia się tylu parametrów, co w moim programie. Z PLL może kiedyś spróbuję, jak będzie wychodzić.

    Ostatnio zrobiłem taką próbę, że ten program puściłem testując jako wspomagacz, a nie zamiennik odbioru na słuch. Chodzi o to, że odbieram jakąś sekwencję na słuch, a jak jakiś znak uleci, to spojrzę na wizualizację i teoretycznie wiem, co przeleciało koło uszu. W praktyce, zauważyłem u siebie takie zjawisko, ze jak zobaczę na ekranie wizualizację przebiegu sygnału, w którym są widoczne krótkie i długie sygnały, to jeszcze nie wiem, jakie to są znaki. Dopiero, jak wyobrażę sobie, jak wybrzmiewa dana sekwencja sygnałów, to wtedy wiem, jaki to jest znak (obecnie znam wybrzmiewanie większości liter alfabetu i cyfr).

    PS. Stosuję metodę nauki, w której znaki wybrzmiewają w tempie 20 WPM z wydłużonymi przerwami między znakami.
  • #7
    ptero
    Level 22  
    Witam Wszystkich.
    Jeśli mogę się wtrącić, to:
    - Krótkofalowiec, nie krótkofalarz...
    - Miałem taki dekoder na AVR - cieeeeeenki....
    - Do nauki CW to polecam metodę Kocha, jest kilka programów, był też taki fajny programik "samouczący", który częściej powtarzał znaki, które wpisaliśmy błędnie - lecz nie pamiętam nazwy...
    - Na andku jest kilka programów, stawia się tel. obok odbiornika i można czytać. Chociaż też są słabej jakości... A raczej mało odporne na zakłócenia.
    - Na PC to polecam program Ham Radio Deluxe.
  • #9
    andrzejlisek
    Level 28  
    Rasel wrote:
    Do detekcji tonu na tle silnych zakłóceń zdecydowanie lepiej zastosować pętlę PLL niż filtry. Sprzętowo można to zrobić na układzie NE567. Budowałem wiele takich układów i w porównaniu z filtrami działają rewelacyjnie.


    Zacząłem gromadzić materiały na temat PLL, jak działa i trafiłem opis, który wydaje się wyczerpująco przedstawiać zasadę działania PLL.
    http://www.ire.pw.edu.pl/~wkazubski/PLL1.pdf

    Wydaje mi się, że taka pętla bardziej służy detekcji częstotliwości sygnału, niż sygnału/braku (np. częstotliwość nośna fali zmodulowanej). W dużym skrócie, jak dobrze rozumiem, na wejście wchodzi badany sygnał, a na wyjściu jest generator sinus, który generuje sygnał o tej samej częstotliwości, jak na wejściu. Rozumiem, że poprzez badanie zmian fazy dostraja się generator, żeby uśredniona różnica faz była stałą, ale co w sytuacji, gdy na wejściu nie ma sygnału, jest sam szum lub cisza?

    Próbuję napisać sobie program testowy pozwalający zrozumieć istotę pętli PLL i "wypracować" jej symulator, ale mam właśnie problem z generatorem. Kodu jeszcze nie wrzucam, bo nie jest na tyle "czysty", żeby można było go testować i o nim dyskutować, ale przedstawiam, jak podszedłem do problemu. Kod wrzucę dzisiaj wieczorem lub jutro. Jeszcze muszę potestować, bo coś źle wychodzi.

    1. Na wejściu jest plik WAV z sygnałem źródłowym. Do celów testowych przygotowałem cichy plik z kilkoma sygnałami sinus o stałej częstotliwości i amplitudzie. Botem przygotowałem drugi i trzeci, który zawiera ten sam dźwięk, ale po dodaniu szumu białego w celu "utrudnienia" detekcji i tym samym przetestowania algorytmu. Dźwięki są próbkowane z prędkością 8000Hz.
    2. Generator sygnału sinus działający w ten sposób, że mamy zmienną "Delta" i "State" typu "double". Na początku "State" ma wartość 0, a "Delta" ma wartość stałą >=0 i <2*Pi. Poszczególne próbki generuje się w kolejnych iteracjach pętli w ten sposób, że do "State" dodaje się wartość "Delta" i zapamiętuje jako nową wartość "State", a wartość kolejnej próbki, to sin(State)*Amplituda. Częstotliwość sygnału zależy od wartości zmiennej "Delta" (im większa, tym większa częstotliwość). Przy "Delta"=0 generator nie generuje sinusa, tylko sygnał stały o wartości zależnej od zmiennej "State".
    3. Mając w buforze pewną liczbę ostatnich iloczynów próbek sygnału z generatora i sygnału wejściowego obliczam średnią arytmetyczną tych wartości (uproszczony filtr dolnoprzepustowy, później pewnie zastąpię prawdziwym z https://en.wikipedia.org/wiki/Sinc_filter#Brick-wall_filters , ten algorytm już użyłem w programie będącym przedmiotem tego wątku) miałbym dobierać wartość zmiennej "Delta", żeby sterować częstotliwością generatora.
    4. Wartość zmiennej "Delta" jest bezpośrednim źródłem informacji o częstotliwości wychwyconego sygnału. Na podstawie wartości zmiennej "Delta" i częstotliwości próbkowania można obliczyć częstotliwość lub okres sygnału na potrzeby dalszego algorytmu, gdzie na wejście podaje się częstotliwość sygnału.

    Teoretycznie mam już pętlę PLL, ale właśnie w 3 punkcie jest problem. Jak wartość fazy (teoretycznie maksymalny zakres to od 0 do iloczynu maksymalnej amplitudy sygnału wejściowego i z generatora) przełożyć na zmianę kąta (zmienna "Delta") w generatorze? Podstawą wysterowania generatora jest wartość uzyskana w pkt 2. Próbowałem poprzez podanie uśrednionego sygnału z detektora fazy (pkt 2) pomnożonej przez różne stale wartości (mniejsze od 1 lub dzielenie przez duże liczby, co na jedno wychodzi), ale to w ogóle nie działa, na wyjściu jest sygnał niestabilny i stabilność zależy od amplitudy generatora. Próbowałem też dodać wartość stałą, żeby generator generował jakiś sygnał o bardzo niskiej częstotliwości w stosunku do sygnału badanego, ale też nie bardzo to działa. Czy to właśnie tą drogą powinienem eksperymentować, czy zupełnie inaczej? Czy w stabilnej pętli PLL (częstotliwość generatora równa częstotliwości sygnału wejściowego) różnica faz powinna wynosić zero, czy może być wartość stała różna od zera?

    Już przede mną ktoś coś takiego wymyślił https://www.inradio.pl/sklep/telegrafia/888/k...kowy-deszyfrator-telegrafii-cw-mfj-461-detail , pewnie w środku jest mikrokontroler, który z sygnału wejściowego podanego na przetwornik wychwytuje sygnały dźwiękowe.
  • #10
    deus.ex.machina
    Level 32  
    W PLL następuje porównanie fazy lokalnego VCO z faza innego sygnału podanego na wejście komparatora fazy - błąd na wyjściu komparatora fazy steruje lokalny VCO tak by zmniejszyć go do zera - przy różnicy faz równej zero oba przebiegi maja te sama częstotliwość.
  • #11
    andrzejlisek
    Level 28  
    deus.ex.machina wrote:
    W PLL następuje porównanie fazy lokalnego VCO z faza innego sygnału podanego na wejście komparatora fazy - błąd na wyjściu komparatora fazy steruje lokalny VCO tak by zmniejszyć go do zera - przy różnicy faz równej zero oba przebiegi maja te sama częstotliwość.


    Popróbowałem i już mam ogarnięte określanie fazy, filtrowanie (dla testów jest do wyboru średnia lub mediana). Nie mam jeszcze sterowania generatorem VCO. Generowanie sygnału fazy wydaje się działać. Zauważyłem już, że dla sygnału źródłowego i z generatora o tej samej częstotliwości jest stała różnica fazy, która zależy od różnicy fazy (czy sygnały są zgodne, czy w przeciwfazie). Jak wprowadzę plik z sygnałem 600Hz, to zarówno dla 599, jak i 601Hz sygnału odniesienia otrzymuje identyczny przebieg zmian fazy (generator wytwarza cały czas 599 lub 601Hz). W takim razie, jeżeli program ma daną wartość przesunięcia fazowego, to skąd ma wiedzieć, w którą stronę przesuwać częstotliwość, jeżeli dla 599 i 601 jest taki sam przebieg różnicy faz? Rozumiem, że tu jest ujemne sprzężenie zwrotne, ale jak to się realizuje w PLL? Innymi słowy, w jaki sposób częstotliwość pracy generatora zależy tutaj od fazy?

    We wzmacniaczach operacyjnych, w których też stosuje się ujemne sprzężenie zwrotne są dwa wejścia i kierunek zmiany napięcia na wyjściu ściśle zależy od tego, w którą stronę jest różnica napięcia na wejściach.

    Zgodnie z obietnica zamieszczam kod programu (własciwie kod przycisku "Start") i sam program, jaki udało mi się zrobić. Program wczytuje plik WAV zawierający 40000 próbek 16-bit mono (5 sekund przy próbkowaniu 8000).
    Dodatkowe parametry:
    - Frequency - Częstotliwość sygnału z generatora
    - Average length - Ilość ostatnich próbek wartości fazy do obliczania średniej lub mediany
    - Average - obliczanie średniej
    - Median - obliczanie mediany
    Po ustawieniu parametrów należy kliknąć "Start", na ekranie w górnej części jest narysowany plik źródłowy, a w dolnej jest narysowane przefiltrowane wyjście z detektora fazy. Rysunki są sporządzane w gęstości 50 próbek na piksel.
    Code: csharp
    Log in, to see the code
  • #12
    andrzejlisek
    Level 28  
    W rozwoju poszedłem w innym kierunku. Zamiast ulepszać algorytm, rozwinąłem możliwości wyświetlania spektrogramu poprzez dodanie możliwości wyświetlania w nowym oknie lub na pełnym ekranie. Wtedy spectrogram jest wzrokowym uzupełnieniem słuchowego odbioru przekazu, ale nadal dekoduje człowiek.

    Wydaje mi się, że takie podejście jest uzasadnione z następujących powodów:
    1. Odbiera i interpretuje nadal człowiek, tylko, że wzrokowo zamiast słuchowo.
    2. Przy szybkim nadawaniu widzi się kilka znaków wstecz, co ułatwia odbiór i zapisywanie tekstu, jest dużo mniejsze ryzyko gubienia liter i innych błędów.
    3. Jak się ma wprawę, to można odbierać przekaz kilku stacji nadających na pobliskich częstotliwościach, zauważyłem, że czasem, szczególnie w weekendy, w pasmach amatorskich przeznaczonych dla CW słyszy się kakofonię, wtedy można zobrazować wszystkie słyszane stacje jednocześnie i według uznania odbierać jedną lub dwie, lub nawet wszystkie.

    Do pójścia w tym kierunku zainspirowała mnie wizualizacja sygnału generowana przez program "Pileup Runner", a także miganie diory w takt sygnału w transceiverze Yaesu FT-857D, jak również wcześniejsze eksperymenty, tym bardziej, że podstawą działania programu jest wyświetlenie obrazu transmisji, żeby można było ustawić filtry i inne parametry automatycznego dekodowania.

    Udostępniam ulepszony program i zaktualizowaną zaktualizowany opis.
  • #13
    misiek323
    Level 2  
    Program nie uruchamia się pod Windows 7 x64.
  • #14
    andrzejlisek
    Level 28  
    Udostępniam kod źródłowy i binarny, zobacz, czy z tego się uruchamia:
    https://github.com/andrzejlisek/MorseCode

    Jakiś czas później opracowałem program wyświetlający samo widmo działający w przeglądarce i na komputerze i na smartfonie.
    https://github.com/andrzejlisek/AudioSpectrum
  • #15
    misiek323
    Level 2  
    Po ściągnięciu pliku [MorseCode-master.zip], rozpakowaniu i kliknięciu na [MorseCode.exe] nic się nie dzieje. Komputer chwilkę (może sekundę) się "zastanawia" i dalej, jakbym niczego nie kliknął. Menedżer zadań nie wykazuje żadnego uruchomionego pliku z folderu /bin_windows.
    System: Windows 7 Ultimate x64, service pack 1.
  • #16
    andrzejlisek
    Level 28  
    Nie mam dostępu do komputera z Windows 7 w jakiejkolwiek wersji, przed chwilą w ten sam sposób sprawdziłem na komputerze z Windows 10, na którym nigdy nie było ani Qt, ani tego programu i program ruszył bez problemu.

    Proponuję ponownie spróbować, ale umieszczając rozpakowane pliki w katalogu, w którym nie ma żadnych problemów z zapisem (na przykład na innym dysku niż dysk z systemem), bez polskich liter, i znaków specjalnych w nazwie, a sam program MorceCode.exe uruchomić jako administrator. Moim zdaniem, katalog powinien zawierać same litery (bez polskich), cyfry, spacje, znaki takie: ".,-_" i nic więcej (może jeszcze jakieś inne, ale widoczne na klawiaturze). Byś może program ma jakiś problem z polskimi znakami. Ja trzymam się wspomnianej konwencji od X lat, bo w niektórych programach zdarzały się problemy z odczytem katalogu lub nazwą ścieżki, jak w nazwie były polskie znaki.

    Jak i to się nie powiedzie, to proponuję zainstalować Qt Creator (instalator sam dociągnie sobie Qt) i spróbować w nim skompilować projekt i uruchomić. Może wyskoczy jakiś błąd, może problemem jest to, że program był kompilowany na Windows 8.