Instrukcja do laboratorium z cyfrowego przetwarzania sygnałów

Transkrypt

Instrukcja do laboratorium z cyfrowego przetwarzania sygnałów
DSP-MATLAB, Ćwiczenie 1,  P.Korohoda, KE AGH
Instrukcja do laboratorium z cyfrowego przetwarzania sygnałów
Ćwiczenie 1
Sygnały z czasem dyskretnym i podstawy korzystania z pakietu MATLAB
 Przemysław Korohoda, KE, AGH
Zawartość instrukcji:
1 Materiał z zakresu DSP
2 Korzystanie z pakietu MATLAB
3 Zadania do wykonania
4 Dodatek teoretyczny nr 1 - Próbkowanie i odtwarzanie sygnałów ciągłych twierdzenie o minimalnej częstotliwości próbkowania
1
DSP-MATLAB, Ćwiczenie 1,  P.Korohoda, KE AGH
Laboratorium Cyfrowego Przetwarzania Sygnałów (ang. skrót DSP = Digital Signal Processing) w
znacznej mierze bazuje na oprogramowaniu MATLAB funkcjonującym w systemie Windows, na
komputerze klasy PC. Dlatego też oprócz wiedzy z zakresu DSP, do poprawnej realizacji ćwiczeń
konieczna jest znajomość podstaw korzystania z komputera PC z systemem okienkowym (Windows) oraz
pakietu MATLAB. Zakłada się, że pierwszy z wymienionych elementów studenci mają już opanowany,
natomiast wybrane elementy obsługi pakietu MATLAB będą stopniowo wprowadzane w ramach kolejnych
ćwiczeń. Przygotowanie się do ćwiczeń może być w tym zakresie ułatwione dzięki korzystaniu z dostępnej
literatury, np.:
Mrozek B., Mrozek Z.: MATLAB 5.x, SIMULINK 2.x - poradnik użytkownika, PLJ, Warszawa 1998.
Na instrukcję składają się następujące części:
1 Materiał z zakresu DSP
2 Korzystanie z pakietu MATLAB
3 Zadania do wykonania
4 Dodatek teoretyczny nr 1 - materiał przypominający i uzupełniający
Do sprawnego wykonania ćwiczenia nie jest konieczna wcześniejsza praktyczna znajomość pakietu
MATLAB, jednak niezbędna jest dobra orientacja w materiale przedstawionym w częściach 1 oraz 2.
Dlatego też wskazane jest dokładne przeczytanie tych części oraz przemyślenie podanych przykładów.
UWAGA: znajomość i zrozumienie części 1 oraz 2 mogą zostać przez prowadzącego skontrolowane w
trakcie zajęć.
“Znajomość i zrozumienie” materiału podanego w Dodatku nr 1 nie jest w tym ćwiczeniu niezbędna, jednak
stanowi wprowadzenie do późniejszych ćwiczeń i dlatego nie warto tego odkładać “na potem”. W razie
niejasności należy skonsultować się przed zajęciami ( tzn. na przykład w terminie konsultacji )
z prowadzącym, bezpośrednio lub poprzez e-mail:
[email protected]
2
DSP-MATLAB, Ćwiczenie 1,  P.Korohoda, KE AGH
1 Materiał z zakresu DSP
Sygnał cyfrowy jest to ciąg liczb zapisanych z określoną precyzją, którym przypisane są indeksy.
Zazwyczaj indeksy są kolejnymi liczbami całkowitymi z przedziału zawartego w zakresie od minus do plus
nieskończoności. W przypadku ćwiczeń z wykorzystaniem pakietu MATLAB precyzja zapisu danych
liczbowych jest kilkubajtowa i w większości przypadków będzie ją można uznać za niemal nieskończoną.
Sygnał, w którym dyskretyzacji poddano jedynie dziedzinę, nazywa się często sygnałem z czasem
dyskretnym. Słowo “czas” należy tutaj rozumieć umownie, gdyż wspomniany sygnał może na przykład
reprezentować temperaturę wody jeziora w zależności od (zdyskretyzowanej) głębokości. W dalszej części
instrukcji termin “sygnał cyfrowy” będzie oznaczał przybliżenie sygnału z czasem dyskretnym z
dokładnością ograniczoną do skończonej precyzji pakietu MATLAB.
Należy pamiętać, że w rzeczywistych systemach cyfrowych precyzja zapisu odgrywa znaczną rolę w
projektowaniu algorytmu DSP. Poznaniu tych zagadnień będą służyły ćwiczenia z wykorzystaniem
sprzętowego pakietu MOTOROLI z procesorem stałoprzecinkowym.
Sygnał cyfrowy może pochodzić z próbkowania i przetwarzania analogowo-cyfrowego sygnału ciągłego.
Może jednak również powstać wprost w postaci ciągu liczb określonego w jakiś inny sposób. Przykładowo
można przyjąć, że ciąg liczb całkowitych od 1 do 10 o indeksach od -5 do +4 jest sygnałem cyfrowym, bez
konieczności wiązania tego ciągu z jakimkolwiek sygnałem ciągłym. Przy tak określonym przedziale
indeksów zakłada się zazwyczaj, że poza nim wartości sygnału są zerowe:
x[ −5] = 1; x[ −4] = 2; x[ −3] = 3; x[ −2] = 4; x[ −1] = 5; x[0 ] = 6; x[1] = 7; x[2] = 8;
(1)
x[3] = 9; x[4] = 10;
x[n] = 0 dla n ∉ {−5, − 4,  , 3, 4}
Dygresja:
Zapis indeksu w nawiasie kwadratowym jest stosowany dla podkreślenia, że jest to zdyskretyzowana
zmienna niezależna. Jednak w notacji MATLAB’a nawias kwadratowy służy do opisu zawartości (a nie
indeksów) macierzy - patrz przykłady w części 2 - natomiast indeksy podaje się w nawiasach okrągłych.
Należy więc rozróżniać zapis za pomocą wzoru od zapisu elementu syntaktycznego MATLAB’a.
Zatem sygnał cyfrowy można przedstawić w postaci układu dwóch wektorów o tej samej długości: wektora
wartości ciągu oraz wektora indeksów. Dla powyższego przykładu (zapis wektorów już w notacji
MATLAB’a):
x = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
n = [ −5, − 4, − 3, − 2, − 1, 0, 1, 2, 3, 4]
(2)
W przypadku domniemanego wydłużenia powyższego fragmentu sygnału zerami zapis (2) można w razie
potrzeby zastąpić na przykład takim:
x = [0, 0, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 0, 0]
n = [ −8, − 7, − 6, − 5, − 4, − 3, − 2, − 1, 0, 1, 2, 3, 4, 5, 6]
(2a)
Niekiedy przyjmuje się, że podany ciąg reprezentuje fragment sygnału okresowego - jak w takiej sytuacji
wyglądałoby przedstawienie dłuższego fragmentu sygnału?
3
DSP-MATLAB, Ćwiczenie 1,  P.Korohoda, KE AGH
Sygnał
x[n] można przedstawić również na wykresie:
Rys. 1.1. Wykres przykładowego sygnału z “czasem” dyskretnym
Niekiedy dla potrzeb pewnych rozważań wystarczy rozpatrywać jedynie wartości ciągu i wówczas do opisu
sygnału cyfrowego wystarczy wektor x . Naturalnie w pakiecie MATLAB nie jest konieczne używanie
nazw x oraz n , jednak z punktu widzenia wymiany informacji z pozostałymi studentami oraz z
prowadzącym korzystne jest stosowanie się do pewnej umowy.
Jeżeli sygnał cyfrowy traktujemy domyślnie jako pochodzący z sygnału ciągłego określonego w czasie, to
indeksy można nazwać indeksami czasowymi. Związek pomiędzy sygnałem ciągłym x C ( t ) - określonym
dla dziedziny t - a cyfrowym - określonym przez idealne równomierne próbkowanie z okresem
przedstawić następująco:
x[n] = x C (n ⋅ T )
T - można
(3)
Określonemu ciągowi x[ n] może odpowiadać nieskończenie wiele sygnałów ciągłych. Jednak jeżeli
założymy, że sygnały ciągłe spełniają pewien warunek (patrz twierdzenie o próbkowaniu w dodatku
teoretycznym nr 1), to związek (3) jest obustronnie jednoznaczny.
Warto podkreślić, że powszechnie stosuje się dwie interpretacje słowa “próbkowanie”:
a) z punktu widzenia teorii sygnałów jest to pomnożenie danego sygnału (funkcji) ciągłego przez ciąg delt
Diraca (czyli pseudo-funkcję określoną na tej samej, co próbkowana funkcja, ciągłej dziedzinie ) wynikiem jest zmodulowana amplitudowo pseudo-funkcja x S ( t ) , w dalszym ciągu określona na
dziedzinie ciągłej:
x S (t ) = x C (t ) ⋅ g T (t ) : g T (t ) =
+∞
∑ δ (n ⋅ T − t )
(4)
n =−∞
x S (t ) =
+∞
∑x
C
(n ⋅ T ) ⋅ δ (n ⋅ T − t )
(5)
n =−∞
b) z punktu widzenia zastosowań praktycznych oznacza to utworzenie ciągu wartości chwilowych sygnału
ciągłego (wzór (3)) - wynikiem jest zatem ciąg wartości z odpowiednimi indeksami.
4
DSP-MATLAB, Ćwiczenie 1,  P.Korohoda, KE AGH
Rys. 1.2. Dwie interpretacje pojęcia próbkowania: a) przez pomnożenie z funkcją grzebieniową,
b) przez utworzenie ciągu z wartości chwilowych próbkowanej funkcji
Pomiędzy oboma powyższymi podejściami istnieje ścisły związek, umożliwiający wykorzystanie teorii
sygnałów do opisu właściwości próbkowania w wersji b). Wartości ciągu x[ n] odpowiadają amplitudom
odpowiednich delt Diraca otrzymanym w wyniku próbkowania w wersji a). Z punktu widzenia rozmaitych
rozważań różnica nie jest istotna, jednak chcąc, przykładowo, stosować ścisłe zależności matematyczne do
wykazania powiązań pomiędzy sygnałem cyfrowym i ciągłym, należy o niej pamiętać.
Pakiet MATLAB w swojej podstawowej wersji nie ma możliwości tworzenia zmiennych będących
funkcjami ciągłymi. Można jednak określić ciąg cyfrowy korzystając z przepisu funkcji ciągłej
spróbkowanej w równych odstępach dziedziny (czyli “czasu”):
 2 ⋅π ⋅ n ⋅ T
x C [n] = cos
T1


− ϕ

(6)
W rozważaniach z zakresu DSP istotną rolę odgrywa pewien sygnał, którego nie otrzyma się z próbkowania
żadnego rzeczywistego sygnału ciągłego - ciąg spróbkowanej zespolonej funkcji eksponencjalnej:
xe [ n ] = e
 j⋅2⋅π ⋅n⋅T

− ϕ

T1


(7)
gdzie j to jednostka urojona. Sygnał cyfrowy xe[ n] jest zatem zespolony.
Jak wynika z powyższych stwierdzeń, w celu przygotowania się do ćwiczeń należy sobie również
powtórzyć podstawowe wiadomości z zakresu liczb zespolonych.
5
DSP-MATLAB, Ćwiczenie 1,  P.Korohoda, KE AGH
Dwa inne, istotne z punktu widzenia teorii DSP sygnały cyfrowe to:
1) delta Kroneckera:
1 dla n = 0
d [ n] = 
0 dla n ≠ 0
(8)
1 dla n ≥ 0
u[n] = 
0 dla n < 0
(9)
2) skok jednostkowy:
Skok jednostkowy można wyrazić za pomocą kombinacji liniowej delt Kroneckera (proszę się nad tym
wzorem zastanowić):
n
∑ d[k ]
u[n] =
(10)
k =−∞
Przesunięcie w dziedzinie indeksów (np. czasowych) oznacza, że sygnał poddany jest następującej zmianie:
nienie o k

→ x[n − k ]
x[n] opoź
(11)
Korzystając z (11) można wyrazić deltę Kroneckera za pomocą kombinacji liniowej przesuniętych skoków
jednostkowych - jak?
Inną ciekawą zależnością jest wyrażenie dowolnego ciągu za pomocą kombinacji liniowej przesuniętych
delt Kroneckera (warto ten wzór zrozumieć):
x[n] =
∞
∑ x[ k ] ⋅ d [n − k ]
(12)
k =−∞
W zapisach takich jak (10) lub (12) należy zwrócić uwagę na oznaczenie indeksów. Jeżeli użyjemy litery
“n” dla indeksu sygnału po lewej stronie, to, jeśli tylko sygnał ten nie jest ciągiem stałym, litera ta musi się
pojawić gdzieś po prawej stronie zależności. Ponadto żadna operacja typu sumowanie nie może być
realizowana po indeksie oznaczonym taką literą. Zatem na przykład taki zapis:
0
x[n] =
∑ y[n]
(13)
n =−∞
byłby najprawdopodobniej efektem pomyłki, gdyż oznacza, że x[n] jest stałe (nie zależy od “n”). Jeżeli
jednak jesteśmy w pełni świadomi tego, jak powinna wyglądać dana zależność, to nic poza przyjętą umową
nie wymusza stosowania takich, a nie innych, liter dla oznaczenia indeksów. Zależność (12) będzie nadal
słuszna, gdy zapiszemy ją na przykład tak:
x[ k ] =
∞
∑ x[n] ⋅ d [ k − n]
(12b)
n =−∞
W przypadku indeksów delt Kroneckera kolejność indeksów k oraz n we wzorze (12) lub (12b) nie ma
żadnego znaczenia (dlaczego?).
6
DSP-MATLAB, Ćwiczenie 1,  P.Korohoda, KE AGH
2 Korzystanie z pakietu MATLAB
MATLAB jest środowiskiem programistycznym, w którym dane liczbowe reprezentowane są w postaci
macierzy. Dlatego też należy przypomnieć sobie podstawowe wiadomości z zakresu rachunku
macierzowego - w szczególności mnożenie. Ponadto warto zwrócić uwagę na to, że
a) pojedyncza liczba to macierz o jednym wierszu i jednej kolumnie,
natomiast
b) ciąg liczb można przedstawić w postaci wektora wierszowego lub kolumnowego (z punktu widzenia
obliczeń macierzowych różnica jest w tym przypadku istotna).
Zapis macierzowy jest szczególnie wygodny w przedstawianiu operacji z zakresu DSP i dlatego też pakiet
MATLAB jest dobrym narzędziem do poznawania tej dziedziny.
Zestawienie najważniejszych uwag i spostrzeżeń:
• Praca z programem MATLAB może polegać na uruchamianiu opracowanych wcześniej programów lub
podawaniu odpowiednich poleceń na bieżąco.
• Polecenia w trybie komend podaje się z klawiatury po wypisanym przez komputer na ekranie znaku
zachęty czyli: >> . Komenda taka jest wykonywana dopiero po naciśnięciu klawisza [Enter].
• Zakończenie komendy średnikiem powoduje, że wynik operacji nie jest wypisywany na ekranie.
• Podstawowym typem danych jest macierz - wektor poziomy lub pionowy oraz pojedyncza liczba są
szczególnymi przypadkami macierzy.
• Indeksy elementów macierzy rozpoczynają się w MATLAB’ie od “1” - zatem pierwszy element wektora
“x” to x(1), a nie x(0).
• Rozróżniane są litery duże i małe.
• Zmienne są inicjalizowane automatycznie, bez ingerencji użytkownika, w trakcie pierwszego
przypisania im wartości. Nie jest zatem konieczne podawanie rozmiaru ani typu zmiennej przed jej
zapisaniem.
• Stałe tekstowe podaje się w pojedynczym cudzysłowie, np: ‘sygnal delty’.
• Istotne jest rozróżnianie opisu wymiarów macierzy, czyli (M,N), co oznacza M wierszy i N kolumn, od
wektora o wartościach od M do N z krokiem 1, czyli M:N.
• Istnieje predefiniowana zmienna ans, która przyjmuje wynik operacji, jeśli użytkownik nie określi
zmiennej wynikowej. Zmienna ans zawiera jedynie wynik ostatniej operacji, dla której użytkownik nie
podał nazwy zmiennej wynikowej; można się nią posługiwać jak każdą inną zmienną; jej wymiary jako
macierzy zależą od wyniku operacji.
• Inne przydatne zmienne predefiniowane to jednostka urojona ( i oraz j ) oraz π ( pi ). Są one
automatycznie inicjalizowane za każdym razem bezpośrednio po uruchomieniu programu MATLAB.
• Jeżeli utworzymy zmienną o nazwie identycznej z nazwą funkcji (na przykład rand ) , to funkcja ta
przestanie być dostępna do czasu ponownego uruchomienia programu MATLAB.
• Klawisze pionowego ruchu kursora umożliwiają przeszukiwanie bufora podanych uprzednio komend;
po wyświetleniu wybranej linii można ją dowolnie modyfikować i podać jako nową komendę do
wykonania przez naciśnięcie klawisza [Enter]. UWAGA - bufor ten może ulec przepełnieniu.
7
DSP-MATLAB, Ćwiczenie 1,  P.Korohoda, KE AGH
Wybrane polecenia i funkcje - część 1 (trójkątne nawiasy “< >” oznaczają część opcjonalną):
Polecenie
Opis
quit
zakończenie pracy, wyjście z programu (zlikwidowanie wszystkich
zmiennych)
clear <nazwa zmiennej>
usunięcie wszystkich zmiennych (lub wskazanej zmiennej)
who
wypisanie (tylko) nazw istniejących zmiennych
whos
to samo co who, jednak wraz z parametrami zmiennych
help nazwa komendy lub funkcji
wypisanie opisu dla danej komendy lub funkcji
ones(M,N)
wygenerowanie macierzy o M wierszach i N kolumnach,
wypełnionej jedynkami
zeros(M,N)
wygenerowanie macierzy o M wierszach i N kolumnach,
wypełnionej zerami
rand(M,N)
wygenerowanie macierzy o M wierszach i N kolumnach,
wypełnionej liczbami pseudolosowymi z przedziału [0,1)
eye( N )
wygenerowanie macierzy jednostkowej ( wartości “1” tylko na
przekątnej, poza tym “0” ) o wymiarach NxN
Operator “:” (dwukropek) służy do określania ciągów liczb w sposób następujący:
początek : krok : koniec
W przypadku podania wersji uproszczonej: początek : koniec, wartość “krok” jest przyjmowana jako “1”.
Wyjątek - rozwinięcie macierzy do postaci wektora kolumnowego:
>>B=A(:); “B” to wektor kolumnowy zbudowany z kolejnych kolumn macierzy “A”
UWAGA: użytkownik nie wpisuje znaku “>>” - to robi komputer.
W podanych przykładach opis, który jest odpowiednikiem informacji ustnej prowadzącego i który nie
należy do treści komendy , zapisano kursywą.
Operatory arytmetyczne (odnoszą się do macierzy!):
Operator Opis
*
mnożenie (dla macierzy nie jest przemienne)
/
dzielenie
\
dzielenie lewostronne
+
dodawanie
odejmowanie
^
potęgowanie
‘
transponowanie ( UWAGA: w przypadku macierzy zespolonych nie jest to
tylko zamiana wierszy i kolumn, ale dodatkowo sprzężenie )
.*
kropka przed operatorem powoduje wykonanie operacji element po elemencie
- w tym przypadku mnożenie, ale dotyczy to także dzielenia i potęgowania
W przypadku niezgodności wymiarów macierzy podanych jako operandów dla danego operatora operacja
nie jest realizowana, a program sygnalizuje błąd.
MATLAB posiada wiele wbudowanych funkcji. Oto niektóre z nich:
cos (kosinus), sin (sinus), exp (eksponenta), tan (tangens), atan (arcus tangens), atan2 (arcus tangens
czteroćwiartkowy).
8
DSP-MATLAB, Ćwiczenie 1,  P.Korohoda, KE AGH
Inne funkcje, użyteczne przy pracy z macierzami (ciągami) zespolonymi:
abs (moduł - amplituda), angle (faza), real (część rzeczywista), imag (część urojona), conj (liczba
sprzężona), unwrap (monotonicznie rosnący lub malejący odpowiednik ciągu wartości faz).
Przykłady inicjalizowania lub modyfikowania zmiennych:
>>t=0:5;
powstanie wektor sześcioelementowy “t” o wartościach od 0 do 5, jeżeli
istniała już zmienna o tej samej nazwie, to zostanie uprzednio
zlikwidowana (uwaga: można w ten sposób niechący zlikwidować
zmienne predefiniowane, jak np. jednostka urojona)
>>k=7:-2:-3;
powstanie wektor “k” o wartościach od 7 do -3 (krok wynosi -2)
>>a=rand(3,2);
powstanie macierz pseudolosowa “a” o 3 wierszach i 2 kolumnach
>>B=[1,2,3; 3:5; 5:-1:3]; powstanie macierz “B”, 3x3, wypełniona podanymi wartościami
średnik oznacza przejście do kolejnego wiersza
>>Mat=B*0.5;
powstanie macierz “Mat” o rozmiarach takich jak macierz “B”
>>t=0:63;
powstanie wektor “t” o wartościach od 0 do 63
>>s=cos(2*pi*t/32);
wektor “s” będzie miał tyle samo elementów co wektor “t”; każdy
element wektora “s” będzie miał wartość wyznaczoną dla
odpowiadającego mu elementu wektora “t”; gdyby ”t” było macierzą,
to “s” byłoby macierzą o tych samych wymiarach
>>s(3)=Mat(2,1);
trzeci element wektora “s” przyjmie wartość elementu macierzy “Mat”
znajdującego się w drugim wierszu i pierwszej kolumnie
>>XYZ=[ones(3,3); B^2; rand(1,3)];
powstanie macierz XYZ o wymiarach 7x3
>>B(5,6) = 10;
ponieważ przypisujemy wartość 10 do elementu macierzy “B” spoza
dotychczasowego rozmiaru tej macierzy, zatem macierz ta zostanie
powiększona, tak by wskazany element (5,6) do niej należał, pozostałe
nowe elementy zostaną wypełnione zerami
>>C2=B^2;
macierz “B” jest podnoszona do kwadratu (macierzowo)
>>C3=B.^2;
każdy element macierzy “B” jest podnoszony do kwadratu jako skalar
Dwa sposoby generowania ciągów zespolonych - zesp oraz zesp2:
>>modul=1:10;
>>faza=(1:2:19)*pi/10;
>>zesp=modul.*exp(j*faza);
>>rzecz=1:5;
>>uroj=5:-1:1;
>>zesp2=rzecz+j*uroj;
9
DSP-MATLAB, Ćwiczenie 1,  P.Korohoda, KE AGH
Jako zmienną docelową lub źródło danych można wybrać fragment istniejącej macierzy, np:
>>X=B(3:4,1:2:5);
powstanie macierz “X”, 2x3, wybrana z macierzy “B” z jej 3. i 4. wiersza
oraz 1.,3. oraz 5. kolumny
>>X(4:-1:2)=V(1:3);
elementy od 2 do 4 wektora “X” będą pochodziły z elementów od 1 do 3
wektora “V”, ale w odwróconej kolejności
Szczególnym przypadkiem jest wybranie pojedynczego elementu macierzy, np: A(5,1).
Ważne jest odróżnienie powyższego zapisu od określania wymiarów macierzy np. dla komendy
“rand”.
Polecenia związane z tworzeniem i edytowaniem wykresów:
Polecenie
Opis
plot( dane wejściowe funkcji )
wykreślenie wykresu dla zadanych wektorów dla osi poziomej i pionowej,
można wybrać kolor oraz sposób wykreślania
stem( dane wejściowe funkcji )
jak plot, ale tylko do wykreślania ciągów wartości
hold <on/off>
zachowanie zawartości okna graficznego przy kreśleniu kolejnego
wykresu lub skasowanie zawartości tego okna
xlabel( stała tekstowa )
podpis dla osi poziomej
ylabel( stała tekstowa )
podpis dla osi pionowej
title( stała tekstowa )
podpis okna graficznego
gtext( stała tekstowa )
umieszczenie tekstu w oknie graficznym za pomocą myszy lub kursora
grid <on/off>
naniesienie (lub usunięcie) siatki
axis( wektor opisu osi )
modyfikacja zakresów obu osi
figure(numer okna graficznego) ustawienie wskaźnika okien graficznych na oknie o podanym numerze,
jeżeli nie ma takiego okna graficznego, to utworzenie nowego okna
delete wskaźnik elementu
usunięcie z okna graficznego elementu o podanym wskaźniku
Przykłady użycia poleceń do tworzenia i modyfikowania wykresów:
>>plot(x);
wykres z interpolacją odcinkowo-liniową wartości współrzędnych wektora
“x”, oś pozioma będzie opisana przez indeksy wektora “x”, czyli od 1 do
długości wektora
>>plot(0:7,x);
wykres wektora “x” , wartości dla osi poziomej to ciąg od 0 do 7
>>plot(t,x,’ro’);
wykres wektora “x” względem wektora “t”, w kolorze czerwonym, za
pomocą “kółeczek”
wykres modułu wektora “z” względem indeksów tego wektora; gdybyśmy w
przypadku zespolonego wektora “z” nie określili, czy chcemy oglądać
moduł, amplitudę, część rzeczywistą lub urojoną, to program wykreśli
kolejne elementy wektora “z” na płaszczyźnie zespolonej - część
rzeczywistą względem części urojonej, a nie względem indeksów wektora
>>plot(abs(z));
>>plot(t,abs(z));
wykres modułu wektora “z” względem wektora “t”; gdybyśmy w przypadku
zespolonego wektora “z” nie określili, czy chcemy oglądać moduł,
amplitudę, część rzeczywistą lub urojoną, to program wykreśli część
rzeczywistą wypisując jednocześnie na ekranie ostrzegawczy komunikat
>>plot(t, x, ‘r-‘, t, x, ‘go’);
wykres w jednym okienku wektora “x” względem wektora ”t” w
dwóch wersjach:
linii ciągłej w kolorze czerwonym oraz kółeczek w kolorze zielonym
10
DSP-MATLAB, Ćwiczenie 1,  P.Korohoda, KE AGH
>>stem(t,x);
wykres ciągu opisanego przez wektor “x” względem wektora “t”
>>axis([0,10,-5,5]);
ustawienie zakresu osi: oś pozioma od 0 do 10, oś pionowa od -5 do 5
>>h1=gtext(‘sygnal’);
wpisanie tekstu do okna wykresu oraz zainicjalizowanie wskaźnika
jako h1
>>delete h1;
usunięcie wyżej wpisanego tekstu z okna graficznego
>>figure(2);
wskazanie okna numer 2 jako okna bieżącego, gdy okno to nie istnieje, to
otwarcie kolejnego okna i ustawienie jako okna bieżącego
>>grid on
naniesienie na bieżące okno graficzne siatki współrzędnych
>>ylabel(‘wartosci’); naniesienie na bieżące okno graficzne opisu osi pionowej
Funkcje graficzne dotyczą tego okna graficznego, na które ustawiony jest wewnętrzny wskaźnik
MATLAB’a. Wskaźnik ten można ustawić za pomocą funkcji figure lub też poprzez wybranie tego okna na
przykład przez wskazanie i kliknięcie klawiszem myszy.
Do sprawdzenia wymiarów macierzy można użyć komendy whos albo wbudowanych funkcji:
>>size( nazwa macierzy )
zwracane są dwie liczby: ilość wierszy i kolumn
>>length( nazwa wektora ) zwracana jest jedna liczba: długość wektora
Wyniki powyższych funkcji (podobnie jak wszystkich innych) mogą stanowić wartości wejściowe dla
innych funkcji lub operacji, np:
>>x=1:length(y)
11
DSP-MATLAB, Ćwiczenie 1,  P.Korohoda, KE AGH
3 Zadania do wykonania
1. Zapoznać się z podstawami posługiwania się programem MATLAB
2. Wygenerować i zaprezentować w postaci wykresów następujące sygnały z czasem dyskretnym:
1)
2)
3)
4)
5)
6)
próbkowanej kosinusoidy,
skoku jednostkowego w punkcie zero oraz przesuniętego w czasie,
delty Kroneckera w punkcie zero oraz przesuniętej w czasie,
próbkowanej rzeczywistej funkcji eksponencjalnej,
próbkowanej zespolonej funkcji eksponencjalnej o zadanych parametrach,
wybranych kombinacji sygnałów z poprzednich punktów (np. demonstracja dla wzoru (12)).
Przykład wykreślonego
jednostkowych:
ciągu,
określonego
jako
różnica
dwóch
skoków
(uwaga - indeksy oznaczone zostały tym razem literą t)
u[t ] = u1 [t ] − u2 [t ]
1 dla t ≥ −3
u1 [t ] = 
0 dla t < −3
1 dla t ≥ 5
u2 [ t ] = 
0 dla t < 5
Przykładowa sekwencja komend umożliwiająca otrzymanie powyższego wykresu:
>>t=-20:20;
>>u1=zeros(1,41);
>>u1(18:41)=ones(1:24);
>>u2=[zeros(1,25),ones(1,16)];
>>u=u1-u2;
>>stem(t,u);
>>xlabel(‘indeksy czasowe’);
>>ylabel(‘wartosci ciagu’);
>>title(‘ciag “box car”’);
>>axis([-15,15,-0.5,1.5]);
12
DSP-MATLAB, Ćwiczenie 1,  P.Korohoda, KE AGH
Dodatek
teoretyczny nr 1
Próbkowanie i odtwarzanie sygnałów ciągłych - twierdzenie o minimalnej
częstotliwości próbkowania
Najpierw wykażemy, że transformata funkcji grzebieniowej jest także funkcją grzebieniową ( jednak ze
zmienioną amplitudą ).
Funkcja grzebieniowa w dziedzinie pierwotnej ( nazwijmy ją umownie dziedziną czasu ), składająca się z
oddalonych o T delt Diraca, określona jest następująco:
gT ( t ) =
∞
∑δ( t − n ⋅ T )
(D1.1)
n =−∞
Ponieważ funkcja grzebieniowa (D1.1) jest okresowa z okresem T, zatem można ją rozwinąć w szereg
Fouriera (przyjmując oznaczenie częstotliwości dla tej funkcji jako
gT (t ) =
∞
∑c
k
v0 =
1
):
T
⋅ e j⋅2⋅π ⋅v0 ⋅k ⋅t
(D1.2)
k =−∞
gdzie:
+
ck
=
1
T
T
2
∫ x(t ) ⋅ e
+
− j⋅2⋅π ⋅v0 ⋅k ⋅t
dt
1
T
=
T
−
2
T
2
 ∞
 − j⋅2⋅π ⋅v0 ⋅k ⋅t
t
n
T
dt
−
⋅
(
)
δ
∑
⋅e
∫T n=−∞

−
2
(D1.3)
i korzystając z właściwości dystrybucji związanej z deltą Diraca, że całka z funkcji pomnożonej przez deltę
Diraca przesuniętą o ∆T jest równa wartości tej funkcji w punkcie ∆T , czyli przykładowo:
∞
∫ p( t ) ⋅ δ ( t − ∆T )dt = p( ∆T )
(D1.4)
−∞
oraz z tego, że w przedziale całkowania w całce z prawej strony (D1.3) mieści się jedynie delta Diraca
d (t ) (nie przesunięta), otrzymujemy:
ck =
1
T
(D1.5)
Podstawiając (D1.5) do (D1.2):
gT (t ) =
∞
1
∑ T ⋅e
k =−∞
j⋅2⋅π ⋅v0 ⋅k ⋅t
(D1.6)
13
DSP-MATLAB, Ćwiczenie 1,  P.Korohoda, KE AGH
Z tw. o przesunięciu ( można je łatwo udowodnić wprost ze wzoru na transformatę Fouriera ), które brzmi
następująco:
F [ x (t )] = X (v ) ⇒
[
]
F x (t ) ⋅ e j⋅2⋅π ⋅∆v⋅t = X (v − ∆v )
(D1.7)
oraz liniowości transformacji Fouriera i zależności (D1.6), otrzymujemy:
1 ∞
1 ∞
j⋅2⋅π ⋅v0 ⋅k ⋅t
F [ gT ( t ) ] = ∑ F e
= ∑ δ ( v − k ⋅ v0 )
T k =−∞
T k =−∞
[
]
Prawa strona (D1.8) opisuje funkcję grzebieniową określoną w dziedzinie
zatem:
F [ g T (t )] =
(D1.8)
v i posiadającą okres v0 ,
1
⋅ g v0 ( v )
T
(D1.9)
CBDU
Ponieważ
v0 =
1
, więc także:
T
1

F  g T ( t )  = g v0 ( v )
 v0

(D1.10)
Rys. D1.1. Transformata Fouriera (FT - skrót od ang. Fourier Transform) funkcji grzebieniowej jest także
funkcją grzebieniową
Przyjmijmy, że interesuje nas sygnał
x (t ) o transformacie Fouriera:
F [ x (t )] =
∞
∫ x (t ) ⋅ e
− j⋅2⋅π ⋅v⋅t
dt
=
X (v )
(D1.11)
−∞
Sygnał ten jest próbkowany z okresem T za pomocą odpowiedniej funkcji grzebieniowej (inaczej można to
próbkowanie opisać jako modulowanie amplitudy funkcji grzebieniowej za pomocą sygnału x ( t ) ) i w
efekcie powstaje sygnał spróbkowany:
x T (t ) = x (t ) ⋅ g T (t )
(D1.12)
14
DSP-MATLAB, Ćwiczenie 1,  P.Korohoda, KE AGH
Jest to równoważne innemu zapisowi:
xT ( t ) =
∞
∑ x ( k ⋅ T ) ⋅ δ (t − k ⋅ T )
(D1.12a)
k =−∞
W dalszych rozważaniach skorzystamy z dwóch twierdzeń (przytoczonych bez dowodu).
Tw.1. Iloczyn sygnałów w dziedzinie czasu odpowiada splotowi w dziedzinie częstotliwości:
F [ x1 (t ) ⋅ x 2 (t )] = F [ x1 (t )]∗ F [ x 2 (t )]
(D1.13)
Tw.2. Splot funkcji z przesuniętą deltą Diraca (w dowolnej dziedzinie) daje tę samą funkcję, ale przesuniętą
o tyle w tej samej dziedzinie, o ile jest przesunięta delta Diraca:
p(v )∗ δ (v − ∆v ) = p(v − ∆v )
p(t )∗ δ (t − ∆t ) = p(t − ∆t )
(D1.14)
Oznaczając transformatę sygnału spróbkowanego z okresem T jako:
F [ x T (t )] = X T (v )
(D1.15)
można wobec (D1.12) oraz (D1.13) napisać, że:
1

X T (v ) = X (v )∗  ⋅ g v0 (v )
T

(D1.16)
W oparciu o (D1.14) i liniowość splotu (funkcja grzebieniowa jest sumą poprzesuwanych delt Diraca)
zależność (D1.16) można przekształcić do następującej postaci:
1 ∞
X T (v ) = ∑ X (v − k ⋅ v0 )
T k =−∞
(D1.17)
Wzór (D1.17) oznacza, że ciągła transformata Fouriera sygnału spróbkowanego z okresem T (czyli inaczej
z częstotliwością v 0 ) jest powiązana z transformatą sygnału przed próbkowaniem tak, że transformata
sygnału spróbkowanego składa się z dodanych do siebie poprzesuwanych o całkowitą wielokrotność v 0
kopii transformat sygnału oryginalnego, przy czym amplituda tych poprzesuwanych kopii jest T-krotnie
mniejsza niż amplituda transformaty oryginalnej.
Wynika stąd ważny warunek określający, kiedy z sygnału spróbkowanego możliwe jest odtworzenie
sygnału oryginalnego:
Aby było to możliwe, maksymalna częstotliwość sygnału oryginalnego (czyli największa wartość v ,
dla której transformata nie przyjmuje jeszcze wartości zero) musi być mniejsza od połowy
częstotliwości próbkowania; lub inaczej: częstotliwość próbkowania musi być większa niż podwojona
maksymalna częstotliwość sygnału oryginalnego.
Jeżeli warunek powyższy jest spełniony, to przesunięte o całkowitą wielokrotność v 0 kopie transformaty
oryginalnej nie zachodzą na siebie i możliwe jest dokładne wyodrębnienie pojedynczej kopii. W celu
15
DSP-MATLAB, Ćwiczenie 1,  P.Korohoda, KE AGH
odtworzenia sygnału oryginalnego wybiera się zatem pojedynczy okres zawierający w środku punkt v = 0 ,
mnoży się ten pojedynczy okres przez T i wyznacza transformatę odwrotną.
Operację “wybierania pojedynczego okresu” z transformaty X T ( v ) można zrealizować za pomocą
odpowiedniego filtru zerującego pozostałe okresy. Jak łatwo zauważyć, musi to być filtr dolnoprzepustowy.
Po to, by sygnał oryginalny był wiernie odtworzony, filtr ten nie może wprowadzać w pasmie
przepustowym żadnych zniekształceń. Reasumując, jeżeli maksymalna częstotliwość sygnału to v max , a
częstotliwość próbkowania to
v 0 , wówczas idealne odtworzenie sygnału próbkowanego jest możliwe, gdy:
v max <
1
⋅ v0
2
(D1.18)
a transformata Fouriera dolnoprzepustowego filtru odtwarzającego powinna spełniać warunek:
1

dla
 v
0

0
X F (v ) = 
dla
dowo ln e dla


v ≤ v max
v ≥ ( 2 ⋅ v 0 − v max )
pozost . v
(D1.19)
Rys. D1.2. Widmo Fouriera sygnału oraz widmo tego samego sygnału po próbkowaniu:
a) zapewniającym możliwość odtworzenia, b) uniemożliwiającym odtworzenie
UWAGA - przedstawione rozważania na temat twierdzenia o próbkowaniu nie uwzględniają szczególnego
przypadku, gdy sygnał jest kosinusoidą o częstotliwości dokładnie równej połowie częstotliwości
próbkowania.
16