Table of Contents

Laboratorul 02.

Semnale și sisteme de bază

La curs am discutat despre semnale de bază și sisteme. În continuare vom face câteva exerciții legate de aceste noțiuni.

Exercițiul 1

[2p]

Pentru a transmite simboluri (ex: litere din alfabet) modemurile folosesc diferite frecvențe și mai multe niveluri de amplitudine. O transmisie se face într-o perioadă de timp T (interval de transmisie) și poate conține o suprapunere de mai multe semnale, e.g. suma a două semnale de amplitudini și frecvențe diferite:

$x(t) = A_{1} \cdot sin(2\cdot \pi\cdot f_{1}\cdot t) + A_{2} \cdot sin(2\cdot \pi\cdot f_{2}\cdot t)$

  1. Care este cel mai mic interval de transmisie care are sens să fie folosit, dacă $f_1 = 1600$ Hz și $f_2 = 1800$ Hz? Cu alte cuvinte, cât ar trebui să fie $T$ astfel încât semnalul să aibă un număr întreg de cicluri? [1p]
  2. Afişaţi semnalul produs de modem pe parcursul a trei intervale de transmisie. Pentru primul interval de transmisie puteți folosi $A_1 = 0$ și $A_2 = 1$, pentru al doilea interval $A_1 = 1$ și $A_2 = 1$, iar pentru al treilea interval $A_1 = 1$ și $A_2 = 0$. Aşa cum am învăţat în laboratorul trecut adăugaţi titlu şi etichete plot-ului. [1p]

Ar trebui să obțineți ceva similar:

Pentru $\pi$ puteți folosi comanda np.pi din biblioteca numpy. Pentru concatenare puteți folosi np.concatenate sau np.hstack

Puteți afișa un semnal folosind comanda plt.plot din interfața matplotlib.pyplot.

După ce ați făcut plot-ul puteți pune un titlu figurii folosind plt.title, iar pentru etichete plt.xlabel și plt.ylabel.

Exerciţiul 2

[2.5p]

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 Python 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 în 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:

ramp.py
import numpy as np
 
 
def ramp(N):
    y = np.zeros(N, dtype=int)
    for t in range(0, N):
        y[t] = t
    return y

Pentru a apela funcția 'ramp' din ramp.py într-un alt fișier .py (care se află în același director) puteți folosi următorul cod:

ex2.py
from ramp import ramp

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 \cdot 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$).

  • $r(i-T)$ este doar o notaţie care marchează faptul că folosim un semnal 'ramp' întârziat cu $T$. Nu trebuie să apelaţi funcţia ramp cu argumentul $(i-T)$ pentru că nu va funcţiona. Va trebui să întârziaţi semnalul 'de mână' ca mai jos.
  • Folosim factorul $T$ în faţa lui $u(i-T)$ pentru că este amplitudinea la care $r(i)$ a ajuns până în acel moment şi vrem să avem semnalul final la 0.

Pentru asta ar trebui să:

  1. creaţi un semnal 'unit step' numit ustep.py, care practic întoarce o secvenţă de N valori de 1 [0.5p]
  2. să setaţi numărul de puncte la $N = 200$ şi delay-ul la $T = 100$
  3. 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:
       x = np.arange(0, N) 
    • Puteţi crea primul semnal ca:
       s1 = ramp(N) 
    • Puteţi întârzia un semnal cu $T$ în felul următor (o posibilă soluție):
       s_delayed = np.pad(s[:N - T], (T, 0)) 

      Documentație np.pad. Mai puteți concatena zerouri folosind np.concatenate, np.hstack, etc.

  4. combinaţi cele 3 semnale
  5. afişaţi toate cele 4 semnale (cele 3 individuale şi combinaţia lor) [1p]
    • folosiţi culori diferite (eventual grosimi de linie diferite) pentru fiecare semnal şi afişaţi legenda pentru a diferenţia semnalele.

Documentație Documentație matplotlib.pyplot. De exemplu pentru a plota $s1$ cu o linie verde de grosime 2 puteţi folosi codul următor:

 plt.plot(x, s1, 'g-', linewidth=2)

Pentru a afişa mai multe semnale în aceeaşi figură cu ajutorul comenzii $plot$ puteţi folosi după toate plot-urile:

 plt.show() 
figure1 = plt.figure('Figura 1')
plt.plot(x, s1, 'g-', linewidth=2)
plt.plot(...)
plt.show()

Ar trebui să obțineţi ceva similar imaginii de mai jos:

Exerciţiul 3

[2p]

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 Python, făcând următoarele:

    complex_exp1 = np.exp(1j * t)
    x_complex_exp1 = np.real(complex_exp1)
    y_complex_exp1 = np.imag(complex_exp1)
    plt.plot(x_complex_exp1, y_complex_exp1, 'ro')
 

Pentru numărul imaginar j, în Python se folosește notația 1j.

Exerciţiul 4

[3.5p]

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 cu 2 parametrii (viteza_curentă, e), care afişează următoarea viteză curentă ca mai sus. În Python puteţi folosi o instrucţiune for pentru asta:

N = 20;
y = np.zeros(N, dtype=int)
y[0] = 7;
for i in range(0, N - 1):
  ...
  y[i+1] = S1(y[i], e[i])
end

Rulaţi sistemul de N = 20 ori şi afişaţi outputul sistemului.