środa, 30 grudnia 2015

Modulacja amplitudy w MATLABie i GNU/Octave

Aby przesłać informacje (np. dźwięk) drogą radiową zanim zostaną one wyemitowane w przez antenę musimy je zakodować w sygnale nośnym. Taki proces kodowania informacji to modulacja. Zasadniczo dysponujemy dwoma rodzajami modulacji sygnałów analogowych: modulacja amplitudy (AM) i modulacja kąta (PM i FM). Tutaj przedstawię praktyczną realizację najprostszej metody modulacji AM w pakiecie MATLAB (kod działa również w GNU/Octave).

Zanim jednak przejdziemy do programowania przypomnijmy trochę teorii. Modulacja amplitudy polega na takiej modyfikacji fali nośnej, że sygnał zostaje uwidoczniony w zmianach jej amplitudy. Oznacza to, że do odzyskania (demodulacji) sygnału wystarczy np. wyznaczyć obwiednię zmodulowanej w ten sposób fali nośnej. Jest to proces dobrze poznany i istnieją praktyczne realizacje prostych układów elektronicznych realizujące taką funkcjonalność. 

Wzór realizujący modulację amplitudy wygląda tak:

am(t)=carrier(t)+carrier(t)*signal(t)
 
po przekształceniu mamy:

am(t)=carrier(t)*[1+signal(t)]

gdzie:
t - chwila czasowa
signal(t) - funkcja zwracająca wartość sygnału w chwili t
carrier(t) - fala nośna

Jak widać od strony matematycznej jest to bardzo prosta operacja polegająca na sumowaniu (w zadanej chwili czasowej) wartości amplitudy fali nośnej oraz iloczynu wartości amplitud fali nośnej i sygnału.

Przyjrzyjmy się teraz bliżej naszej fali nośnej. Najczęściej (jeśli nie zawsze) jest to prosta sinusoida o określonej częstotliwości i amplitudzie:

carrier(t)=Ac*sin(2*π*Fc*t)

gdzie:
Ac - amplituda fali nośnej
Fc - częstotliwość fali nośnej
Sygnał niosący informacje, którym chcemy zmodulować naszą nośną również dla prostoty można przedstawić w postaci sinusoidy o założonej częstotliwości:

signal(t)=As*sin(2*π*Fs*t)

gdzie:
As - amplituda sygnału
Fs - częstotliwość sygnału
Nasz sygnał rzecz jasna nie musi być sinusoidą i w praktycznych zastosowaniach rzadko kiedy nią jest. Może to być dowolna funkcja lub nawet arbitralny ciąg próbek wyrażony w dziedzinie czasu t.

Podczas dobierania wartości amplitud zarówno fali nośnej jak i sygnału należy pamiętać o współczynniku głębokości modulacji m:

m=As/Ac

wartość tego współczynnika powinna zawierać się w zakresie (0;1), tzn nie powinno się nigdy zdarzyć, że amplituda sygnału będzie większa od amplitudy nośnej. W takim wypadku następuje przemodulowanie i nie będzie możliwe prawidłowe zdemodulowanie sygnału. Typowo wartość tego wpółczynnika przyjmuje się ~0.8.

Idźmy dalej. Potrzebujemy dwóch parametrów związanych z czasem: częstotliwości próbkowania oraz czasu trwania sygnału. Wprawdzie koncepcyjnie cały czas jesteśmy w dziedzinie sygnałów analogowych, jednak obliczenia wykonujemy na komputerze, który rozumie jedynie dane dyskretne. Zatem naszą częstotliwość próbkowania oznaczmy jako:

sampling_freq=10000    % 10000Hz

za czas trwania sygnału przyjmijmy 1 sekundę:

t=0:1/sampling_freq:1    % 1s

W tej chwili właściwie mamy już wszystkie dane potrzebne do napisania działającego programu i przeprowadzenia symulacji. Wygląd zmodulowanej fali nośnej przedstawia się następująco:


Kompletny kod MATLAB/Octave:

Oczywiście MATLAB dostarcza gotowe funkcje realizujące wszelkie możliwe modulacje (ammod, fmmod, pmmod, itp.). Tutaj jednak chciałem krok po kroku pokazać na czym taka modulacja polega.

1 komentarz: