Uwaga! Strona zawiera ilustracje w formacie SVG. Ilustracje te nie są wyświetlane przez przeglądarkę Internet Explorer.

Kodowanie i Transmisja Sygnałów

Zagadnienie 1

Modulacja BPSK

mgr inż. Grzegorz Kraszewski

Krótki opis obiektowego szkieletu programu do testowania modulacji cyfrowych

Obiektowy szkielet programu do testowania modulacji cyfrowych napisany jest w języku C++ i znajduje się w pliku kits.cpp. Jest to zestaw klas ułatwiających testowanie modulacji i demodulacji. Zestaw składa się z 2 klas. Klasa Dane dostarcza pseudolosowego ciągu bitów informacji, przy czym prawdopodobieństwo wystąpienia bitów 0 i 1 można regulować. Dokonuje się tego przez podanie prawdopodobieństwa wystąpienia jedynki jako parametru konstruktora. Każde wywołanie metody Dane::Bit() daje w wyniku kolejny bit danych pseudolosowych. Domyślną wartością prawdopodobieństwa wystąpienia jedynki jest 0.5, wtedy statystycznie w strumieniu danych jest tyle samo zer co jedynek.

Najważniejszą klasą jest klasa Sygnal. Zawiera ona w sobie cały system transmisji cyfrowej, a więc generator fali nośnej, modulator, kanał transmisyjny i demodulator. Generator fali nośnej to po prostu tablica nosna zawierająca 120 próbek funkcji sinus składających się na jeden okres. Tablica jest przygotowywana automatycznie w konstruktorze klasy Sygnal. Następnie dokonuje się modulacji sygnału w metodzie Sygnal::Moduluj(). Metoda ta zależy od wybranej modulacji i w każdym zadaniu trzeba napisać treść tej metody. Na bazie odebranych jako parametr bitów danych oraz tablicy fali nośnej, należy wypełnić tablicę sygnal okresem zmodulowanego sygnału. Wywołując w tym momencie metodę Sygnal::Zapisz() można zapisać do pliku „czysty” sygnał przed przejściem przez kanał transmisyjny. Kolejnym krokiem jest symulacja kanału transmisyjnego. Metoda Sygnal::Zaszumiaj() dodaje do zmodulowanego sygnału szum o rozkładzie gaussowskim i zadanej amplitudzie. Wywołanie metody Sygnal::Zapisz() po zaszumianiu pozwala zapisać do pliku przebieg sygnału po przejściu przez kanał transmisyjny.

Funkcja main() programu zawiera główną pętlę symulacyjną. Liczba jej obrotów określa ilość okresów fali nośnej, a więc i ilość przesłanych bitów. W każdym obrocie pętli następuje wygenerowanie kolejnego losowego bitu danych, modulacja, zaszumianie, demodulacja i porównanie bitu nadawanego z bitem odebranym. Opcjonalnie przed lub po zaszumianiu można zapisać okres sygnału do pliku. Plik ten można załadować do arkusza kalkulacyjnego, pamiętając o ustawieniu przy imporcie danych kropki, a nie przecinka jako znaku dziesiętnego. Następnie sporządzamy w arkuszu wykres, najlepiej liniowy bez zaznaczania punktów danych.

Generator szumu o gaussowskim rozkładzie prawdopodobieństwa

Do symulacji kanału transmisyjnego potrzebny jest nam generator szumu o rozkładzie prawdopodobieństwa amplitud w kształcie krzywej Gaussa. Taki szum, zwany „białym szumem gaussowskim” jest powszechnie używany przy analizie transmisji sygnałów. Dlaczego akurat taki? Wynika to z centralnego twierdzenia granicznego, które mówi, że szum będący sumą szumów generowanych przez wiele niezależnych źródeł, dąży do szumu gaussowskiego, jeżeli ilość tych źródeł dąży do nieskończoności. Ponieważ zdecydowana większość szumów w transmisji sygnałów (szumy naturalne, takie jak szum tła radiowego, szum termiczny, szum elementów elektronicznych) jest generowana przez bardzo wiele niezależnych źródeł, stąd ich gaussowski rozkład prawdopodobieństwa.

Skrypt na temat generowania szumu o rozkładzie pseudogaussowskim
Szkielet programu do badania rozkładu częstości próbek szumu
Klasa C++ generująca szum pseudogaussowski o zadanym zakresie amplitud

Modulacja BPSK

Modulacja BPSK (Binary Phase Shift Keying), jest najprostszą cyfrową modulacją fazy. Pozwala na przesłanie jednego bitu informacji w czasie trwania jednego okresu fali nośnej. Przejście do kolejnego bitu następuje w momencie przejścia fali nośnej przez zero. W zależności od wartości bitu informacyjnego okres fali nośnej jest odwracany w fazie (mnożony przez −1 lub nie). Kwestią umowną jest, czy odwrócenie fazy następuje dla bitu 0 czy 1.

Powyższy rysunek przedstawia jedną z dwóch realizacji analogowego modulatora BPSK. Warunkiem koniecznym poprawnej pracy modulatora jest synchronizacja zegara taktującego przesyłane dane cyfrowe z przejściami przez zero fali nośnej. W modulatorze programowym synchronizacja jest osiągnięta bardzo łatwo przez odczytywanie tablicy fali nośnej (jeden okres funkcji sinus) od zera dla każdego bitu danych. Sygnał cyfrowy jest przepuszczany przez układ NRZ (ang. Non Return to Zero), który usuwa składową stałą z sygnału i normalizuje jego amplitudę do wartości 1.0. Znormalizowany sygnał cyfrowy jest mnożony przez nośną, co daje na wyjściu sygnał zmodulowany BPSK.

Alternatywna realizacja modulatora BPSK używa klucza analogowego zamiast układu mnożącego. W zależności od wartości aktualnego bitu danych na wyjście przesłany jest okres nośnej odwrócony w fazie lub nie. Dzięki synchronizacji fali nośnej i danych cyfrowych, przełączenie klucza następuje w chwili przejścia sygnału nośnej przez zero.

Konstelacja sygnałowa

Sygnał zmodulowany modulacją BPSK, tak jak większość sygnałów w modulacjach cyfrowych, składa się z fragmentów funkcji sinus, której okres równa się taktowi modulacji (częstotliwość jest równa częstotliwości fali nośnej). W modulacjach fazowych zmienia się faza początkowa fragmentu, np. w modulacji BPSK może ona wynosić 0 lub 180 stopni. Fazę i amplitudę poszczególnych sygnałów wzorcowych możemy zaznaczyć na wykresie w układzie współrzędnych zespolonych, podobnie jak zaznaczamy fazy i amplitudy przebiegów sinusoidalnych na znanym z elektrotechniki wykresie wskazowym. Dla modulacji BPSK mamy dwa sygnały wzorcowe w0 i w1, zatem konstelacja sygnałowa ma dwa punkty. Amplituda (odległość od środka układu współrzędnych) dla obu wynosi 1, natomiast fazy 0 i π (180°). Konstelacja sygnałowa dla modulacji BPSK pokazana jest na rysunku po lewej.

Konstelacja sygnałowa posiada dwie warte wspomnienia cechy. Przede wszystkim odporność na szum modulacji z kluczowaniem fazy jest w przybliżeniu proporcjonalna do minimalnej odległości między dwoma punktami (przy założeniu, że prawdopodobieństwo wystąpienia każdego z punktów jest takie same). Po drugie obrócenie całej konstelacji o dowolny kąt wokół środka układu współrzędnych, nie zmienia szumowych i energetycznych właściwości modulacji. Dlatego np. modulacja BPSK z fazami π/2 (90°) i 3π/2 (270°) jest tak samo dobra jak ta „klasyczna” z fazami 0 i π. Natomiast modulacja z fazami 0 i π/2 będzie już gorsza dlatego, że odległość między punktami będzie wynosiła 1,4142 (pierwiastek z 2) a nie 2. Stosunek tych odległości wynosi 3 dB, na tej podstawie można oszacować, że dla zachowania tej samej stopy błędów, trzeba by w takiej „skopanej” modulacji nadawać z amplitudą +3 dB, co oznacza moc +6 dB, a więc 2 razy większą!

Jeżeli założymy jednakowe prawdopodobieństwo występowania poszczególnych punktów konstelacji w nadawanym sygnale to optymalne rozmieszczenie punktów konstelacji jest symetryczne względem środka układu współrzędnych. To proste – jeżeli zepsujemy symetrię przesuwając któryś punkt (i zachowując amplitudę), to któraś z odległości między nim, a jednym z pozostałych, stanie się mniejsza. A o odporności modulacji na szum decyduje najmniejsza z odległości...

Określenie stosunku sygnał/szum

Stosunek mocy sygnału do mocy szumu, wyrażany najczęściej w decybelach [dB] to jeden z podstawowych parametrów sygnału używany do oceny skuteczności modulacji cyfrowych i demodulatorów. Stosunek ten wyrażony jest znanym wzorem

W celu wyznaczenia stosunku sygnału do szumu w generowanym sygnale zaszumionym należy najpierw wyznaczyć łączną energię szumu i łączną energię sygnału czystego (przed zaszumieniem). Energia jakiegokolwiek przebiegu spróbkowanego to suma kwadratów jego próbek. Ponieważ w naszym modulatorze ilości próbek i okresy próbkowania szumu i czystego sygnału są takie same, więc stosunek mocy równy jest stosunkowi energii. Jeżeli więc wektor próbek sygnału oznaczymy jako s[i] a wektor próbek szumu jako n[i], to stosunek sygnał/szum wyrazi się następującym wzorem:

Przy dodawaniu do siebie kwadratów próbek należy zwrócić uwagę na problem związany z ograniczoną precyzją liczb zmiennoprzecinkowych typu double. Suma kwadratów próbek będzie ciągle narastać, co spowoduje, że po jakimś czasie dodając kwadrat kolejnej próbki będziemy dodawać bardzo małą liczbę do bardzo dużej. Spowoduje to błędy zaokrąglenia, a po jakimś czasie dodawana mała liczba będzie w ogóle pomijana. Problem ten można znacznie załagodzić, nie dodając kwadratu próbki bezpośrednio do całkowitej energii, ale najpierw licząc energię próbek w jednym okresie modulacji, a dopiero tak otrzymaną sumę dodając do energii całkowitej.

Zadania do wykonania

  1. Uzupełnić szkielet programu modulatorem BPSK (należy napisać implementację metody Sygnal::Moduluj()). Do zaliczenia niezbędne jest opisanie zasady działania zaprogramowanego modulatora.
  2. Za pomocą metody Sygnal::Zapisz() wygenerować do pliku 10 okresów nośnej zmodulowanej sekwencją pseudolosową. Wczytać dane do arkusza kalkulacyjnego i tworząc wykres sprawdzić poprawność działania modulatora. Do zaliczenia wymagana jest demonstracja poprawności działania.
  3. Zmodyfikować główną pętlę tak, aby przed zapisem do pliku sygnał został zaszumiony metodą Sygnal::Zaszumiaj(). Sprawdzić działanie generatora szumów dla różnych amplitud szumu. Do zaliczenia wymagane jest pokazanie zaszumiania dla różnych poziomów szumu.
  4. Korzystając z generatora pseudogaussowskiego i programu do liczenia rozkładu gęstości prawdopodobieństwa, zaobserwować jak wzrost ilości dodawań szumu (czyli wzrost ilości sumowanych źródeł) zmienia rozkład równomierny w rozkład gaussowski. Sporządzić wykresy rozkładu dla 1, 2, 4, 16 i 64 dodawań szumu. Na zaliczeniu należy zademonstrować wykresy i omówić sposób eksperymentalnego wyznaczania rozkładu gęstości prawdopodobieństwa szumu.
  5. Dodać do programu liczenie stosunku sygnał/szum dla generowanego sygnału. Na zaliczenie omówić zasadę liczenia tegoż stosunku.