This is an old revision of the document!
La curs am discutat despre semnale de bază şi sisteme. În continuare vom face câteva exerciţii legate de aceste noţiuni.
Pentru a transmite simboluri (ex: litere din alfabet) modemurile PC-urilor folosesc două frecvenţe (1600 Hz şi 1800 Hz) şi mai multe niveluri de amplitudine. O transmisiune se face într-o perioadă de timp T (interval de transmisie) şi este egală cu suma a două semnale de amplitudine diferită:
x(t) = A1 * sin (2*pi*f1*t) + A2 * sin (2*pi*f2*t)
Un posibil cod de afişare a semnalului:
%% 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');
La curs am văzut că putem descompune semnalele într-o sumă de mai multe semnale de bază (ramp, step etc.). Pentru acest exerciţiu veţi încerca să folosiţi semnalele 'step' şi 'ramp' pentru a crea semnalul reprezentat cu negru în acest slide: building_signals.pdf
Pentru a face asta în Matlab va trebui să lucrăm cu semnale discrete, nu continue (vom discuta despre acest aspect în cursurile viitoare). În loc să lucrăm cu semnale reprezentate in intervalul [0,1] ca în slide vom folosi semnale ce se întind peste 100 de puncte.
Puteţi folosi următoarea funcţie pentru a crea un semnal 'ramp' peste N puncte:
function y=ramp(N) %RAMP Returns a ramp signal of a given number of samples % [y] = RAMP(N) % returns the ramp signal for the given samples y = zeros(1, N); for t=1:N y(t) = t-1; end
Task-ul vostru este să creaţi un semnal combinat, ca cel din slide, dar folosind secvenţe discrete, cu o formulă ca cea de mai jos:
s(i) = r(i) - r(i-T) - T*u(i-T)
unde i este un index de la 0 la N (în loc de un număr real de la 0 la 1), T este întârzierea, s este semnalul rezultat, r este semnalul 'ramp' (eventual întârziat cu T) şi u este semnalul 'unit step' (întârziat aici cu T).
Pentru asta ar trebui să:
x=1:N;
s1 = ramp(N)
[zeros(1,T), s(1:N-T)];
plot(x, s1, 'g-', 'LineWidth', 2);
Pentru a afişa mai multe semnale în aceeaşi figură cu ajutorul comenzii plot puteţi folosi
hold on;
după primul plot:
figure; plot(x, s1, 'g-', 'LineWidth', 2); hold on; plot(...)
Ar trebui să obtineţi ceva similar imaginii de mai jos:
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);
Pentru a combina ploturile puteţi folosi următorul cod:
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');
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\cdot t} = \cos(t) + j\cdot \sin(t)$
De asemenea:
$e^{-j \cdot t} = \cos(t) - j \cdot \sin(t)$
Adunând aceste 2 ecuaţii şi împărţind la 2 obţinem:
$\cos(t) = \frac{e^{j \cdot t} + e^{-j \cdot t}}{2}$
Încercaţi să arătaţi asta în Matlab, făcând următoarele:
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');
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:
Atentie: modificare de ultim moment: 0.1 secunde, adica 800 in loc de 500 esantioane
Avem un sistem de feedback precum cel din imaginea următoare:
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).
Să construim acest sistem având în vedere următoarele constrângeri:
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. În Matlab puteţi folosi o instrucţiune for pentru asta:
N = 20; y = zeros(1,N); y(1) = 7; for i=1:N-1 ... y(i+1) = S1(y(i), e(i)); end
Rulaţi sistemul de N = 20 ori şi afişaţi outputul sistemului.
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 k = 5; else k = 1; end if e > 0 y = speed + k; elseif e < 0 y = speed - k; else y = speed; end
% 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');