This shows you the differences between two versions of the page.
|
ps:laboratoare:02 [2017/09/11 11:28] 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 172: | Line 109: | ||
| * 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> | + | === 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> | + | |