Differences

This shows you the differences between two versions of the page.

Link to this comparison view

ps:laboratoare:01 [2018/10/03 09:27]
andrei.nicolicioiu
ps:laboratoare:01 [2020/10/07 18:49] (current)
ionut.gorgos
Line 1: Line 1:
 ===== Laboratorul 01. ===== ===== Laboratorul 01. =====
  
-În acest laborator ne vom obișnui cu MATLAB ​și vom face câteva procesări de semnal simple. Majoritatea tehnicilor de procesare de semnal pot fi executate ca operații pe vectori și matrici, deci MATLAB ​este o unealtă foarte folositoare pentru a face aceste operații.+În acest laborator ne vom obișnui cu OCTAVE ​și vom face câteva procesări de semnal simple. Majoritatea tehnicilor de procesare de semnal pot fi executate ca operații pe vectori și matrici, deci OCTAVE ​este o unealtă foarte folositoare pentru a face aceste operații.
  
-Pentru acest laborator ​vom avea ca referințătutorialul [[http://​uk.mathworks.com/​help/​pdf_doc/​matlab/​getstart.pdf?​s_tid=int_tut ​| de aici]]+Pentru acest laborator ​s-a avut ca referință tutorialul ​(acum am trecut la Octave) ​[[https://​web.archive.org/​web/​20180417185102/​http://​uk.mathworks.com/​help/​pdf_doc/​matlab/​getstart.pdf | de aici]] 
 + 
 +Octave poate fi downloadat de aici: [[https://​www.gnu.org/​software/​octave/​download.html | Octave]]
  
 Urmărind capitolul 1 (Quick Start), haideți să facem următoarele exerciții. Urmărind capitolul 1 (Quick Start), haideți să facem următoarele exerciții.
Line 18: Line 20:
 2. Vectori 2. Vectori
  
-Semnalele pot fi reprezentate ca secvențe de valori, unde în MATLAB ​se face, de obicei, prin vectori sau matrici. Să începem cu vectorii.+Semnalele pot fi reprezentate ca secvențe de valori, unde în OCTAVE ​se face, de obicei, prin vectori sau matrici. Să începem cu vectorii.
  
 Pentru a genera un vector de valori date, putem scrie pur și simplu ceva de genul: Pentru a genera un vector de valori date, putem scrie pur și simplu ceva de genul:
Line 25: Line 27:
   * Creați un vector cu 7 elemente de unu (folosind funcția '​ones'​),​ iar apoi multiplicați-l cu o constantă. Afișați rezultatul.   * Creați un vector cu 7 elemente de unu (folosind funcția '​ones'​),​ iar apoi multiplicați-l cu o constantă. Afișați rezultatul.
   * Creați un vector de 5 valori aleatoare folosind funcția '​rand'​. Introduceți în consolă 'help rand' pentru a găsi cum să o utilizați. ​   * Creați un vector de 5 valori aleatoare folosind funcția '​rand'​. Introduceți în consolă 'help rand' pentru a găsi cum să o utilizați. ​
-  * Indexarea în Matlab ​pornește de la 1, deci puteți selecta primul element din vector folosind comanda vec1(1). De asemenea, puteți indexa părți din vector: vec1(2:3) pentru a selecta un vector format din al doilea și al treilea element din vec1. vec1(end-1:​end) selectează ultimele 2 elemente din vec1.+  * Indexarea în OCTAVE ​pornește de la 1, deci puteți selecta primul element din vector folosind comanda vec1(1). De asemenea, puteți indexa părți din vector: vec1(2:3) pentru a selecta un vector format din al doilea și al treilea element din vec1. vec1(end-1:​end) selectează ultimele 2 elemente din vec1.
  
 3. Matrici 3. Matrici
Line 89: Line 91:
  
   * Generați un vector aleator folosind '​rand'​ și găsiți maximul (folosiți funcția '​max'​).   * Generați un vector aleator folosind '​rand'​ și găsiți maximul (folosiți funcția '​max'​).
-  * Rețineți că MATLAB ​a fost dezvoltat pentru a fi folosit pe matrici, deci există multe modalități de a manipula matricele.+  * Rețineți că OCTAVE ​a fost dezvoltat pentru a fi folosit pe matrici, deci există multe modalități de a manipula matricele.
   * Calculați suma pătratelor elementelor dintr-un vector.   * Calculați suma pătratelor elementelor dintr-un vector.
   * Puteți parcurge vectorul folosind instrucțiunea '​for'​.   * Puteți parcurge vectorul folosind instrucțiunea '​for'​.
Line 106: Line 108:
 10. Grafice 10. Grafice
  
-Graficele sunt unele dintre cele mai tari lucruri în MATLAB, deoarece acestea ne permit să vizualizăm datele noastre.+Graficele sunt unele dintre cele mai tari lucruri în OCTAVE, deoarece acestea ne permit să vizualizăm datele noastre.
  
   * Folosiți funcția '​sin'​ pentru a genera o sinusoidă de frecvență 1 Hz peste 1 secundă (astfel încât ar trebui să obțineți o perioadă completă). Pentru asta trebuie să generați intervalul de timp peste [0 ... 1] în pași foarte mici (e.g. 0.01) și apoi să apelați funcția sin(2*pi*f*t) peste această secvență (unde f este frecvența, t este intervalul de timp, iar pi este numărul 3.1415...) pentru a obține sinusoida ca o secvență.   * Folosiți funcția '​sin'​ pentru a genera o sinusoidă de frecvență 1 Hz peste 1 secundă (astfel încât ar trebui să obțineți o perioadă completă). Pentru asta trebuie să generați intervalul de timp peste [0 ... 1] în pași foarte mici (e.g. 0.01) și apoi să apelați funcția sin(2*pi*f*t) peste această secvență (unde f este frecvența, t este intervalul de timp, iar pi este numărul 3.1415...) pentru a obține sinusoida ca o secvență.
Line 122: Line 124:
 11. Câteva exerciții simple de procesare de semnal 11. Câteva exerciții simple de procesare de semnal
  
-Cel mai bine este să vă faceți programele ​MATLAB ​în script-uri, astfel încât să le puteți reutiliza mai târziu. În acest fel puteți, de asemenea, să vă creați funcții proprii. Pentru acum, haideți să creăm doar niște script-uri.+Cel mai bine este să vă faceți programele ​OCTAVE ​în script-uri, astfel încât să le puteți reutiliza mai târziu. În acest fel puteți, de asemenea, să vă creați funcții proprii. Pentru acum, haideți să creăm doar niște script-uri.
  
   * Creați un script nou pe care îl numiți '​basic_dsp.m',​ în care veți scrie comenzile pentru următoarele operații.   * Creați un script nou pe care îl numiți '​basic_dsp.m',​ în care veți scrie comenzile pentru următoarele operații.
Line 136: Line 138:
  
 /* Make it hidden before lab, unhide afterwards */ /* Make it hidden before lab, unhide afterwards */
-<​hidden>​ 
-Un exemplu de cod este acesta: 
-<code matlab basic_dsp.m>​ 
-close all; 
-f1 = 1; 
-f2 = 2; 
-x = 0:0.01:1; 
-s1 = sin(2*pi*f1*x);​ 
-s2 = sin(2*pi*f2*x);​ 
-h1 = figure; 
-plot(x, [s1; s2]); 
-xlabel('​Time (s)'); 
-ylabel('​Amplitude'​);​ 
-title('​Two sinewaves'​);​ 
-legend('​1 Hz', '2 Hz'); 
-h2 = figure; 
-c = s1 + s2; 
-plot(x, c); 
-xlabel('​Time (s)'); 
-ylabel('​Amplitude'​);​ 
-title('​Sum of the two sinewaves'​);​ 
-print(h1, '​-dpng',​ '​sine1.png'​);​ 
-print(h2, '​-dpng',​ '​sine2.png'​);​ 
-</​code>​ 
-</​hidden>​ 
- 
  
-  ​ 
 12. O aplicație ușoară 12. O aplicație ușoară
  
Line 180: Line 155:
 Rețineți că o matrice imagine conține numai valori de la 0 la 255. Rețineți că o matrice imagine conține numai valori de la 0 la 255.
  
-<​hidden>​ 
-Un exemplu de cod este acesta: 
-<code matlab> 
-II = IR - R1*0.3 - R2*0.3; 
-image(II) 
-</​code>​ 
-</​hidden>​ 
  
 13. Column major 13. Column major
  
-MATLAB ​stochează datele în ordine pe coloane (column major). Pentru a testa asta încercați să înmulțiți element cu element două matrici mari (N = 5000) folosind 2 for-uri. Parcurgeți matricea pe rânduri, iar apoi pe coloane. Pentru a măsura timpul puneți funcția '​tic'​ înainte, iar funcția '​toc'​ după blocul de cod pe care doriți să îl măsurați. De asemenea, calculați înmulțirea folosind operatorul '​.*'​. Observați diferențele de timp. +OCTAVE ​stochează datele în ordine pe coloane (column major). Pentru a testa asta încercați să înmulțiți element cu element două matrici mari (N = 1000) folosind 2 for-uri. Parcurgeți matricea pe rânduri, iar apoi pe coloane. Pentru a măsura timpul puneți funcția '​tic'​ înainte, iar funcția '​toc'​ după blocul de cod pe care doriți să îl măsurați. De asemenea, calculați înmulțirea folosind operatorul '​.*'​. Observați diferențele de timp.  
  
 <​hidden>​ <​hidden>​
-<code matlab test_column_major>​ +14. BONUS: In fișierul următor aveți o imagine ({{:​ps:​laboratoare:​noisy_img.mat|noisy_img.mat}}) care a fost alterată cu zgomot, valorile unor pixeli devenind foarte mari, 
-clear all+ și ale altora foarte mici. Important este ca pixelii cu zgomot apar destul de rar. Încercați să refaceți imaginea originală. Imaginea e reprezentată ca o matrice cu valori in [0,1] și o vom afișa cu functia imshow(noise_img).
  
-N = 5000; +Ideea acestui exercițiu este că zgomotul este rar, asa că in proximitatea unui pixel alterat este șansă mică să existe alt pixel alterat. Asa ca vom Înlocui acel pixel cu o valoare care depinde de pixelii din jurul sau, de exemplu dintr-o zonă de 3x3 pixeli centrată în el. 
-A = rand(N); +
-B = rand(N); +
-C = zeros(N);+
  
-tic  +Posibile soluții: ​ 
-for i = 1:size(A,1) +1. filtru medie - înlocuirea fiecărei valori cu media vecinilor. Avantajfiltru liniarrapid se reduce la o convoluție. 
-    for j = 1:size(A,2) +1. filtru median - înlocuirea fiecărei valori cu mediana vecinilor ​(valoarea din centrul secvenței sortate). Filtru median are avantajul că NU va fi influențat de valorile extreme ale pixelilor afectați, pentru ca e o sansă extrem de mică ca ei să fie mediana dintr-o zona. În cazul filtrului mediu, pixelii alterațafectează toți pixelii din jurul lor. Dezavantaj: filtru neliniar, mai încetpentru că mediana e greu de calculat (O(N^2naiv sau O(N) eficientunde N e numărul de pixel din vecinatateși nu se vectorizează ușor.
-        C(i,j) = A(i,j* B(i,j)+
-    end +
-end +
-time_row = toc+
  
-tic  +Observație pentru asistenți: acest tip de zgomot se numeste salt and pepperStudentii vor ajunge repede la soluția cu median filter: 
-for j = 1:​size(A,​2) +https://www.mathworks.com/​help/​images/​noise-removal.html. De recomandat ca punctarea sa se faca doar in cazul implementarilor proprii.
-    for = 1:size(A,1) +
-        C(i,j) = A(i,j) * B(i,j); +
-    end +
-end +
-time_column = toc +
- +
-tic +
-C = A .* B; +
-time_matrix_operation = toc +
- +
-</code>+
 </​hidden>​ </​hidden>​
- 
-14. BONUS: In fișierul următor aveți o imagine ({{:​ps:​laboratoare:​noisy_img.mat|noisy_img.mat}}) care a fost alterată cu zgomot, unii pixel devenind foarte mari, 
- altii foarte mici. Încercați să refaceți imaginea originală. Pentru a afișa imaginea folosiți functia imshow(noise_img). 
- 
-  * Responsabil:​ [[ionutgorgos@gmail.com|Ionuț Gorgos]] 
-  * Data publicării:​ 1.10.2018 
- 
- 
  
ps/laboratoare/01.1538548064.txt.gz · Last modified: 2018/10/03 09:27 by andrei.nicolicioiu
CC Attribution-Share Alike 3.0 Unported
www.chimeric.de Valid CSS Driven by DokuWiki do yourself a favour and use a real browser - get firefox!! Recent changes RSS feed Valid XHTML 1.0