Differences

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

Link to this comparison view

ps:laboratoare:01 [2019/09/29 19:23]
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>​ 
-clear all 
- 
-N = 5000; 
-A = rand(N); 
-B = rand(N); 
-C = zeros(N); 
- 
-tic  
-for i = 1:size(A,1) 
-    for j = 1:size(A,2) 
-        C(i,j) = A(i,j) * B(i,j); 
-    end 
-end 
-time_row = toc 
- 
-tic  
-for j = 1:size(A,2) 
-    for i = 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>​ 
- 
 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, 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,
  ș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).  ș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).
- 
-<​hidden>​ 
  
 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.  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. 
Line 237: Line 173:
 Observație pentru asistenți: acest tip de zgomot se numeste salt and pepper. Studentii vor ajunge repede la soluția cu median filter: Observație pentru asistenți: acest tip de zgomot se numeste salt and pepper. Studentii vor ajunge repede la soluția cu median filter:
 https://​www.mathworks.com/​help/​images/​noise-removal.html. De recomandat ca punctarea sa se faca doar in cazul implementarilor proprii. https://​www.mathworks.com/​help/​images/​noise-removal.html. De recomandat ca punctarea sa se faca doar in cazul implementarilor proprii.
- 
- 
- 
- 
-<code matlab '​sinewaves.m'>​ 
-clear all 
-close all 
-% incarc imaginea, transform in gri 
-% redimensionez valoarea pixelilor in intervalul [0,1] 
-img = imread('​lab02-city-vision2.jpg'​);​ 
-gray = imresize(img,​0.2);​ 
-gray = double(gray(:,:,​1)) / 255; 
- 
-% calculez matrice de zgomot random uniform 
-noise = rand(size(gray));​ 
-th1 = 0.987; 
-th2 = 0.013; 
-% selectez pixelii care vor fii alterati 
-salt = double(noise > 0.987) ; 
-pepper = double(noise < 0.007); 
- 
-% adaug zgomot alb(salt) dand valori foarte mari unor pixeli 
-% adaug zgomot negru(pepper) dand valori foarte mici unor pixeli 
-noisy_img = noisy_img .* salt .* th1  + (1-salt) .* gray; 
-noisy_img = noisy_img .* pepper * th2 .* noise + (1-pepper) .* noisy_img; 
- 
-figure , imshow(noisy_img);​ 
-title('​Noisy Image'​) 
- 
-filtered_img = medfilt2(noisy_img);​ 
-figure , imshow(filtered_img);​ 
-title('​Filtered Image'​) 
- 
-save('​noisy_img',​ '​noisy_img'​) 
- 
-</​code>​ 
 </​hidden>​ </​hidden>​
- 
- 
- 
  
ps/laboratoare/01.1569774225.txt.gz · Last modified: 2019/09/29 19:23 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