AGH
Wydział Inżynierii Materiałowej i Ceramiki AGH
Studia I stopnia Chemia Budowlana rok II – Plan zajęć
a) Opanowanie wiadomości teoretycznych dotyczących przetworników analogowo-cyfrowych, na podstawie wykładu, podręczników oraz kompendium zamieszczonego TUTAJ
b) Umiejętność odpowiedzi na pytania dotyczące: próbkowania, kwantowania, kodowania, twierdzenia o próbkowaniu, zjawiska aliasingu, oraz celu przetwarzania A/C i podstawowych typów przetworników A/C
Wacław Gawędzki:
Pomiary Elektryczne (podręcznik pdf)
Roman Kaula:
Wprowadzenie - Środowisko obliczeń numerycznych Matlab-Simulink (pdf)
https://www.mathworks.com/matlabcentral/fileexchange/27105-wprowadzenie-do-matlaba--introduction-to-matlab-in-polish-
W takich ramkach z zielonym tłem umieszczane będą OBJAŚNIENIA.
MATLAB (którego nazwa pochodzi od MATrix LABoratory - laboratorium macierzowe) ![]() Interaktywne środowisko programowania Matlaba Najważniejsze - OKNO KOMEND (ang.: Command Window) - służy do wpisywania poleceń w języku Matlaba i w tym samym oknie wyświetlane są wyniki, objaśnienia i komunikaty o błędach. Działając tylko w OKNIE KOMEND można pozamykać inne okna a przywrócić można je z menu: Desktop - Desktop_Layout - Default. Objaśnienia można wyszukiwać z menu głównego HELP. help ops - pomoc dotycząca operatorów, help elfun - pomoc dotycząca funkcji elementarnych, help iofun - pomoc dotycząca funkcji wejścia-wyjścia. Klawisz "strzałka w górę" przywołuje poprzednio wpisane polecenia i można je wykonywać ponownie a także zmieniać. Okno komend można wyczyścić komendą clc. |
a) Znajdź (jak wyżej) objaśnienia dotyczące operatorów Matlaba, następnie wyczyść okno komendą clc
b) Znajdź objaśnienia funkcji pierwiastek kwadratowy (ang.: square root) z grupy funkcji elementarnych (help elfun) i znów wyczyść okno komend.
Objaśnienia:Pojedyncze linie poleceń można wpisywać w oknie komend gdy jest tam znak gotowości: [>>]. Linię kończy naciśnięcie ENTER.
Najprostszym poleceniem jest WYRAŻENIE arytmetyczne. Matlab wyznaczy jego wartość i wyświetli (jeśli po wyrażeniu nie umieścimy średnika). Wyrażeniem jest także pojedyncza zmienna lub wywołanie funkcji. Wpisując liczby pamiętajmy, że separatorem części ułamkowej jest KROPKA a nie przecinek.
|
Zmienne służą do przechowywania wartości różnych typów. Do nadawania wartości zmiennym lub ich zmieniania służą instrukcje przypisania (zwane też instrukcjami podstawiania). W Matlabie nie trzeba deklarować typu zmiennej gdyż jest on samoczynnie (dynamicznie) określany na podstawie przypisanej wartości. Tej samej zmiennej można przypisać wartość liczbową np.:5 a za chwilę wartość tekstową np.: 'Ala'. Domyślnie wszystkie zmienne traktowane są jak macierze a jeśli mają rozmiar 1x1 to są skalarami. Wykaz aktualnie istniejących zmienne podają polecenia who i whos, a usuwa zmienne z pamięci polecenie clear.
Nazwy zmiennych można tworzyć z liter angielskich i cyfr (oraz znaku podkreślnika) ale pierwszym znakiem nazwy zmiennej musi być litera. Instrukcja przypisania ZMIENNEJ wartości WYRAŻENIA ma postać: ZMIENNA = WYRAŻENIE - rozkazuje ona komputerowi wyznaczyć wartość WYRAŻENIA i przesłać ją do obszaru pamięci przypisanego ZMIENNEJ.
Matlab rozróżnia małe i duże litery. Słowa kluczowe i nazwy funkcji Matlaba trzeba wpisywać małymi. Dokładniejsze objaśnienia masz TUTAJ |
Wpisz w oknie komend (po każdej linii ENTER) i wyciągnij wnioski:
w=sqrt(9);
w
w=w+1
Nadaj zmiennej x podaną niżej wartość, następnie wyznacz y w/g podanego wzoru,
potem wstaw do x drugą z podanych wartość i powtórz (używając klawisza strzałki) operację obliczania y
(Uwaga: klawisz "strzałka w górę" wywołuje poprzednio napisane komendy i nie trzeba ich wpisywać jeszcze raz.)
(Poprawne wartości y to: 0.7478 oraz 0.9240)
Wyświetl wykaz zmiennych, komendami who oraz whos, następnie wyczyść pamięć komendą clear i ponownie wpisz whos.
Dowolny wektor wierszowy definiujemy wpisując jego elementy w nawiasie prostokątnym i oddzielając je od siebie przecinkami. Macierz też możemy zdefiniować podając jej elementy w nawiasie prostokątnym i oddzielając elementy wiersza przecinkami a wiersze średnikami np.:
Jesli w definicji wektora zamiast przecinków zastosujemy średniki to powstanie wektor kolumnowy np.:
Do zdefiniowania ciągu typu "postęp arytmetyczny" służy wyrażenie z dwukropkami: pierwszy_element : przyrost : ostatni_element Na przykład:
Jak widać w rzeczywistości ostatni element może być mniejszy jeśli tak wynika z dodawania podanego przyrostu. Każdy ciąg jest zarazem wektorem (tu: wierszowym), podobnie jak funkcja której argumentem jest wektor daje w wyniku wektor. jednak przy mnożeniu, dzieleniu i potęgowaniu macierzy i wektorów obowiązują szczególne zasady i musimy je znać
Działania na wektorach i macierzachDodawanie i odejmowanie wektorów i macierzy jest możliwe gdy mają one identyczne rozmiary.
Mnożenie macierzowe (*) to mnożenie elementów wiersza pierwszej macierzy przez elementy kolumny macierzy drugiej i wyznaczaniu sum takich iloczynów. Natomiast operatory z kropką (.*), (.^), (./) to t.zw. operacje tablicowe - na parach odpowiadających sobie elementów dwu wektorów lub macierzy o identycznych rozmiarach (jak przy dodawaniu):
|
a) Wpisz w oknie komend definicje wektorów umieszczone powyżej w białych polach.
b) Zdefiniuj ciąg liczb naturalnych od 1 do 5 a następnie ciąg kwadratów tych liczb. Jaki rodzaj potęgowania należy zastosować?
![]() Matlab ma wiele funkcji do tworzenia wykresów. Do tworzenia wykresów typu XY (na płaszczyźnie) mogą służyć m.in.funkcje:
plot(x,y,'krz') - liniowy, Podano tu najprostsze postaci tych funkcji gdyż mogą one mieć różną liczbę argumentów. Argument x ma być wektorem (ciągiem) wartości dla osi X a argument y - wektorem wartości dla osi Y. Wykres (obiekt typu line) powstaje w układzie współrzędnych zwanym axes a ten z kolei w oknie graficznym zwanym figure - tworzonym automatycznie lub przez użytkownika, poleceniem figure. W oknie tym można też tworzyć aplikacje graficzne z innymi obiektami, a w szczególności elementami typu uicontrol (przyciskami, suwakami, ...) . |
a) Zdefiniuj ciąg wartości kąta x od zera co 3 stopnie aż do 360 stopni
b) Zdefiniuj wektor y=sin(x) i wykonaj wykres przy pomocy funkcji plot(x,y).
Czy wykres jest prawidłowy? Zapomnieliśmy o radianach? Spróbuj poprawić lub przejdź dalej gdzie zajęto się tym problemem.
![]() Programy zawierające wiele poleceń piszemy i uruchamiamy (testujemy) w Edytorze Matlaba. Oto potrzebne czynności:
1. Przed rozpoczęciem pisania programów trzeba:
2. Otworzyć EDYTOR MATLABa - z Menu File-New lub File-Open lub ikonami: 3. Wpisać (lub przekopiować) tekst programu z uwzględnieniem komentarzy. 4. Zapisać utworzony program do pliku z domyślnym rozszerzeniem nazwy ".m" i domyślnie w "folderze bieżącym" (ustawionym j.w.) 5. Uruchomić działanie programu przyciskiem RUN w edytorze (z zieloną strzałką). 6. Oglądnąć i ocenić jego wyniki i ewentualne komunikaty o błędach w Oknie Komend. Poprawić te błędy i zapisać poprawioną wersję do pliku oraz wróćić do punktu poprzedniego (czyli uruchomić ponownie). W edytorze może być otwartych kilka programów i wtedy wybieramy je zakładkami u dołu. Program można też uruchomić przez wpisanie w oknie komend nazwy jego pliku (bez rozszerzenia) |
a) Przekopiuj poniższy program PR1 do edytora i uruchom dwukrotnie: raz dla Dx=0.4 i drugi raz dla Dx=0.04.
Który wykres jest do przyjęcia? Sformułuj wnioski z tego doświadczenia. Jak widać procedura próbkowania zachodzi w każdym programie tabelaryzacji i wykreślania funkcji.
% PROGRAM PR1 clear; clc; %Czyści pamięć i okno komend Dx=0.4; % <<<<<<<<<< OKRES PRÓBKOWANIA x=0:Dx:6; % wektor (ciąg) wartości x y=exp(3-x).*cos(15*x); % wektor (ciąg) wartości y plot(x,y,'-ro'); % wykres linią ciągłą, czerwoną (r=red), znacznik=kółko grid on; % włączamy siatkę text(2.2,12,['Okres próbkowania Dx=',num2str(Dx)]) title('Rola okresu próbkowania'); % opisy osi: xlabel('x'); ylabel('y=exp(3-x).*cos(15*x)'); |
W powyższym programie od znaku % rozpoczynane są KOMENTARZE czyli objaśnienia dla czytającego program
b) Wyznacz częstotliwość drgań i częstotliwości próbkowania dla obu przypadków (objaśnienie w zielonej ramce poniżej). W którym przypadku spełniony jest postulat twierdzenia o próbkowaniu?
Sygnał sinusoidalny w funkcji czasu przedstawiany jest jako funkcja: sin(ω*t) gdzie parametr ω to prędkość kątowa w radianach na sekundę. Wynika to z przyjęcia, że funkcja sinus powstaje jako rzut na oś pionową, długości promienia jednostkowego (R=1) obracającego się z prędkością kątową ω, więc kąt (droga kątowa) α = ω*t Okres drgań T to czas jednego obrotu (o kąt 2π radianów) skąd prędkość kątowa: ω= 2π/T albo ω = 2π*f gdzie f=1/T jest częstotliwością drgań |
Kolejny program PR2 operuje już częstotliwościami i pozwala obserwować sygnał sinusoidalny przed i po próbkowaniu oraz uwidacznia znaczenie doboru prawidłowefo okresu próbkowania
c) Przekopiuj do edytora podany niżej program, zapisz go do pliku a następnie uruchom (przyciskiem RUN z zieloną strzałką w edytorze).
d) Obserwuj zmiany na wykresie dla kilku różnych częstotliwości fp.
% PROGRAM PR2 % Wykres k okresów sygnału sinusoidalnego % o danej częstotliwości f, w funkcji czasu % oraz tego sygnału po próbkowaniu z częstotliwością fp clear; clc; % Dane: f=35,fp=2.5*f, k=3 T=1/f, tp=0; tk=k*T % Wykres "dokładny" - prawie ciągły omega=2*pi*f, n=100; dt=(tk-tp)/n t=0:dt:tk; y=sin(omega*t); % Wykres liniowy "dokładny" plot(t,y); % wykres grid on; % siatka hold on % pozwoli wstawić drugi wykres title('Próbkowanie sygnału sinusoidalnego'); xlabel('t'); % opis osi x ylabel('y(t)'); % opis osi y % ==== Próbkowanie: Dtp=1/fp, tt=0:Dtp:tk; % Wykres schodkowy po próbkowaniu L2=stairs(tt,sin(omega*tt),'r'); % pogrubiam linię: set(L2,'LineWidth',2); hold off |
![]() |
Aplikacje graficzne w Matlabie można tworzyć w oknach graficznych (figure) albo przy pomocy poleceń programu albo przy wykorzystaniu kreatora zwanego GUIDE. My wykorzystamy pierwszy sposób, objaśniony na prostym przykładzie aplikacji zawierającej tylko suwak (slider) i napis (text).
Okno figure i tworzone w nim elementy to OBIEKTY. Funkcje tworzące obiekty graficzne pozwalają określać ich CECHY. Mają one następującą postać: >>F1=figure('Position',[5 40 790 300], 'Name', 'TESTOWANIE');Cechy obiektu o znanym uchwycie można sprawdzać i pobierać ich wartości przy pomocy funkcji zm=get(uchwyt, 'Nazwa_cechy') oraz modyfikować (ustawiać) przy pomocy funkcji set(uchwyt, 'Nazwa_cechy', wartosc_cechy) np.: >> kolor_formatki=get(F1,'Color'); >> set(F1,'Color','Red');Obiekty mogą reagować na określone ZDARZENIA, wywołując procedurę określoną wartością cechy callback. Przyciski, suwaki, listy rozwijalne i in. elementy dialogowe zwane "kontrolkami" można tworzyć przy pomocy polecenia uicontrol (od: User Interface Control element - element sterujący interfejsu użytkownika). Rodzaj kontrolki określa cecha 'Style' obiektu uicontrol. Tą i inne ważniejsze cechy objaśnia tabela: ![]() Oprócz podanych wyżej jest jeszcze wiele innych cech. Oto niektóre częściej stosowane: 'BackgroundColor', [r g b] - kolor tła - wartości barw składowych [red green blue] 'ForegroundColor', [r g b] - kolor tekstu - wartości barw składowych [red green blue] 'FontName', 'nazwa' - nazwa czcionki 'FontSize', n - rozmiar czcionki 'Position', [Xp, Yp, Dx, Dy] - położenie dolnego lewego rogu i rozmiar 'Units', 'normalized' - jednostki dla określenia położenia domyślnie 'pixels', jeśli 'normalized' - to lewy dolny róg formatki ma współrzędne (0,0) a prawy górny (1,1). |
Dopisz (przekopiuj) na końcu poprzedniego programu podane niżej polecenia, definiujące jeszcze 2 napisy i suwak a następnie zapisz do pliku jako program PR3:
% PROGRAM PR3 %=== % .... % TU JEST POPRZEDNI PROGRAM % .... %--- Pole tekstowe dla f: T1=uicontrol('Style','Text','Units','Normalized','Position',[0.9 0.85 0.1 0.07]); set(T1,'String',['f=',num2str(f)]); %--- Pole tekstowe dla fp: T2=uicontrol('Style','Text','Units','Normalized','Position',[0.9 0.75 0.1 0.07]); set(T2,'String',['fp=',num2str(fp)]); %--- Suwak zmieniający fp: S1=uicontrol('Style','Slider','Units','Normalized','Position',[0.93 0.1 0.03 0.6]); set(S1,'Value',60,'Min',50,'Max',450,'SliderStep',[0.01 0.1], 'Callback','rysuj2'); %============= |
![]() |
Jak widać ruch suwaka oprócz zmiany fp wywołuje procedurę rysuj2 - dzięki wartości cechy Callback.
W oknie edytora utwórz nowy pusty dokument (kliknij ikonę pustej kartki) i przekopiuj to co niżej oraz zapisz do pliku o nazwie rysuj2.
%rysuj2 fp=get(S1,'Value'); Dtp=1/fp; tt=0:Dtp:tk; set(L2,'XData',tt,'YData',sin(omega*tt)); set(T2,'String',['fp=',num2str(fp)]); |
Uruchom program PR3 (musisz wybrać jego zakładkę w edytorze) i sprawdź działanie suwaka.
W zadaniu, sygnał ciągły złożony z dwu przebiegów sinusoidalnych ma regulowaną częstotliwość drugiej (wysokiej) składowej fd oraz regulowaną liczbę próbek n ustalonych w czasie obejmującym 3 okresy składowej niskiej.
Aplikacja składa się z trzech programów zapisanych do odpowiednich plików przy czym uruchamiać należy plik o nazwie przetw_AC
a) Przekopiuj te 3 programy do osobnych okien dokumentów w edytorze i zapisz do odpowiednich plików.
b) Uruchom program przetw_AC
c) Dla kilku wartości fd wyznacz graniczne n nie wywołujące jeszcze zjawiska aliasingu na wykresie FFT. Przelicz n na częstotliwość próbkowania fp.
% program przetw_AC % cz.1 INICJACJA - jednorazowa clear;clc; % Parametry składowej podst.: A=14; f=30; T=1/f; % Druga składowa: Ad=5; fd=180; % Czas obserwacji od tp do tk: tp=0; tk=3*T; % Liczba próbek: n=40; %---- t1=uicontrol('style','text','units','normalized','position',[0.005,0.85,0.09,0.03]); %set(t1,'string','fd=180'); s1=uicontrol('style','slider','units','normalized','position',[0.02,0.5,0.03,0.33]); set(s1,'Value',fd,'Min',30,'Max',230,'SliderStep',[0.01 0.05],'Callback','nowe'); %---- t2=uicontrol('style','text','units','normalized','position',[0.93,0.85,0.09,0.03]); %set(t2,'string','n=30'); s2=uicontrol('style','slider','units','normalized','position',[0.95,0.5,0.03,0.33]); set(s2,'Value',n,'Min',10,'Max',110,'Callback','nowe'); %---- rysuj; |
![]() |
% procedura rysuj % Okres i częstotl. próbkowania: Dtp=tk/(n-1); fp=1/Dtp; % Numery próbek i ciąg chwil próbkowania t(i): i=1:n; t(i)=(i-1)*Dtp; % Ciąg próbek sygnału: X(i)=A*sin(2*pi*f*t(i))+Ad*sin(2*pi*fd*t(i)); % Sygnał wejsciowy dokladny (ciągły): nn=200; dt=tk/(nn-1); k=1:nn; tt(k)=(k-1)*dt; XX(k)=A*sin(2*pi*f*tt(k))+Ad*sin(2*pi*fd*tt(k)); % Wykresy w funkcji czasu subplot(2,1,1); L1=stairs(t(i),X(i),'r'); grid on; hold on; L2=plot(tt(k),XX(k)); grid on; hold off; title('Sygnał wejściowy (niebieski) i sygnał po dyskretyzacji (czerw.)'); xlim([0 tk]); % FFT NFFT = 2^nextpow2(n); Y = fft(X,NFFT)/n; ff = fp/2*linspace(0,1,NFFT/2+1); subplot(2,1,2); L3=plot(ff,2*abs(Y(1:NFFT/2+1)));grid on; xlim([0 250]); title('Widmo Częstotliwościowo-Amplitudowe sygnału dyskretnego') xlabel('f (Hz)') ylabel('|P1(f)|') set(t1,'string',['fd=',num2str(fd)]); set(t2,'string',['n=',num2str(n)]); |
% procedura nowe fd=get(s1,'Value'); n=get(s2,'Value'); rysuj |
Jeśli chcesz w domu przećwiczyć podstawowe operacje to darmowy Freemat 3.6 możesz pobrać TUTAJ