This shows you the differences between two versions of the page.
ps:laboratoare:02 [2017/09/11 11:20] darius.necula |
ps:laboratoare:02 [2020/10/07 18:22] (current) ionut.gorgos |
||
---|---|---|---|
Line 1: | Line 1: | ||
===== Laboratorul 02. ===== | ===== Laboratorul 02. ===== | ||
+ | /* <hidden> */ | ||
==== Semnale şi sisteme de bază ==== | ==== Semnale şi sisteme de bază ==== | ||
Line 13: | Line 14: | ||
- Care este cel mai mic interval de transmisie care are sens să fie folosit cu frecvenţele de mai sus? Cu alte cuvinte, cât ar trebui să fie T astfel încât semnalul să aibă un număr întreg de cicluri? [1p] | - Care este cel mai mic interval de transmisie care are sens să fie folosit cu frecvenţele de mai sus? Cu alte cuvinte, cât ar trebui să fie T astfel încât semnalul să aibă un număr întreg de cicluri? [1p] | ||
- Afişaţi cu ajutorul Matlab semnalul produs de modem pe parcursul mai multor intervale de transmisie consecutive. Aşa cum am învăţat în laboratorul trecut adăugaţi titlu şi etichete plotului. [1p] | - Afişaţi cu ajutorul Matlab semnalul produs de modem pe parcursul mai multor intervale de transmisie consecutive. Aşa cum am învăţat în laboratorul trecut adăugaţi titlu şi etichete plotului. [1p] | ||
- | |||
- | <hidden> | ||
- | <note tip> | ||
- | Prima frecvenţă este de 1600 = 8 * 200 Hz, iar a doua de 1800 = 9 * 200 Hz. Este clar că amândouă sunt multiple de 200 Hz. Astfel, dacă folosim o frecvenţă de 200 Hz ( T = 1/200 s ), primul semnal va cicla de 8 ori, iar al doilea de 9 ori. De aceea avem nevoie de o perioadă minimă de T = 1/200. | ||
- | |||
- | Un posibil cod de afişare a semnalului: | ||
- | |||
- | <code matlab 'sinewaves.m'> | ||
- | %% Sinewaves | ||
- | close all; | ||
- | f1 = 1800; | ||
- | f2 = 1600; | ||
- | fm = 200; | ||
- | tm = 1/fm; | ||
- | x = 0:tm/100:tm; | ||
- | 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('1800 Hz', '1600 Hz'); | ||
- | print(h1, '-dpng', 'sines.png'); | ||
- | </code> | ||
- | </note> | ||
- | </hidden> | ||
=== Exerciţiul 2 [2.5p] === | === Exerciţiul 2 [2.5p] === | ||
Line 78: | Line 52: | ||
- să setaţi numărul de puncte la N = 200 şi delay-ul la T = 100 | - să setaţi numărul de puncte la N = 200 şi delay-ul la T = 100 | ||
- să creaţi cele 3 semnale (care urmează să fie combinate) folosind 'ramp' şi 'ustep' cu N şi T de mai sus. [1p] | - să creaţi cele 3 semnale (care urmează să fie combinate) folosind 'ramp' şi 'ustep' cu N şi T de mai sus. [1p] | ||
- | * Puteţi crea secvenţa de input ca <code matlab> x=1:N; </code> | + | * Puteţi crea secvenţa de input ca: <code matlab> x=1:N; </code> |
* Puteţi crea primul semnal ca: <code matlab> s1 = ramp(N) </code> | * Puteţi crea primul semnal ca: <code matlab> s1 = ramp(N) </code> | ||
* Puteţi întârzia un semnal cu T în felul următor: <code matlab> [zeros(1,T), s(1:N-T)]; </code> | * Puteţi întârzia un semnal cu T în felul următor: <code matlab> [zeros(1,T), s(1:N-T)]; </code> | ||
Line 90: | Line 64: | ||
- | Pentru a afisa mai multe semnale în aceeaşi figură cu ajutorul comenzii plot puteţi folosi <code matlab> hold on; </code> după primul plot: | + | Pentru a afişa mai multe semnale în aceeaşi figură cu ajutorul comenzii plot puteţi folosi <code matlab> hold on; </code> după primul plot: |
<code matlab> | <code matlab> | ||
Line 99: | Line 73: | ||
</code> | </code> | ||
</note> | </note> | ||
- | /*</hidden>*/ | + | |
Ar trebui să obtineţi ceva similar imaginii de mai jos: | Ar trebui să obtineţi ceva similar imaginii de mai jos: | ||
Line 105: | Line 80: | ||
{{:ps:laboratoare:combined_signals.png?600|}} | {{:ps:laboratoare:combined_signals.png?600|}} | ||
- | <hidden> | ||
- | <note tip> | ||
- | Acesta este codul pentru funcţia 'unit step': | ||
- | <code matlab ustep.m> | + | === Exerciţiul 3 [1p] === |
- | function y=ustep(N) | + | |
- | %RAMP Returns a step signal of a given number of smaples | + | |
- | % [y] = USTEP(N) | + | |
- | % returns the step signal for the given samples | + | |
- | y = ones(1, N); | + | La curs am văzut că datorită egalității lui Euler putem scrie o exponenţială complexă ca o sumă de sin şi cos: |
- | </code> | + | |
- | + | ||
- | Pentru a combina ploturile puteţi folosi următorul cod: | + | |
- | <code matlab signal_composition.m> | + | |
- | N = 200; | + | |
- | T = 100; | + | |
- | y1 = ramp(N); | + | |
- | y2 = [zeros(1,T), -y1(1:N-T)]; | + | |
- | y3 = ustep(N); | + | |
- | y3 = [zeros(1,T), -T*y3(1:N-T)]; | + | |
- | ys = y1+y2+y3; | + | |
- | x = 1:N; | + | |
- | s1 = y1(x); | + | |
- | s2 = y2(x); | + | |
- | s3 = y3(x); | + | |
- | ss = s1+s2+s3; | + | |
- | h = figure; | + | |
- | plot(x, ss, 'k-', 'LineWidth', 3); | + | |
- | hold on; | + | |
- | plot(x, s1, 'g-', 'LineWidth', 2); | + | |
- | plot(x, s2, 'b-', 'LineWidth', 2); | + | |
- | plot(x, s3, 'r-', 'LineWidth', 2); | + | |
- | legend('sum', 'r(t)', '-r(t-T)', '-u(t-T)'); | + | |
- | print(h1, '-dpng', 'combined_signals.png'); | + | |
- | </code> | + | |
- | </note> | + | |
- | </hidden> | + | |
- | + | ||
- | === Exercitiul 3 [1p] === | + | |
- | + | ||
- | La curs am vazut ca datorita identitatilor lui Euler putem scrie o exponentiala complexa ca o suma de sin si cos: | + | |
/* e^(j*t) = cos(t) + j*sin(t) */ | /* e^(j*t) = cos(t) + j*sin(t) */ | ||
Line 158: | Line 95: | ||
$e^{-j \cdot t} = \cos(t) - j \cdot \sin(t)$ | $e^{-j \cdot t} = \cos(t) - j \cdot \sin(t)$ | ||
- | Adunand aceste 2 ecuatii si impartind la 2 obtinem: | + | Adunând aceste 2 ecuaţii şi împărţind la 2 obţinem: |
/* cos(t) = (e^(j*t) + e^(-j*t)) / 2 */ | /* cos(t) = (e^(j*t) + e^(-j*t)) / 2 */ | ||
Line 164: | Line 101: | ||
$\cos(t) = \frac{e^{j \cdot t} + e^{-j \cdot t}}{2}$ | $\cos(t) = \frac{e^{j \cdot t} + e^{-j \cdot t}}{2}$ | ||
- | Incercati sa aratati asta in Matlab, facand urmatoarele: | + | Încercaţi să arătaţi asta în Matlab, făcând următoarele: |
- | * Folositi secventa de input <code matlab> t = [0, pi/6, pi/4, pi/3, pi/2]; </code> | + | * Folosiţi secvenţa de input <code matlab> t = [0, pi/6, pi/4, pi/3, pi/2]; </code> |
- | * Afisati exponentiala complexa /* s1=e^(j*t) */ $s_1 = e^{j\cdot t}$, e.g. <code matlab> plot(exp(1i*t), 'ro'); </code> | + | * Afişaţi exponenţiala complexă /* s1=e^(j*t) */ $s_1 = e^{j\cdot t}$, e.g. <code matlab> plot(exp(1i*t), 'ro'); </code> |
- | * Afisati exponentiala complexa /* s2=e^(-j*t) */ $s_2 = e^{-j \cdot t}$ cu o alta culoare | + | * Afişaţi exponenţiala complexă /* s2=e^(-j*t) */ $s_2 = e^{-j \cdot t}$ cu o altă culoare |
- | * Calculati media celor 2 exponentiale /* ss=(s1+s2)/2 */ $s_s = \frac{s_1 + s_2}{2}$, i.e. cos(t) | + | * Calculaţi media celor 2 exponenţiale /* ss=(s1+s2)/2 */ $s_s = \frac{s_1 + s_2}{2}$, i.e. cos(t) |
- | * Afisati secventa rezultata in imaginar folosid real(ss) ca valori x si imag(ss) ca valori y. | + | * Afisaţi secvenţa rezultată în imaginar folosid real(ss) ca valori x şi imag(ss) ca valori y |
- | * Verificati daca s1, s2 si ss arata cum v-ati fi asteptat. | + | * Verificaţi dacă s1, s2 şi ss arată cum v-aţi fi aşteptat! |
- | <hidden> | + | === Exerciţiul 4 [1.5p] === |
- | <note tip> | + | |
- | Acesta este un posibil cod: | + | |
- | <code matlab complex_exp.m> | + | |
- | t = 0:0.1:2*pi; | + | |
- | figure; | + | |
- | plot(exp(1i*t), 'k.'); | + | |
- | hold on; | + | |
- | plot(0, 0, 'kx'); | + | |
- | t = [0, pi/6, pi/4, pi/3, pi/2]; | + | |
- | plot(exp(1i*t), 'ro'); | + | |
- | plot(exp(-1i*t), 'bo'); | + | |
- | ss = (exp(1i*t)+exp(-1i*t))/2; | + | |
- | plot(real(ss), imag(ss), 'go'); | + | |
- | legend('circle', 'origin', 'e^jt', 'e^-jt', '(e^jt + e-jt)/2'); | + | |
- | </code> | + | |
- | </note> | + | |
- | </hidden> | + | |
- | === Exercitiul 4 [1.5p] === | + | La curs am discutat despre sisteme paralele. Acum vom folosi un exemplu simplu de sistem paralel folosit pentru a crea efectul de ecou. Ideea de bază e ca un sistem să replice semnalul de intrare în timp ce un altul îl întârzie. La final cele două sunt adunate. |
- | + | ||
- | La curs am vazut un exemplu simplu de un sistem paralel folosit pentru a crea efectul de ecou. Ideea de baza e ca un sistem sa replice semnalul de intrare in timp ce un altul il intarzie. La final cele doua sunt adunate. | + | |
Task-ul vostru pentru a replica experimentul: | Task-ul vostru pentru a replica experimentul: | ||
- | * Avand semnalul de intrare cu o voce in fisierul {{:ps:laboratoare:voice.mat|this}}. | + | * Având semnalul de intrare cu o voce in fişierul {{:ps:laboratoare:voice.mat|this}}. |
- | * Faceti o copie a semnalului si intarziati-o. (de ex cu d=500 de esantioane). | + | * Faceţi o copie a semnalului şi întârziaţi-o (de ex cu 0.1 secunde. Trebuie stiut ca semnalul este esantionat cu o frecvență de 8000 Hz). |
- | * Adunati cele 2 semnale | + | * Adunaţi cele 2 semnale. |
- | * Ascultati semnalul original si cel rezultat pentru a auzi diferenta. Pentru a asculta semnalele folositi functia 'sound' | + | * Ascultaţi semnalul original şi pe cel rezultat pentru a auzi diferenţa. Pentru a asculta semnalele folosiţi funcţia 'sound'. |
- | <hidden> | + | === Exerciţiul 5 [3p] === |
- | <note tip> | + | |
- | Acesta este un exemplu de rezolvare: | + | |
- | <code matlab ecou.m> | + | |
- | load('voice.mat'); | + | |
- | sound(y); | + | |
- | pause(3); | + | |
- | plot(y); | + | |
- | l = length(y); | + | |
- | d = 500; | + | |
- | y2 = zeros(length(y), 1); | + | |
- | y2(d+1:end,1) = y(1:l-d); | + | |
- | y3 = y + y2; | + | |
- | sound(y3, 8000); | + | |
- | figure; | + | |
- | plot(1:l, [y';y2';y3']); | + | |
- | </code> | + | |
- | </note> | + | |
- | </hidden> | + | |
- | === Exercitiul 5 [3p] === | + | |
- | Avem un sistem de feedback precum cel din imaginea urmatoare: | + | Avem un sistem de feedback precum cel din imaginea următoare: |
{{:ps:laboratoare:feedback.png?400|}} | {{:ps:laboratoare:feedback.png?400|}} | ||
- | Sa presupunem ca folosim acest sistem pentru sistemul de pilot automat al masinii, unde x(t) este o constanta ce reprezinta viteza dorita iar y(t) este viteza masinii masurata de vitezometru. In aceasta aplicatie sistemul 2 este sistemul identitate (intrare = iesire). | + | Să presupunem că folosim acest sistem pentru sistemul de pilot automat al maşinii, unde x(t) este o constantă ce reprezintă viteza dorită, iar y(t) este viteza maşinii măsurată de vitezometru. În această aplicaţie, sistemul 2 este sistemul identitate (intrare = ieşire). |
- | Sa construim acest sistem avand in vedere urmatoarele constrangeri: | + | Să construim acest sistem având în vedere următoarele constrângeri: |
- | * viteza initiala a masinii este 7 | + | * viteza initială a maşinii este 7 |
- | * valoarea initiala a secventei de feedback (output-ul lui S2), f, este 0 | + | * valoarea iniţială a secvenţei de feedback (output-ul lui S2), f, este 0 |
- | * valoarea initiala pentru secventa de diferenta, e, este 0 | + | * valoarea iniţială pentru secvenţa de diferenţă, e, este 0 |
- | * valoarea de input a sistemului de pilot automat, x, este o secventa de tipul [60, 60, ..., 60] | + | * valoarea de input a sistemului de pilot automat, x, este o secvenţă de tipul [60, 60, ..., 60] |
- | * primul sistem, S1, primeste 2 input-uri: viteza curenta si diferenta e(i). Bazandu-se pe acestea actualizeaza viteza curenta dupa cum urmeaza: | + | * primul sistem, S1, primeste 2 input-uri: viteza curentă şi diferenţa e(i). Bazându-se pe acestea, actualizează viteza curentă după cum urmează: |
- | * Daca e(i) > 10, atunci y(i+1) = y(i) + 10 | + | * Dacă e(i) > 10, atunci y(i+1) = y(i) + 10 |
- | * altfel daca e(i) > 0, atunci y(i+1) = y(i) + 1 | + | * altfel dacă e(i) > 0, atunci y(i+1) = y(i) + 1 |
- | * altfel daca e(i) == 0, atunci y(i+1) = y(i) | + | * altfel dacă e(i) == 0, atunci y(i+1) = y(i) |
- | Construiti sistemul S1 ca o functie matlab cu 2 parametrii (viteaza_curenta, e), care afiseaza urmatoarea viteza curenta ca mai sus. | + | Construiţi sistemul S1 ca o funcţie Matlab cu 2 parametrii (viteza_curentă, e), care afişează următoarea viteză curentă ca mai sus. |
- | In Matlab puteti folosi o instructiune for pentru asta: | + | În Matlab puteţi folosi o instrucţiune for pentru asta: |
<code matlab> | <code matlab> | ||
Line 250: | Line 149: | ||
end | end | ||
</code> | </code> | ||
- | Rulati sistemul de N = 20 ori si afisati output-ul sistemului. | + | Rulaţi sistemul de N = 20 ori şi afişaţi outputul sistemului. |
- | <hidden> | + | |
- | <note tip> | + | |
- | Un exemplu de solutie: | + | |
- | <code matlab sys1.m> | + | |
- | function y=sys1(speed, e) | + | |
- | %SYS1 Simulates a signal system | + | |
- | % [y] = SYS1(speed, e) | + | |
- | % returns the current state (speed) after applying the input e | + | |
- | if abs(e) > 10 | + | /* </hidden> */ |
- | k = 5; | + | |
- | else | + | |
- | k = 1; | + | |
- | end | + | |
- | if e > 0 | + | |
- | y = speed + k; | + | |
- | elseif e < 0 | + | |
- | y = speed - k; | + | |
- | else | + | |
- | y = speed; | + | |
- | end | + | |
- | </code> | + | |
- | + | ||
- | <code matlab cruise_control.m> | + | |
- | % Simulate a cruise control system | + | |
- | N = 20; | + | |
- | y = zeros(1, N); | + | |
- | f = zeros(1, N); | + | |
- | e = zeros(1, N); | + | |
- | x = 60*ones(1,N); | + | |
- | + | ||
- | y(1) = 7; % Initial speed | + | |
- | for i=1:N-1 | + | |
- | e(i) = x(i)-f(i); | + | |
- | y(i+1) = sys1(y(i), e(i)); | + | |
- | f(i+1) = y(i+1); | + | |
- | end | + | |
- | + | ||
- | figure; | + | |
- | plot(1:N, e, 'r'); | + | |
- | hold on; | + | |
- | plot(1:N, y, 'g'); | + | |
- | legend('e', 'y'); | + | |
- | </code> | + | |
- | </note> | + | |
- | </hidden> | + |