ĆWICZENIE 0

Transkrypt

ĆWICZENIE 0
 Andrzej Leśnicki
Laboratorium CPS
Ćwiczenie 0
1/17
ĆWICZENIE 0
Wprowadzenie do programu MATLAB
1. Cel ćwiczenia
Ćwiczenie ma na celu powtórzenie wiadomości o programie MATLAB. Nazwa programu jest
skrótem z ang. MATrix LABoratory i wskazuje na podstawową zaletę tego programu jaką jest
duża łatwość i szybkość wykonywania operacji na macierzach. Ponieważ w laboratorium jest
wykonywana ogromna liczba działań na sygnałach dyskretnych i cyfrowych przyjmujących w
komputerze postać macierzy, to oprogramowanie do poszczególnych ćwiczeń laboratoryjnych
przygotowano w postaci interfejsów graficznych napisanych właśnie w języku programu
MATLAB.
2. Podstawowe komendy
Na początku pracy w programie MATLAB należy podać ścieżkę dostępu do miejsca, w
którym przechowujemy indywidualne oprogramowanie i gdzie chcemy przechowywać
wyniki pracy, w tym przypadku ma to być ścieżka dostępu do oprogramowania Laboratorium
CPS.
Program MATLAB ma bardzo bogatą bibliotekę gotowego oprogramowania.
Zapoznanie się z tym oprogramowaniem ułatwiają następujące komendy (pamiętajmy, że
znak % poprzedza komentarz):
>>help
%Podaje skorowidz tematów pomocy
>>helpwin %Otwiera okno pomocy
>>help sin %Opis wymienionej funkcji MATLABA
>>help SmithChart %Opis wymienionego skryptu MATLABA
>>type SmithChart %Podaje treść wymienionego skryptu
>>lookfor inverse %Poszukuje funkcji związanych z wymienionym słowem kluczowym
MATLABem można posługiwać się jak kalkulatorem (w trakcie edycji do powtarzania
uprzednio napisanych linii bardzo przydatne jest posługiwanie się klawiaturowym znakiem ↑
i znakiem ↓ , można też kopiować i wklejać linie):
>> sqrt(2)
ans =
%Pod nazwą ans jest przechowywana ostatnio obliczona wartość, brak
1.4142 %średnika na końcu linii spowodował natychmiastowe pokazanie wyniku
>> help format %Informacja o formatach zapisu liczb
>> x=1/33;
>> format long e %Zmiana formatu ze standardowego short na long e
>> x
x=
3.030303030303030e-002
>> format rat %Zmiana formatu z long e na rat
>>pi
%Komputer „nie potrafi” zapisać dokładnie liczby niewymiernej, a i liczby
ans=
%wymierne są zapisywane dokładnie tylko te, które należą do pewnego zbioru.
355/113 %Liczbę niewym. pi komputer przybliża do liczby wym. 355/113 przy tol=1.e-6
>> format short %Powrót do formatu short
Andrzej Leśnicki
Laboratorium CPS
Ćwiczenie 0
2/17
>> z=1+2j; %Wartość wbudowana j = i = − 1 . Zapisano 2j, ale równie dobre jest np. 2*i
%lub 2*sqrt(-1). Inne wartości wbudowane to: pi, eps, realmin, realmax, Inf, NaN. Niestety,
%czasem przez nieuwagę zmieniamy wartość wbudowaną poprzez wykorzystanie nazwy
%stałej do innych celów, np. wstawiając i lub j jako indeks w pętli for i wówczas i lub j nie
%będzie już równe − 1 . Dlatego zwłaszcza, gdy na komputerze przed chwilą pracował ktoś
%inny, dajmy >>clear.
>> abs(z) % Inne popularne operacje na liczbie zespolonej to angle, real, imag, conj
ans =
2.2361
3. Macierze
>>A=[1 2;3,4;... %Macierze wprowadzamy wierszami. Separatorami są spacje lub przecinek.
5 6]
%Średnik kończy wiersz. Wielokropek jest znakiem kontynuacji linii (tutaj
% nie był niezbędny).
A=
1 2
3 4
5 6
>> a=1:2:8 %Dwukropek pozwala na skrócony zapis macierzy z krokiem
a=
1 3 5 7
% Trzeba koniecznie przyzwyczaić się do tego, że komputer numeruje ciągi liczbowe
% indeksami od 1 w górę, podczas gdy w większości algorytmów indeksowanie rozpoczyna
% się od 0 w górę (np. przy zapisie dyskretnego sygnału przyczynowego). Z tego powodu
% początkujący programiści popełniają proste błędy i np. mylą się o 1 przy ocenie długości
% ciągu.
>> b=[zeros(1,3),[5:-1:3],ones(1,2)] %Łatwo można złożyć macierz z innych macierzy
b=
0 0 0 5 4 3 1 1
>> b(3:7) %Łatwo można wyciąć macierz z macierzy
ans =
0 5 4 3 1
>> a(2:3)=b(5:6)
a=
1 4 3 7
>> fliplr(b) %Łatwo można odwrócić kolejność elementów (flip left right)
ans =
1 1 3 4 5 0 0 0
>> a=[1,2,3]; b=[4,5,6]; %Można napisać kilka instrukcji oddzielonych średnikami w jednym
%wierszu, ale programiści unikają tego, gdyż zmniejsza to czytelność programu
>> a.*b %Mnożenie element po elemencie, wymiary a i b muszą być identyczne,
%kropka . przed * jest tutaj niezwykle ważna
ans =
4 10 18
>> a./b %Dzielenie element po elemencie
ans =
0.2500 0.4000 0.5000
>> a=[1,2,3]; b=[4,5,6];
Andrzej Leśnicki
>> c=a*b'
Laboratorium CPS
Ćwiczenie 0
3/17
% Zwykłe mnożenie macierzy c(kxm)=a(kxl)*b(lxm).
% Znak „prim” oznaczał powyżej transpozycję macierzy.
c=
32
>> c=a'*b
c=
4 5 6
8 10 12
12 15 18
>> A=[2,3,5;1,3,2;3,1,4];
>> b=[4,0,6]';
>> x=A\b % Rozwiązanie układu równań liniowych
x=
1
-1
1
Rozmiary, format i wartości zmiennych warto obserwować w obszarze roboczym
MATLABa (View → Workspace).
Pisząc programy w MATLABie należy preferować specjalne instrukcje MATLABowe i
unikać zwłaszcza instrukcji for. Na przykład dokonanie decymacji sygnału (odrzucenie co
drugiej próbki) z użyciem instrukcji MATLABowej y(1:N/2)=x(1:2:N) będzie trwało
znacznie krócej niż wykonanie decymacji z użyciem instrukcji for, co ilustruje poniższy
wykres (uzyskany poprzez wywołanie skryptu >>czasdecymacji).
Rys. 1. Wykres czasu decymacji sygnału
Andrzej Leśnicki
Laboratorium CPS
Ćwiczenie 0
4/17
4. Wykresy
W programie MATLAB łatwo sporządza się wykresy gotowe do wklejenia do dokumentów,
na przykład program testwykres.m (wykonanie >>testwykres):
t=0:1:10; T=10;
x=cos(2*pi*t/T);
subplot(2,2,1), plot(x,'k'), grid on
subplot(2,2,2), plot(t,x,'k')
title('Wykres kosinusoidy')
xlabel('czas')
subplot(2,2,3), plot(t,x,'k+:'), grid on
subplot(2,2,4), stem(t,x,'k'), grid on
sporządzi poniższe wykresy.
W y kres k os inus oidy
1
1
0.5
0.5
0
0
-0.5
-0.5
-1
0
5
10
15
-1
1
1
0.5
0.5
0
0
-0.5
-0.5
-1
0
5
10
-1
0
5
c zas
10
0
5
10
Rys. 2. Wykresy dwuwymiarowe w MATLABIE
Wykresy funkcji w przestrzeni 3-wymiarowej kreślimy w postaci linii lub
powierzchni. Przykładowo wykres zespolonego, analitycznego sygnału AM
(1 + 0.75 * cos(0.1 * t ) )• * e j (0.5*t )
będzie linią w przestrzeni 3-wymiarowej. Z kolei wykres modułu transmitancji
H(s)=(s+3)/(s+1) (s jest argumentem zespolonym), będzie powierzchnią w przestrzeni
Andrzej Leśnicki
Laboratorium CPS
Ćwiczenie 0
5/17
3-wymiarowej. Powierzchnie mogą być kolorowane i cieniowane (podobnie jak w logo
MATLABa, gdzie dodatkowo zastosowano podświetlenie). Stosowne wykresy otrzymamy
posługując się skryptem wykres3D.m o następującej treści:
%Wykres sygnału zespolonego AM
figure(1)
t=0:0.1:200;
re=(1+0.75*cos(0.1*t)).*cos(0.5*t);
im=(1+0.75*cos(0.1*t)).*sin(0.5*t);
subplot(2,2,1)
plot3(im,re,t)
grid on
title('Zespolony sygnal AM')
xlabel('im')
ylabel('re')
zlabel('t')
%Wykres modułu transmitancji H(s)=(s+3)/(s+1)
[X,Y]=meshgrid(-6:0.1:2,-2:0.1:2);
Z=sqrt(((X+3).^2+Y.^2)./((X+1).^2+Y.^2+eps));
%Obcięcie wartości powyżej a=5
a=5;
ZN=Z.*(Z<=a)+a*(Z>a);
subplot(2,2,2)
mesh(X,Y,ZN)
axis([-6 2 -2 2 0 a])
title('|H(s)=(s+3)/(s+1)| - mesh')
subplot(2,2,3)
surf(X,Y,ZN)
axis([-6 2 -2 2 0 a])
title('|H(s)=(s+3)/(s+1)| - surf')
subplot(2,2,4)
h=surf(X,Y,ZN);
shading flat
axis([-6 2 -2 2 0 a])
title('|H(s)=(s+3)/(s+1)| - surf+shading')
Andrzej Leśnicki
Laboratorium CPS
Ćwiczenie 0
6/17
Rys. 3. Wykresy trzywymiarowe w MATLABIE
5. Funkcje
Własne funkcje przechowujemy w plikach z rozszerzeniem *.m o specjalnej składni. Na
przykład w pliku secans.m zdefiniowano funkcję secans i wyznaczono czas obliczeń tej
funkcji:
function [y,t]=secans(x)
%SECANS oblicz 1/cos(x) i podaj czas
%Użycie: [y,t]=secans(x) , gdzie x %
y %
t tic %Włączenie stopera
y=1./cos(x);
t=toc; %Wyłączenie stopera
obliczeń
wektor wejściowy
wektor wyjściowy
czas obliczeń
Zastosowanie tej funkcji daje następujący skutek:
>> x=-1:0.00001:1;
>> [y,t]=secans(x);
>> t
t=
0.1600
Można teraz sporządzić wykres funkcji secans dając >>plot(x,y).
Andrzej Leśnicki
Laboratorium CPS
Ćwiczenie 0
7/17
6. Skrypty
Użytkownicy przechowują swoje programy w postaci skryptów, czyli plików z rozszerzeniem
*.m , w których nie ma ograniczeń na składnię, jak to było w przypadku funkcji. W jednym
pliku może wystąpić wiele definicji funkcji jedna za drugą, ale plik skryptu zawiera tylko
jeden skrypt (nie może być skryptu w skrypcie lub skryptu z definicjami funkcji na końcu).
Przykładem skryptu jest plik tonszum.m (wywoływany jako >>tonszum), generujący
ton zaszumiony białym szumem:
f0=1000; %Częstotliwość (wysokość tonu) w hercach
T=5; %Czas trwania tonu w sekundach
fp=8000; %Częstotliwość próbkowania w hercach
a=0.5; %Poziom szumu w tle tonu
t=0:(1/fp):T; %Dyskretyzacja czasu
x=sin(2*pi*f0*t); %Generowanie tonu
%Generowanie szumu o rozkładzie normalnym
%(wartość oczekiwana 0, wariancja 1)
szum=randn(1,length(t));
y=x+a*szum; %Ton z addytywnym szumem
%Normowanie sygnału y do przedziału <-1,1>
maks=max(abs(y));
b=1/maks;
y=b*y;
sound(y,fp) %Odsłuchanie zaszumionego tonu (musimy dysponować
%
komputerem ze skonfigurowaną kartą muzyczną).
7. Dźwięki
Program MATLAB zawiera funkcje ułatwiające przetwarzanie plików dźwiękowych. Funkcja
wavread(file) pozwala otworzyć plik dźwiękowy z rozszerzeniem ∗ .wav. Na przykład
otwarcie pliku kakofonia.wav oznacza wpisanie do obszaru roboczego macierzy x(1:116011)
z próbkami dźwięku, o częstotliwości próbkowania fp=8000 Hz i liczbie bitów na próbkę
nbits=8:
>> [x,fp,nbits]=wavread(‘kakofonia.wav’);
Wczytane wartości można przeglądnąć w obszarze roboczym MATLABa
(View → Workspace). Utworu można posłuchać posługując się funkcją sound(⋅) (lub
wavplay(⋅)):
>> sound(x,fp,nbits)
Próbki dźwięku możemy poddać przetwarzaniu cyfrowemu. Na przykład wzbogacimy
dźwięk o pojedyncze echo. Wymaga to przepuszczenia próbek sygnału przez filtr cyfrowy o
odpowiedzi impulsowej będącej dwoma deltami Kroneckera (zakładamy, że odbicie
powodujące powstanie echa jest 100-procentowe, w przeciwnym razie zamiast drugiej
jedynki należałoby dać np. 0,5 oznaczające odbicie 50-procentowe), rozdzielonymi zerami w
liczbie odpowiadającej wielkości opóźnienia echa:
Andrzej Leśnicki
Laboratorium CPS
Ćwiczenie 0
8/17
>> h=[1,zeros(1,1000),1]; % Odpowiedź impulsowa filtru h[n]
>> y=conv(x,h);
% Odpowiedź filtru to splot pobudzenia z odpowiedzią impulsową
Użyto tutaj funkcji conv(‚), ale równie dobrze mogłaby być użyta funkcja filter(‚). Liczba zer
1000 oznacza przy częstotliwości próbkowania Fs=8000 Hz, że opóźnienie echa wynosi
1000/8000=125 ms. Ponieważ prędkość rozchodzenia się fal dźwiękowych w powietrzu
wynosi około 330 m/s, to opóźnienie 125 ms symuluje odbicie się dźwięku od przeszkody
odległej o 20,6 m. Słuchając utworu z echem:
>> sound(y,fp)
odnosimy wrażenie, utwór został wykonany w dużym pustym pomieszczeniu.
W podobny sposób jak echo pojedyncze można symulować echo wielokrotne dając w
odpowiedzi impulsowej większą liczbę delt Kroneckera rozdzielonych zerami.
Jeżeli chcemy utworzyć plik kakofoniaecho.wav przechowujący przetworzony
dźwięk, to zrobimy to z użyciem funkcji wavwrite(‚):
>>wavwrite(y,fp,nbits,’kakofoniaecho.wav’)
Tak utworzony plik może być odtwarzany bez pośrednictwa MATLABa, z użyciem
odtwarzacza multimedialnego (np. Windows Media Player).
8. Obrazy
Kolejne dwa skrypty ilustrują sposób tworzenia kolorowych obrazów (nieruchomych, bez
animacji). Standardowo jest dostępna macierz colormap z mapą 64 kolorów RGB. Te 64
kolory można oglądnąć posługując się skryptem mapakolor.m z funkcją image(⋅) (wywołanie
>>mapakolor):
%Jeżeli macierz A ma wymiar MxN, to rysunek zostanie
%podzielony na MxN prostokątów i każdy prostokąt zostanie
%pokolorowany kolorem z colormap o numerze A(i,j).
A=[ 1 2 3 4 5 6 7 8;
8 10 11 12 13 14 15 16;
17 18 19 20 21 22 23 24;
25 26 27 28 29 30 31 32;
33 34 35 36 37 38 39 40;
41 42 43 44 45 46 47 48;
49 50 51 52 53 54 55 56;
57 58 59 60 61 62 63 64];
image(A)
Ponieważ kolor niebieski RGB=001 jest zakodowany w macierzy colormap pod numerem 8,
a kolor żółty RGB=110 pod numerem 40, to przykładową kratkę żółto-niebieską 2x3
otrzymamy posługując się skryptem kratka.m (wywołanie >>kratka):
A=[40 8 40;
8 40 8];
Andrzej Leśnicki
Laboratorium CPS
Ćwiczenie 0
9/17
image(A)
Można posłużyć się mapą własnych kolorów, tak jak w skrypcie kratka1.m:
% Tworzymy mapę własnych 8 kolorów
kolorki=[0 0 0; % czarny
0 0 1; % niebieski RGB=001
0 1 0; % zielony RGB=010
0 1 1; % cyjankowy
1 0 0; % czerwony RGB=100
1 0 1; % magenta
1 1 0; % żółty
1 1 1]; % biały
% Były to wszystkie kolory dające się zakodować zero-jedynkowo.
% Oprócz tego istnieje ogromna liczba kolorów kodowanych wartościami
% RGB z przedziałów (0,1), np. fiolet to [0.55 0.25 0.66].
% Otwieramy rysunek gotowy przyjąć nasze kolory
figure('colormap',kolorki);
A=[8 3 8; % Przygotowujemy do kolorowania macierz 2x3
3 8 3]; % gdzie kratki z 8 będą białe, gdyż kolorki(8)=biały,
% a kratki z 3 będą zielone, gdyż kolorki(3)=zielony
image(A) % Wykreślamy kratkę
Do otwierania gotowych plików obrazów służy funkcja imread(⋅). Wykorzystano ją w
skrypcie obrazbmp.m. Przykładowo otwarcie pliku obr.bmp powoduje wpisanie do obszaru
roboczego macierzy x w formacie uint8 o liczbie wierszy M=511 i liczbie kolumn N=742,
wraz z mapą kolorów map :
>> [x,map]=imread(‘obr.bmp’);
>> [M,N,L]=size(x) % Obliczenie liczby wierszy M i kolumn N (L=3, to trzy kolory RGB)
Teraz można oglądnąć cały obraz:
>> subplot(231)
>> imshow(x,map)
lub treść poszczególnych linii obrazu, np. linii o numerze 8:
>> linia50=x(50,1:N,:);
>> subplot(232)
>> plot(linia50)
Łatwe jest przetwarzanie obrazu cyfrowego. Na przykład obcięcie dolnej połowy
obrazu, to:
>> y=x(1:round(M/2),1:N,:);
>> subplot(233)
>> imshow(y,map)
a „wybielenie” linii od 50 do 51, to:
>> z=x;
>>for i=1:N,
z(50,i,1)=256;z(50,i,2)=256;z(50,i,3)=256;z(51,i,1)=256;z(51,i,2)=256;z(51,i,3)=256;
Andrzej Leśnicki
Laboratorium CPS
Ćwiczenie 0
10/17
end
>> subplot(244)
>> imshow(z,map)
Uwaga: funkcja imshow jest dostępna tylko w niektórych wersjach MATLABa.
Rys. 4. Przetwarzanie obrazu w MATLABIE
Odwrócenie obrazu „do góry nogami” wymaga odwrócenia kolejności wierszy.
Zamiana lewej strony obrazu na prawą wymaga odwrócenia kolejności kolumn. Dwukrotne
zmniejszenie rozdzielczości obrazu wymaga usunięcia co drugiego wiersza i kolumny
macierzy.
Przetworzone pliki obrazów można zapisać w stosownym formacie (pozwalającym
odtworzyć obraz bez pośrednictwa MATLABa) używając funkcji imwrite(‚).
Istnieje wiele różnych formatów obrazów. Powyżej przetwarzano obraz zapisany w
formacie BMP. W tym formacie obraz ma trzy warstwy odpowiadające trzem kolorom RGB.
Funkcja imread(‚) pozwala odczytać wartości kolorów zapisane w formacie uint8. Przykład
odczytania obrazu zapisanego w formacie BMP jest zawarty w skrypcie obrazkolory.m :
% Kolory obrazu BMP
obraz=imread('obr.bmp'); % Odczytanie treści obrazu
[M,N,L]=size(obraz); % Liczba wierszy M=511, liczba kolumn N=742, RGB L=3
obraz=double(obraz); % Przejście z zapisu w formacie uint8 na format double
subplot(231)
imshow('obr.bmp')
title('Obraz oryginalny')
Andrzej Leśnicki
Laboratorium CPS
% Macierze trzech kolorów RGB
R=obraz(:,:,1);
G=obraz(:,:,2);
B=obraz(:,:,3);
subplot(232)
obrazR(:,:,1)=R;
obrazR(:,:,2)=zeros(M,N);
obrazR(:,:,3)=zeros(M,N);
imshow(uint8(obrazR))
title('Kolor R')
subplot(233)
obrazG(:,:,1)=zeros(M,N);
obrazG(:,:,2)=G;
obrazG(:,:,3)=zeros(M,N);
imshow(uint8(obrazG))
title('Kolor G')
subplot(234)
obrazB(:,:,1)=zeros(M,N);
obrazB(:,:,2)=zeros(M,N);
obrazB(:,:,3)=B;
imshow(uint8(obrazB))
title('Kolor B')
subplot(235)
obrazRGB(:,:,1)=R;
obrazRGB(:,:,2)=G;
obrazRGB(:,:,3)=B;
imshow(uint8(obrazRGB))
title('Obraz RGB = obraz oryginalny')
subplot(236)
obrazLUM(:,:)=R+G+B;
imshow(uint8(obrazLUM/3))
title('Luminancja R+G+B')
clear
Ćwiczenie 0
11/17
Andrzej Leśnicki
Laboratorium CPS
Ćwiczenie 0
12/17
Rys. 5. Przetwarzanie obrazu kolorowego w MATLABIE
9. Interfejsy graficzne GUI
Bardzo często funkcje MATLABa są pisane w postaci interfejsów graficznych GUI (z ang.
GUI – graphical user interface). Pozwalają one użytkownikowi zmieniać dane i postać
programu poprzez przyciski, pola edycyjne, suwaki i obserwować na bieżąco wpływ tych
zmian na wyniki obliczeń przedstawiane w postaci wykresów.
Przykładem interfejsu graficznego jest parabola.m . W tym interfejsie graficznym można
obserwować jak zmienia się wykres paraboli y = x 2 + bx + 1 w zależności od zmian
współczynnika b, którego wartość można wpisać w pole edycyjne lub zmienić suwakiem.
Bardziej praktycznym przykładem interfejsu graficznego jest SmithChart.m lub Smith.m
z tzw. wykresem kołowym nazywanym też wykresem Smitha. Na wykresie tym
obserwujemy zmiany impedancji na wejściu linii transmisyjnej obciążonej impedancją Z 0 .
Unormowaną wartość impedancji obciążenia Z 0 wpisujemy w pola edycyjne, a długość linii
transmisyjnej albo wpisujemy w pole edycyjne, albo zmieniamy suwakiem.
Interfejsy graficzne pisze się albo jako skrypty z CallBack-ami (przykładami są interfejsy
graficzne parabola.m, SmithChart.m), albo jako funkcję z funkcjami (przykładem jest
interfejs graficzny Smith.m).
10. Zadania
1. Za pomocą komendy help zapoznaj się z opisami wybranych przez siebie działań, funkcji,
skryptów.
Andrzej Leśnicki
Laboratorium CPS
Ćwiczenie 0
13/17
2. Odczytaj wartość liczby pi z możliwie dużą ilością cyfr.
3. Wykreśl wybrany przez siebie sygnał lub funkcję (impuls jednostkowy, skok
jednostkowy, sygnał świergotowy (chirp) cos(2πf 0 t + πµt 2 ) , krzywa rezonansowa, itp.).
4. Zbadaj o ile szybsze jest MATLABowe wykonanie operacji na macierzach od tej samej
operacji wykonanej z użyciem instrukcji for. Przykładowo można badać szybkość
obliczenia iloczynu skalarnego w zależności od długości sygnału x[1:N]. Służy temu
skrypt czasilskal:
%czasilskal
%Porównanie czasów obliczenia iloczynu skalarnego <x,x>
%(mocy sygnału x[1:N]). Jeden raz obliczenia wykonano
%z użyciem matlabowej instrukcji x*x' i drugi raz z użyciem
%instrukcji for.
%Czasy obliczeń wykreślono we wspólnym układzie współrzędnych.
%Nie można dawać zbyt dużego N bo zabraknie czasu na zajęciach,
%tak długotrwałe są obliczenia.
%Wynik silnie zależy od szybkości komputera i wersji MATLABa.
%W nowszych wersjach w zasadzie nie ma tak wielkich różnic
%(nie ma niebezpieczństwa przekroczenia czasu, a raczej pamięci),
%ale np. w starszych MATLABach 4, 5 różnica jest ogromna.
for k=1:40
N(k)=k*5000;
x=pi*ones(1,N(k));
tic
ilskal=0;
for m=1:N(k),
ilskal=ilskal+x(m)*x(m);
end
tfor(k)=toc;
tic
ilskal=x*x';
tmat(k)=toc;
end
plot(N,tfor,'bo:',N,tmat,'r*:')
title('Czas obliczenia iloczynu skalarnego<x,x>:kółka-instrukcja for,gwiazdki-instrukcja
matlabowa')
xlabel('Długość wektora x')
ylabel('Czas w sekundach')
clear
Andrzej Leśnicki
Laboratorium CPS
Ćwiczenie 0
14/17
Rys. 6. Wykres czasu obliczenia iloczynu skalarnego
5. Wygeneruj własny dźwięk pisząc własny skrypt dzwiek.m na wzór skryptu tonszum.m.
Może to być pojedynczy ton czysty lub zaszumiony lub chirp. Ewentualnie może to być
sygnał dwutonowy jak przy dwutonowym wybieraniu numeru telefonicznego. W
poniższej tabeli podano pary częstotliwości tonów dla poszczególnych cyfr i znaków.
Częstotliwości 1209 Hz
697 Hz
1
1336 Hz
2
1477 Hz
3
1633 Hz
A
770 Hz
4
5
6
B
852 Hz
941 Hz
7
*
8
0
9
#
C
D
Na przykład tonowemu wybieraniu numeru telefonicznego 347 17 64 towarzyszy dźwięk,
który usłyszymy posługując się skryptem telefon.m (posłuchaj przykładu dając >>telefon,
następnie napisz własny skrypt telefon1.m):
% Wybieranie tonowo numeru telefonicznego
f=[697,770,852,941,1209,1336,1477]; % Zestaw częstotliwości tonów
T=0.5; % Czas wybierania (w sekundach) jednej cyfry numeru telefonicznego
fp=8000; % Częstotliwość próbkowania w hercach
t=0:1/fp:T; % Dyskretyzacja czasu
% Dwutonowe kodowanie cyfr od 1 do 0
c1=sin(2*pi*f(1)*t)+sin(2*pi*f(5)*t);
c2=sin(2*pi*f(1)*t)+sin(2*pi*f(6)*t);
c3=sin(2*pi*f(1)*t)+sin(2*pi*f(7)*t);
Andrzej Leśnicki
Laboratorium CPS
Ćwiczenie 0
15/17
c4=sin(2*pi*f(2)*t)+sin(2*pi*f(5)*t);
c5=sin(2*pi*f(2)*t)+sin(2*pi*f(6)*t);
c6=sin(2*pi*f(2)*t)+sin(2*pi*f(7)*t);
c7=sin(2*pi*f(3)*t)+sin(2*pi*f(5)*t);
c8=sin(2*pi*f(3)*t)+sin(2*pi*f(6)*t);
c9=sin(2*pi*f(3)*t)+sin(2*pi*f(7)*t);
c0=sin(2*pi*f(4)*t)+sin(2*pi*f(6)*t);
% Sygnał numeru telefonicznego 347 17 64
x=[c3,zeros(1,100),c4,zeros(1,100),c7,zeros(1,2000),...
c1,zeros(1,100),c7,zeros(1,2000),c6,zeros(1,100),c4];
% Odsłuchanie wybieranego tonowo numeru telefonicznego
sound(x,fp)
6. Przetwórz cyfrowo dźwięk. Na przykład przepuść sygnał dźwiękowy przez filtr
dolnoprzepustowy o określonej odpowiedzi impulsowej:
>> [x,fp,nbits]=wavread(‘kakofonia.wav’);
>> sound(x,fp) % Odsłuchanie dźwięku oryginalnego
>> h=[1,1,1]/3; % Odpowiedź impulsowa h[n] prostego filtru dolnoprzepustowego –
>>
% uśrednianie każdych kolejnych trzech próbek
>> y=conv(x,h); % Przepuszczenie sygnału przez filtr (operacja splotu)
>> sound(y,fp) % Odsłuchanie przefiltrowanego dźwięku (stłumione wyższe tony)
7. Stwórz własny obraz, na przykład kolorową kratkę, pisząc własny skrypt kratka2.m na
wzór skryptu kratka1.m.
8. Przetwórz cyfrowo obraz. Na przykład nałóż na obraz oryginalny obraz odbity (jak na
ekranie telewizora z niedopasowaną anteną), skrypt obrazodbity.m :
% Obraz odbity
x=imread('obr.bmp'); % Załadowanie obrazu do obszaru roboczego (format uint8)
[M,N,L]=size(x); % Wymiary obrazu, M liczba wierszy, L liczba kolumn
y=double(x); % Zmiana formatu z uint8 na double
y=y(1:M,1:N); % Pozbycie się koloru
subplot(221); imshow(uint8(y)); title('Obraz oryginalny') % Podgląd oryginalnego obrazu
h1=[1,zeros(1,40),1]; % Odpowiedź impulsowa pojedynczego odbicia
for k=1:M, z(k,1:N+41)=0.5*conv(h1,y(k,1:N)); end % Przepuszczenie sygnału obrazu przez
%filtr h1
subplot(222); imshow(uint8(z(1:M,1:N))); title('Pojedyncze odbicie') % Obraz z pojedynczym
%odbiciem
clear z % Usunięcie zmiennej z z obszaru roboczego
h2=[1,zeros(1,40),1,zeros(1,40),1]; % Odpowiedź impulsowa podwójnego odbicia
for k=1:M, u(k,1:N+82)=0.333*conv(h2,y(k,1:N)); end % Przepuszczenie sygnału obrazu
%przez filtr h2
subplot(223); imshow(uint8(u(1:M,1:N))); title('Podwójne odbicie')% Podgląd obrazu z
%podwójnym odbiciem
clear u % Usunięcie zmiennej u
h3=[1,zeros(1,40),1,zeros(1,40),1,zeros(1,40),1]; % Odpowiedź impulsowa potrójnego
%odbicia
Andrzej Leśnicki
Laboratorium CPS
Ćwiczenie 0
16/17
for k=1:M, v(k,1:N+123)=0.25*conv(h3,y(k,1:N)); end % Przepuszczenie sygnału obrazu
%przez filtr h3
subplot(224); imshow(uint8(v(1:M,1:N))); title('Potrójne odbicie')% Podgląd obrazu z
%podwójnym odbiciem
clear v x y % Usunięcie zmiennych v, x, y
lub przefiltruj sygnał obrazu przez filtr dolnoprzepustowy w celu zmniejszenia szumów
(rozmycie ziarna obrazu) obrazfiltr.m :
x=imread('obr.bmp'); % Załadowanie obrazu do obszaru roboczego (format uint8)
[M,N,L]=size(x); % Ustalenie rozmiaru macierzy
y=double(x); % Zmiana formatu z uint8 na double
y=y(1:M,1:N);
subplot(121); imshow(uint8(y)); title('Obraz oryginalny') % Podgląd oryginalnego obrazu
hdp=[1,1,1,1,1]/5; % Odpowiedź impulsowa h[n] prostego filtru dolnoprzepustowego
% uśrednianie każdych kolejnych pięciu próbek
for k=1:M, v(k,1:N+4)=conv(hdp,y(k,1:N)); end % Przepuszczenie sygnału obrazu przez filtr
%hdp,
% filtrowanie tylko wierszami
subplot(122); imshow(uint8(v)); title('Obraz odszumiony') % Podgląd obrazu odszumionego
clear v x y % Usunięcie zmiennych v, x, y
Tutaj dokonano filtracji jednowymiarowej po liniach. Ściśle, powinno się stosować filtry
dwuwymiarowe, w najprostszym przypadku należy filtrować po wierszach i po kolumnach.
9. Przećwicz posługiwanie się interfejsami graficznymi: parabola.m (>>parabola) ,
SmithChart.m (>>smithchart), Smith.m (>>smith) .
Rys. 7. Zmiana kształtu paraboli w zależności od wartości współczynnika b.
Andrzej Leśnicki
Laboratorium CPS
Ćwiczenie 0
Rys. 8. Transformator ćwierćfalowy, interfejs graficzny SmithChart
Rys. 9. Transformator ćwierćfalowy, interfejs graficzny Smith
17/17