------------------------------------------------------------------- ÚVOD ------------------------------------------------------------------- Roman Čmejla, textová verze 1. přednášky ze ZZS, 22.září 2014 OBSAH ------------------------------------------------------------- Organizace výuky a úvod do předmětu ZZS Hodnocení a podmínky udělení zápočtu Laboratorní řád ve výukové laboratoři 405 Cíle předmětu Obsah předmětu Literatura Úvod do prostředí MATLAB Popis prostředí a základy práce v MATLABu Nápověda Proměnné Matice Stručný přehled programování v MATLABu ------------------------------------------------------------------- Přednášející a cvičící: Doc. Ing. Roman Čmejla, CSc. (místn.525) Katedra: teorie obvodů Přednášky: pondělí od 9:15 Cvičení: učebna 405, pondělí 14:30 Zápočet: na základě účasti a zaslané semestrální práce Zkouška: 75% semestrální práce 25% zkouška WEB: sami.fel.cvut.cz/zzs ------------------------------------------------------------------- Hodnocení a podmínky udělení zápočtu - účast na přednáškách je doporučena Požadavek na zápočet: Dosažitelné body: semestrální práce ... max 100 bodů zkouška ............. max 25 bodů Výsledné hodnocení: A ... 91 a více B ... 81 až 90 C ... 71 až 80 D ... 61 až 70 E ... 50 až 60 F ... < 50 Semestrální práce: - Téma: Syntéza audio signálů Generujte audio signál (stupnici, píseň, nástroj, zvuk, …) v prostředí MATLAB. - Termín odevzdání: do 31.prosince 2013, 24:00 - Způsob odevzdání: zaslání 3 souborů na adresu cmejla.zavinac.fel.cvut.cz 1. prijmeni.doc ... dokument s popisem syntézy a reference 2. prijmeni.m ... soubor(y), který byl použit pro syntézu 3. prijmeni.wav ... soubor s výsledným signálem ------------------------------------------------------------------- Laboratorní řád ve výukové laboratoři 405 1. Studenti smějí být v laboratoři jen v přítomnosti vyučujícího. 2. Příkazy vyučujícího vedoucího cvičení musí být bezpodmínečně dodržovány. 3. Manipulace s měřícím zařízením je možná pouze se souhlasem vyučujícího. 4. Elektrický rozvod smí zapínat pouze vyučující. 5. Studenti jsou povinni sledovat při měření stav přístrojů a zařízení. V případě nebezpečí jsou povinni vypnout elektrický rozvod. 6. Závady na přístrojích nebo zařízení musejí studenti ihned hlásit vyučujícímu. 7. Opustit laboratoř je dovoleno jen se souhlasem vyučujícího. ------------------------------------------------------------------- Cíle předmětu Seznámit se s • popisem číslicových signálů • metodami analýzy číslicových signálů • návrhem systémů zpracování signálů • prostředím MATLAB Prakticky si vyzkoušet • generování, analýzu a zpracování syntetických i reálných signálů ------------------------------------------------------------------- Literatura Uvedený předmět nepokrývá žádná česká učebnice nebo skriptum. Řadu užitečných informací lze nalézt v textech a na webech zabývajících se číslicovým zpracováním signálů. 1. Čmejla, R., Sovka, P.: Úvod do číslicového zpracování signálů - cvičení. ČVUT Praha 2005. 2. Uhlíř, J., Sovka, P., Čmejla, R.: Úvod do číslicového zpracování signálů. ČVUT Praha 2003. 3. Zaplatílek, K., Doňar, B.: MATLAB - začínáme se signály. BEN 2006. 4. McClellan, J.H, Schafer, R.W., Yoder, M.A..: DSP First, A multimedia Approach, Prentice-Hall, Inc., New Jersey, 1998. 5. Openheim, A.V., Schafer, R.W.: Discrete-Time Signal Processing. Prentice-Hall, Inc., New Jersey, 1998. 6. Ambardar, A., Borghesani, C.: Mastering DSP Concepts using MATLAB. Prentice-Hall, Inc., New Jersey, 1998. 7. http://www.dspguide.com/pdfbook.htm ------------------------------------------------------------------- Úvod do prostředí MATLAB • Matlab je program pro numerické výpočty. • Původně byl určen pro řešení řešení úloh lineární algebry pomocí matic. • Jméno je odvozeno od MATrix LABoratory. • Matlab je programovací jazyk, který je v současné době široce používán jako základní platforma pro vývoj nástrojů pro strojové učení, zpracování signálů a obrazů … • Světový standard pro výuku technických a inženýrských oborů na universitách i v průmyslu • Firmy v oborech: letectví, biotechnologie, komunikace, elektronika, finančnictví, strojírenství, robotika Proč je MATLAB vhodný pro vývoj algoritmů a projektů? velké množství toolboxů a funkcí velmi užitečné pro zobrazování a vizualizaci dat mnoho 2 a 3 rozměrných grafů zobrazení bitmap interaktivní nástroje prohlížení grafiky (zoom, pseudobarvy, otočení ve 3D, …) tvorba GUI grafický vstup – MATLAB ví na jaký objekt jsme naposledy klikli vyšší úroveň programování: uživatel se soustředí na strukturu algoritmu, ne na detaily úsporný zápis (vzorce téměř jako v matematice) snadné rozšíření (nové funkce, nové toolboxy) integrované uživatelské rozhraní (příkazové okno, editor, debugger) umožňuje velmi rychlý vývoj Porovnání MATLABu s jinými prostředky • C/C++ pro vývoj algoritmů: rychlejší ladění díky mnoha podpůrným funkcím a vizualizaci • Excell pro grafiku a analýzu dat: neporovnatelně větší možnosti • Java: rychlejší • Mathematica/Maple: rychlejší, větší objem dat, úspornější zápis. Symbolická matematika jde v Matlabu také. • Matlab je méně vhodný na finální aplikace Dostupnost MATLABu • Matlab není freeware • ČVUT má multilicenci. Studenti mohou instalaci stáhnout z http://nss.cvut.czs pomocí hlavního přístupového hesla instalace je funkční na jekémkoliv počítači připojeném na síť • mnoho algoritmů a toolboxů je na webu zdarma • GNU Octave – alternativa zdarma http://www.gnu.org/software/octave/index.html http://www.octave.cz Literatura • národní: Zaplatílek-Doňar, skripta škol • mezinárodní: stovky odborných knih • online dokumence na stránkách MathWorks http://www.mathworks.com/access/helpdesk /help/techdoc/matlab.html • velké množství tutoriálů na webu je zdarma • Getting started with MATLAB http://www.mathworks.com/access/helpdesk/help/techdoc/learn_matlab/learn_matlab.shtml • MATLAB tutorial http://www.math.mtu.edu/~msgocken/intro/intro.html http://amath.colorado.edu/scico/tutorials/matlab/ • MATLAB helpdesk http://www.mathworks.com/access/helpdesk/help/helpdesk.shtml • MATLAB Primerftp://ftp.eng.auburn.edu/pub/sjreeves/matlab_primer_40.pdf ----------------------------------------------------------------------------- Pracovní plocha Příkazové okno Obsazení paměti Historie příkazů Cesta Nápověda online v Matlabu - help help help Help >> help >> help help >> help elfun >> help signal >> help angle >> help wavread >> help fft >> help sin >> lookfor FFT >> demos Datové typy • číslo • logická proměnná true, false, výsledky porovnání • řetězce uvozené znakem ' >> s='ahoj' • struktury – prvky jsou odděleny te4kou „.“ • >> bod.x=1; • cell-array – matice, kde každý prvek může být libovolným typem >> c={false,'ahoj',[1 2;3 5]} Proměnné • nejsou předem deklarovány • jména proměnných mají nejvíce 63 znaků • musí začínat písmenem, pak mohou následovat číslice a podtržítka • jména proměnných jsou „case sensitive“ • typ (integer, float, char) lze dále měnit >> a = pi/6 >> b = sin(a) >> a = 'ahoj' >> iskeyword >> which Pracovní plocha v MATLABu • vytvořené proměnné jsou ponechány v paměti • obsah paměti vidíme v okně nebo pomocí příkazů who a whos >> who >> whos • vymázání konkrétní proměnné >> clear >> clear a vektor7 • vymázání všech proměnných >> clear Zvláštní typy čísel ans - proměnná pro poslední nepřiřazený výsledek pi - hodnota inf - nekonečno např. n/0 -inf - mínus nekonečno např. log(0) NaN - „Not a number“ e.g. 0/0, Inf/Inf, Inf-Inf, 0*Inf version- vrátí verzi MATLABu Základní operace Maticové operace – pravidla lineární algebry Aritmetické operace – nad jednotlivými prvky „.“ • sčítání + a + b • odčítání - a - b • násobení * a*b • dělení / a/b =a*inv(b) • dělení zleva \ a\b =inv(a)*b • umocňování ^ a^b • násobení po prvcích .* a.*b • dělení po prvcích ./ a./b • umocňování po prvcích .^ a.^b Základní funce • size – velikost matice, lze definovat i rozměr • length – vrací největší rozměr matice • sqrt – odmocní každý prvek • max, min – vrací největší (nejmenší) prvek každého sloupce matice • sum – součet prvků sloupce • mean – střední hodnota prvků sloupce • var – rozptyl prvků sloupce • std – směrodatná odchylka prvků sloupce Spec. operátory ... pokračování výrazu , separátor v datech data % komentář end of line ; potlačuje výstup nebo řádkový separátor v matici : specifikuje rozsah Operátor „:“ m:n je stejné jako [m,m+1,...,n] m:k:n je stejné jako [m,m+k,m+2k, ..,n] A(:,n) je n-tý sloupec matice A A(m,:) je the m-tý řádek of A A(m:n) je A(m), A(m+1),...,A(n) A(:,m:n) je A(:,m), A(:,m+1),...,A(:,n) A(:,:,k) je k-tá vrstva 3-rozměrné matice A A(:) všechny prvky matice A jsou seřazeny do jednoho sloupce Matice v MATLABu • Matlab pracuje se všemi proměnnými jako s maticemi. • Vektory jsou speciální tvary matic a mohou obsahovat pouze jeden řádek nebo jeden sloupec. • Skaláry jsou matice s jediným řádkem a jediným sloupcem. • Generování řádkového vektoru v Matlabu: » rad_vek = [12 , 14 , 63] rad_vek = 12 14 63 • Generování sloupcového vektoru v Matlabu: » sl_vek = [13 ; 45 ; -2] sl_vek = 13 45 -2 • Generování matice v MATLABu (oddělení pomocí čárek a středníků): » matice = [1, 2, 3; 4, 5, 6; 7, 8, 9] matice = 1 2 3 4 5 6 7 8 9 Výběr submatice • Část matice může být vyjmuta a uložena jako menší matice. Syntaxe je: sub_matice = matice (r1 : r2, s1 : s2); kde r1 a r2 specifikuje rozmezí řádků a s1 a s2 specifikuje sloupce, které mají být vyjmuty do nové matice. • Sloupcový vektor lze získat z matice. » matice = [1,2,3;4,5,6;7,8,9] matice = 1 2 3 4 5 6 7 8 9 Příklad vyjmutí druhého sloupce: » sl_dva = matice(:, 2) sl_dva = 2 5 8 • Řádkový vektor lze získat z matice: » matice = [1,2,3;4,5,6;7,8,9] matice = 1 2 3 4 5 6 7 8 9 Příklad vyjmutí druhého řádku: » rad_dva = matrix(2:2, 1:3) rad_dva = 4 5 6 Přístup k jednotlivým prvkům matice A(m,n) Přístup k více prvkům matice A(1,4) + A(2,4) + A(3,4) + A(4,4) nebo sum(A(1:4,4)) nebo sum(A(:,end)) (klíčové slovo end odkazuje na poslední řádek nebo sloupec) Mazání řádků a sloupců příklad vymazání druhého sloupce matice X X(:,2) = [] Spojení matic A a B C=[A;B] Některé maticové funkce • X = A’ % Transponovaná matice • X = inv(A) % Inverzní matice • d = det(A) % Determinant matice >> help elmat Vektory a matice v MATLABu I >> vektor1 = [1, 2, 3] >> vektor2 = [1 2 3] >> vektor3 = vektor1*2 >> vektor4 = [2, 3, 4] >> vektor2.*vektor4 % !tečka >> vektor2'*vektor4 % !apostrof = transp. >> vektor2*vektor4'‚ >> vektor2*vektor4‚ % !nelze >> matice1 = [1,2,3,4;5,6,7,8;9,10,11,12] >> b*5 >> d = b+5 >> [vektor1;vektor4;vektor1] >> [vektor1' vektor4' vektor1'] Vektory a matice v MATLABu II Rychlé generování vektorů a matic >> vektor5 = [-9:9] >> vektor6 = [0:0.1:9.9] >> matice2 = [1:1:10;1:2:20] >> vektor7 = -pi/2:pi/4:pi/2 >> vektor8 = linspace(0,10,6) >> vektor9 = logspace(1,2,5) >> vektor10= ones(1,5) >> vektor11= zeros(5,1) >> matice3 = zeros(3) Vektory a matice v MATLABu III Hodnota konkrétního prvku vektoru >> matice2(1,4) >> matice2(4,1) % nelze! >> matice2(0,1) % nelze! Zobrazení všech hodnot v řádku nebo ve sloupci >> matice2(2,:) >> matice2(:,4) >> matice2(:,4:6) Vytvoření sloupcového vektoru z matice >> vektor12=matice1(:) Spojení více vektorů >> vektor13= [vektor1 vektor12’]’; Další funkce >> help elmat Uložení dat do souboru • save soubor VAR1 VAR2 … nebo save(‘soubor’,’VAR1’,’var2’) Nahrání dat ze souboru • load load soubor load ('soubor ') load soubor.ext load soubor –ascii load soubor –mat Formáty souborů • mat -> Binary MAT • ascii -> 8-digit ASCII form Kreslení % příklad » a = 1:100; » b = 100:0.01:101; » c = 101:-1:1; » d = [a b c]; » e = [d d d d d]; » plot(e) % příklad » x = rand(1,100); » y = rand(1,100); » plot(x,y,'*') Kreslení (2-D) >> t = [-pi:0.1:pi]; % význam ; >> sin_t = sin(t); >> plot(sin_t) % zobrazení sin >> plot(t, sin_t) % včetně osy x >> cos_t = cos(t); >> plot(t, cos_t) % zobrazení cos >> hold on % přikreslení >> plot(t, sin_t) >> clf % smazání aktuál.obr. >> plot(t,sin_t,t,cos_t) >> plot(t,sin_t,'go-',t,cos_t,'r:') >> legend('sin(t)', 'cos(t)') >> xlabel('---> t') >> ylabel('---> amplituda') >> title('sin(t) a cos(t)') >> grid >> axis tight >> subplot(221), >> plot(t,sin_t), axis tight, >> title('sinusovka') >> subplot(222), >> plot(t,cos_t) ,axis tight, >> title('kosinusovka') >> subplot(212), >> plot(t,sin_t,':k',t,cos_t,'--r'), >> axis tight, >> legend('sinusovka','kosinusovka') >> title('Harmonicke prubehy') >> help plot >> help hold >> help legend >> help axis >> help stem >> figure Zvuk v MATLABu I >> help audio >> doba = 1; % casove trvani [s] >> fs = 44100; % vz. frekvence [Hz] >> Ts = 1/fs; % interval mezi vzorky >> t = [0:Ts:doba-Ts]; % casova osa >> f1 = 440; % frekvence [Hz] >> A1 = 0.25; % amplituda >> signal = A1*sin(2*pi*f1*t); >> sound(signal,fs); >> soundsc(signal,fs); >> help wavwrite >> wavwrite(signal,fs,'test.wav'); Matlab – programovací jazyk • výrazy • řídící příkazy podmínky iterace (cykly) • skripty • funkce Výrazy MATLAB podporuje následující operátory • menší než < • menší než nebo roven <= • vetší než > • menší než nebo roven >= • roven k == • různý od ~= Logické operátory • not ~ % negace • and & % logický součin • or | % logický součet Podmínky Cykly Optimalizace kódu • Pokud to lze, netvoříme cykly: for ind = 1:10000 b(ind)=sin(ind/10) end ale používáme vektorů: x=0.1:0.1:1000; b=sin(x); m-files • Textové soubory s programy v Matlabu. • Lze je volat z příkazové řádky nebo z jiného souboru (m-file) • “.m” • Dva typy m-files: skripty funkce m-files: skripty (bez vstupních argumentů nevrací žádnou hodnotu) m-files: funkce • Parametry, vrací hodnoty • Proměnné definované uvnitř funkce • Obvykle jeden soubor pro jednu funkci • Struktura: function [out1, out2, ..., outN] = name_function(par1, par2, ..., parM) sentence; …. sentence; end Skripty a funkce function [suma,rozd,souc,podil] = arit(a,b) % Popis funkce: Funkce ARIT provadi zakladni % operace se dvema cisly % Pouziti: [suma,rozd,souc,podil] = arit(a,b) % vstup: a,b ... proměnné % vystup: suma = a + b % rozd = a - b % souc = a * b % podil = a / b % % 23/03/2011 if (nargin ~=2) disp('Pouziti:[suma,rozd,souc,podil]=arit(a,b)'); end; if (nargout >= 1) suma = a+b; end; if (nargout >= 2) rozd = a-b; end; if (nargout >= 3) souc = a*b; end; if (nargout >= 4) podil = a/b; end; if (nargout == 0) fprintf('soucet = %g\n', a+b); fprintf('rozdil = %g\n', a-b); fprintf('soucin = %g\n', a*b); fprintf('podil = %g\n', a/b); end; >> arit Pouziti:[suma,rozd,souc,podil]=arit(a,b) >> arit(2,1) suma = 3 rozd = 1 souc = 2 podil= 2 >> [soucet,rozdil] = arit(2,1) soucet = 3 rozdil = 1