La curs am discutat despre semnale de bază și sisteme. În continuare vom face câteva exerciții legate de aceste noțiuni.
[1p]
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)$
Ar trebui să obțineți ceva similar:
Afișați grafic semnalul ca în laboratorul 1 folosind biblioteca matplotlib.
După ce ați făcut plot-ul puteți pune un titlu figurii folosind și etichete axelor X și Y.
[1p]
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:
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:
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$).
Pentru asta ar trebui să:
s_delayed = np.pad(s[:N - T], (T, 0))
Documentație np.pad. Mai puteți concatena zerouri folosind np.concatenate, np.hstack, etc.
Pentru a afişa mai multe semnale în aceeaşi figură cu ajutorul comenzii $plot$ puteţi folosi după toate plot-urile:
plt.show()
Ar trebui să obțineţi ceva similar imaginii de mai jos:
[1p]
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:
t = np.array([0, np.pi / 6, np.pi / 4, np.pi / 3, np.pi / 2])
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')
import numpy as np import matplotlib.pyplot as plt tt = np.arange(0, 2 * np.pi, 0.1) figure1 = plt.figure('Figura 1', figsize=(10, 10)) complex_tt = np.exp(1j * tt) x = np.real(complex_tt) y = np.imag(complex_tt) plt.plot(x, y, 'k.') plt.plot(0, 0, 'kx')
[1p]
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.
Materiale ajutătoare:
[2p]
În acest exercițiu vom începe să lucrăm cu seria Fourier, unul dintre cele mai importante instrumente în procesarea digitală a semnalelor. Va trebui să vă familiarizați cu acesta.
Orice semnal periodic de perioada $T$ se poate descompune într-o sumă de semnale de bază. Această descompunere poartă numele de seria Fourier și ne arată cum se descompune orice semnal periodic într-o sumă de sinusoide:
\begin{equation} s(t) = \sum_{k=-\infty}^{\infty}{c_{k}e^{j\frac{2 \pi kt}{T}}} \end{equation}
Având un semnal dat $s(t)$ putem calcula coeficienții Fourier după formula: \begin{equation} c_k = \frac{1}{T} \int_{t=0 }^{T}{s(t)e^{-j\frac{2 \pi kt}{T}}}dt \end{equation}
Folosind formula precedentă, un semnal dreptunghiular, de amplitudine “A” pe intervalul $[0, \frac{T}{2}]$ și de amplitudine ”-A” pe intervalul $[\frac{T}{2}, T]$ are coeficienții Fourier daţi de formula următoare:
\begin{equation} c_{k} = \left\lbrace \begin{array}{} \frac{2}{j \pi k}A \qquad k \quad impar \\0 \qquad \quad k \quad par \end{array} \right. \end{equation}
În acest exerciţiu va trebui să încercaţi să reconstruiţi semnalul dreptunghiular folosind un număr limitat de coeficienți pentru a vedea diferenţa dintre semnalul original și cel reconstruit.
Principalii paşi pentru asta sunt:
Graficele voastre trebuie să arate similar cu acestea:
[2p]
Orice semnal este format dintr-o sumă de o infinitate de sinusoide complexe. Ce se întâmplă dacă facem suma doar peste un număr finit de astfel de termeni, ignorând termenii de ordin superior? În acest caz vom forma un semnal care aproximează semnalul original, iar aproximarea este cu atât mai bună cu cât folosim mai mulți termeni.
În acest exercițiu vom vedea cât de bine este aproximat un semnal, prin observarea erorii $\epsilon_{N}$ dintre semnalul original $s(t)$ și aproximarea $s_{N}(t)$ folosind doar termeni de ordin $\le N$ din seria Fourier (termenii corespunzători $k \in \{-N, \ldots, N\} $ )
Vom calcula rădăcina pătratică medie (eng. root mean square - RMS) a semnalului de eroare $\epsilon_{N}$ dat de:
\begin{equation} \epsilon_{N}(t) = s(t) - s_{N}(t), \end{equation}
Aproximarea $s_{N}(t)$ este dată de primii termeni din Seria Fourier. \begin{equation} s_N(t) = \sum_{k=-N}^N c_k e^\frac{j 2 \pi k t}{T} \end{equation}
iar RMS-ul lui $\epsilon_N$ este dat de: \begin{equation} \text{rms}(\epsilon_N) = \sqrt{\sum_{k=-\infty}^{-{N-1}} |c_k|^2 + \sum_{k=N+1}^\infty |c_k|^2} = \sqrt{2\cdot \sum_{k=N+1}^\infty |c_k|^2} \end{equation}
Task-ul vostru este să determinați valoarea lui N astfel încât $\text{rms}(\epsilon_N)$ este aproape 0 și după aceea să vedeți că într-adevăr semnalul reconstruit aproximează bine semnalul original.
O să folosim din nou semnalul dreptunghiular, de amplitudine 'A' în intervalul [0, T/2] și '-A' în intervalul [T/2, T] care are coeficienții Fourier dați de formula:
\begin{equation} c_{k} = \left\lbrace \begin{array}{} \frac{2}{j \pi k}A \qquad k \quad impar \\0 \qquad \quad k \quad par \end{array} \right. \end{equation}
Pentru asta ar trebui să urmăriți următorii pași:
\begin{equation} \frac{1}{T}\int_0^T{s^2(t)dt} = \sum_{-\infty}^{\infty}{|c_k|^2} \end{equation}
Folosind cele descrise mai sus puteți calcula exact RMS-ul erorii:
\begin{equation} \text{rms}(\epsilon_{N-1}) = \sqrt{2\cdot \sum_{k=N}^\infty |c_k|^2} = \sqrt{\sum_{k=-\infty}^\infty |c_k|^2 - \sum_{k=-N+1}^{N-1} |c_k|^2} = \sqrt{\sum_{k=-\infty}^\infty |c_k|^2 - (2 \cdot \sum_{k=1}^N |c_k|^2 + |c_0|^2)} \end{equation}
Pentru a transmite 2 biți simultan putem folosi două frecvențe diferite (f1, f2) pentru a coda o valoare de 2 biți:
Task-ul vostru e să creați o secvență random de 10 valori între 0 și 3 (pentru a folosi toate valorile de mai sus) și apoi să o codificați folosind 2 sinusoide așa cum este descris mai sus. Pentru asta ar trebui să:
În următoarele exerciţii vom încerca să experimentăm câteva dintre proprietăţile Transformatei Fourier, care ne permite să shiftăm/întârziem într-un domeniu şi să observăm un anumit efect în alt domeniu. De exemplu, la curs, am arătat că o întârziere în domeniul “Timp” înseamnă o shiftare de frecvenţă în domeniul “Frecvenţă”.
Materiale ajutătoare:
[2p]
În acest exerciţiu vrem să întârziem un semnal în timp, prin modificarea spectrului său (vezi proprietăţile Transformatei Fourier). Vom folosi un semnal pe care l-am mai folosit şi anume, semnalul dreptunghiular cu amplitudinea $A$ pe intervalul $[0, \frac{T}{2}]$ şi cu amplitudinea $-A$ pe intervalul $[\frac{T}{2}, T]$ care are binecunoscutul spectru dat de:
\begin{equation} c_{k} = \left\lbrace \begin{array}{} \frac{2 \cdot A}{j \pi k} \qquad k \quad impar \\0 \qquad \quad k \quad par \end{array} \right. \end{equation}
Pentru acest task va trebui să urmaţi următorii paşi:
coefficients_phase = np.angle(ck, deg=True)
Vom vedea în continuare ce efect are un filtru trece-jos asupra semnalului puls periodic. În special ne interesează care sunt termenii din seria Fourier ai semnalului rezultat în urma filtrării.
Dacă știm funcția de transfer $H(f)$ a unui filtru trece-jos (sau alt tip de sistem liniar și invariant în timp), care primește la intrare un semnal (pentru care putem să aflăm coeficienții Fourier $c_k$), putem să găsim coeficienții Fourier ($c_k^y$) ai semnalului rezultat ca fiind:
\begin{equation} c_k^y = H(\frac{k}{T}) \cdot c_k \end{equation}
Astfel putem reconstrui semnalul de ieșire folosind coeficienții Fourier $c_k^y$.
În acest exercițiu trebuie să calculăm coeficienții Fourier ai semnalului de ieșire al unui filtru trece-jos, dat fiind un semnal de intrare de tip puls cu amplitudine $A=1$ și pulsul de durată $\Delta=\frac{T}{5}$. Știm că coeficienții Fourier ai semnalului sunt dați de:
\begin{equation} c_k = A \cdot e^{-j\frac{\pi k \Delta}{T}} \cdot \frac{\text{sin}(\frac{\pi k \Delta}{T})}{\pi k} = A \cdot e^{-j\frac{\pi k \Delta}{T}} \cdot \frac{\Delta}{T} \cdot \text{sinc}(\frac{\pi k \Delta}{T}). \end{equation}
Funcția de transfer a circuitului (pe care am determinat-o la curs) este următoarea:
\begin{equation} H(f=\frac{k}{T}) = \frac{1}{1+j 2 \pi R C \frac{k}{T}} \end{equation}
unde R și C sunt rezistența și respectiv capacitatea.
Task-ul vostru este să determinați coeficienții ieșirii ($c_k^y$) și să reconstruiți semnalul de ieșire pentru diferite frecvențe de tăiere.
Pentru aceasta urmăriți următorii pași:
Puteți încerca următoarele valori pentru $f_c$: