This shows you the differences between two versions of the page.
ps:laboratoare:02 [2017/09/11 11:32] 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 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> | ||
- | 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); | ||
- | </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> | ||
=== Exerciţiul 3 [1p] === | === Exerciţiul 3 [1p] === | ||
- | La curs am văzut că datorită identităţilor lui Euler putem scrie o exponenţială complexă ca o sumă de sin şi cos: | + | La curs am văzut că datorită egalității lui Euler putem scrie o exponenţială complexă ca o sumă de sin şi cos: |
/* e^(j*t) = cos(t) + j*sin(t) */ | /* e^(j*t) = cos(t) + j*sin(t) */ | ||
Line 171: | Line 108: | ||
* Afisaţi secvenţa rezultată în imaginar folosid real(ss) ca valori x şi imag(ss) ca valori y | * Afisaţi secvenţa rezultată în imaginar folosid real(ss) ca valori x şi imag(ss) ca valori y | ||
* Verificaţi dacă s1, s2 şi ss arată cum v-aţi fi aşteptat! | * Verificaţi dacă s1, s2 şi ss arată cum v-aţi fi aşteptat! | ||
- | |||
- | <hidden> | ||
- | <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> | ||
=== Exerciţiul 4 [1.5p] === | === Exerciţiul 4 [1.5p] === | ||
- | La curs am văzut un exemplu simplu de un 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 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. |
Task-ul vostru pentru a replica experimentul: | Task-ul vostru pentru a replica experimentul: | ||
* Având semnalul de intrare cu o voce in fişierul {{:ps:laboratoare:voice.mat|this}}. | * Având semnalul de intrare cu o voce in fişierul {{:ps:laboratoare:voice.mat|this}}. | ||
- | * Faceţi o copie a semnalului şi întârziaţi-o. (de ex cu d=500 de eşantioane). | + | * 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). |
* Adunaţi cele 2 semnale. | * Adunaţi cele 2 semnale. | ||
* Ascultaţi semnalul original şi pe cel rezultat pentru a auzi diferenţa. Pentru a asculta semnalele folosiţi funcţia '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 251: | 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> | + |