This shows you the differences between two versions of the page.
ps:labs:05 [2020/11/02 08:33] ionut.gorgos |
ps:labs:05 [2022/11/08 14:57] (current) ionut.gorgos |
||
---|---|---|---|
Line 1: | Line 1: | ||
===== Laboratorul 05. ===== | ===== Laboratorul 05. ===== | ||
+ | /*<hidden>*/ | ||
+ | ==== Semnale digitale - procesarea simplă, eşantionarea și recuperarea semnalului ==== | ||
+ | Prezentarea PowerPoint pentru acest laborator poate fi găsită aici: [[https://docs.google.com/presentation/d/1BtLZa_4XCMcErExG5YSXHoNtr3Wtg8qy/edit?usp=share_link&ouid=110538702824281541719&rtpof=true&sd=true|aici]] | ||
- | /*<hidden>*/ | + | În acest laborator vom începe să experimentăm efectele semnalelor eşantionate şi procesarea semnalelor digitale. |
- | ==== Shiftarea în fază/timp şi modularea în amplitudine ==== | + | |
- | + | ||
- | În acest laborator 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: | Materiale ajutătoare: | ||
- | - [[http://www.ece.rice.edu/~dhj/courses/elec241/col10040.pdf|D. Johnson's book]] | + | - {{:ps:labs:fundamentals-of-electrical-engineering-i-9.72.pdf|Cartea lui Don Johnson}} |
- | - Secțiunea 4.8 (vezi tabelul 4.2 în particular) | + | - Secţiunile 5.1-5.3 |
- | === Exercițiul 1 – shiftarea în frecvență [4p] === | ||
- | Î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: | + | === Exerciţiul 1 -- Procesarea simplă === |
+ | [<color red>4p</color>] | ||
- | \begin{equation} | + | Vom încerca să implementăm un sistem de procesare digitală simplă, care funcţionează după cum urmează: |
- | c_{k} = \left\lbrace | + | * luaţi 5 eşantioane (samples) din semnalul de intrare, $d_1, d_2, \ldots, d_5$. |
- | \begin{array}{} | + | * faceţi o medie a celor 5 eşantioane (samples), $a = 0.2 \cdot (d_1 + d_2 + d_3 + d_4 + d_5)$ |
- | \frac{2}{j \pi k}A \qquad k \quad impar \\0 \qquad \quad k \quad par | + | * puneţi la ieşire valoarea curentă $y(n) = a$ |
- | \end{array} | + | |
- | \right. | + | |
- | \end{equation} | + | |
- | Pentru acest task va trebui să urmaţi următorii paşi: | + | Urmăriţi aceşti paşi: |
- | * Reprezentaţi grafic semnalul original (considerați A = 1 și T = 100). | + | - Creaţi câteva secvenţe digitale care reprezintă sinusoide de diferite frecvenţe (1, 2, 10, 20, 100 Hz), la aceeaşi frecvenţă de eşantionare (folosiţi acelaşi număr de eşantioane, e.g. $N=128$). [<color red>1p</color>] |
- | * Calculaţi câţiva coeficienţi Fourier $c_k$. Faceţi asta, similar cu ce am făcut în laboratoarele precedente, folosind $k\in\{-81,\ldots,81\}$. | + | - Implementaţi sistemul de procesare menţionat mai sus. [<color red>1p</color>] |
- | * Plotaţi modulul coeficienţilor (folosind stem). | + | - Creaţi secvenţele corespunzătoare de ieşire. [<color red>1p</color>] |
- | * Modificaţi spectrul pentru a obţine un semnal în timp întârziat cu $\tau = \frac{T}{4}$ (vezi tabelul 4.2 din carte). | + | - Plotaţi toate secvenţele de intrare/ieşire. [<color red>1p</color>] |
- | * Plotaţi coeficienţii după modificare. Vedeţi vreo diferenţă? De ce? | + | - Ce fel de sistem de procesare este acesta ? |
- | * Ce se întâmplă cu faza? Verificați cu următorul cod: | + | - Cum ați putea implementa sistemul de procesare menționat mai sus, folosind funcția 'filter'? (opțional) |
- | <code matlab> | + | <note tip> |
- | rad2deg(angle(coeficienti))' | + | Pentru fiecare eşantion de intrare ($x(n)$) trebuie să produceţi o valoare de ieşire ($y(n)$). Pentru primele patru eşantioane nu aveţi suficiente valori de intrare diferite de zero, şi pentru simplitate ori setaţi ieşirea pe zero, ori faceţi media dintre 1, 2, 3, 4 eşantioane, în timp ce consideraţi ca celelalte să fie zero. Dar de la al 5-lea eşantion veţi avea câte 5 eşantioane la îndemână (actualul $x(n)$ şi anterioarele patru eşantioane). |
- | </code> | + | </note> |
- | * Reconstruiți semnalul din spectrul modificat, similar cu ce-am făcut în laboratorul 3. Ar trebui să vedeți semnalul shiftat cu $\tau$, față de cel original (dacă totul a mers cum trebuie). | + | |
- | === Exercițiul 2 – modularea în amplitudine [4p] === | + | <note> Pentru crearea timpilor de eșantionare puteți folosi 0:perioada_esantionare:timp_maxim sau funcția linspace(0,timp_maxim,numar_esantioane)</note> |
- | În acest exercițiu va trebui să încercați să efectuați modularea în amplitudine asupra următorului semnal exponențial (eng. exponential decay signal) : $s(t) = e^{-at}u(t)$, unde $a>0$ și $u(t)$ este treapta unitară (i.e. egală cu 1 pentru $t\ge0$, 0 altfel). | + | === Exercițiul 2 -- Subeşantionare (Bandpass sampling) === |
+ | [<color red>3p</color>] | ||
- | Obiectivul vostru | + | În acest exercițiu vom experimenta subeșantionarea, metodă care reduce frecvența de eșantionare necesară pentru a obține întreg spectru al semnalului. |
- | Folosiți o frecvență purtătoare $f_c = \frac{20}{T}$, unde $T$ este numărul eșantioanelor (samples). | + | Un semnal real (un cosinus sau o sinusoidă) cu o frecvență purtătoare (centrată) la 3kHz este eşantionată la 8 kHz. Lăţimea de bandă a semnalului este 1 kHz, cum puteţi vedea mai jos: |
- | Pentru asta va trebui să urmăriți acești pași: | + | {{:ps:labs:bandpass.png?500|}} |
- | * Creați semnalul $s(t)$ pentru $t\in\{1,\ldots,T=128\}$, folosind $a=0.05$. | + | |
- | * Calculați și plotați (cu 'stem') spectrul folosind DFT (Transformata Fourier Discretă), pe care nu am făcut-o încă la curs, dar o vom face în următoarele cursuri. Vom considera că DFT are același număr de componente ca și semnalul de intrare. Formulele pentru DFT și pentru inversa ei (IDFT) sunt următoarele: | + | |
- | \begin{equation} | + | |
- | DFT: S(k) = \sum^{N-1}_{n = 0}{s(n)e^{\frac{-j 2 \pi n k}{K}}}, k \in \{0, ..., K-1\} \\ | + | |
- | IDFT\ (inversa\ DFT): s(n) = \frac{1}{K}\sum^{K-1}_{k = 0}{S(k)e^{\frac{j 2 \pi n k}{K}}}, n \in \{0, ..., N-1\} | + | Task-uri/întrebări: |
- | \end{equation} | + | - Generați semnalul $signal = cos(2 \cdot \pi \cdot f_c \cdot t)$, unde $f_c = 3000$ Hz, $t=0:T_s:100 \cdot T_s$ și $T_s = \frac{1}{f_s} = \frac{1}{8000}$ |
- | * De asemenea, calculați cu ajutorul FFT (FFT este varianta rapidă a DFT) și plotați spectrul folosind acest cod: | + | - De ce avem energie în ambele frecvenţe $f_c$ şi $-f_c$ ? |
- | <code matlab> | + | - Folosiţi Matlab pentru a calcula transformata Fourier Discretă a unei sinusoide de $3kHz$ eşantionată la $8kHz$. Folosiți $N=64$ pentru fft. Folosiți acest cod pentru DFT: [<color red>1p</color>] <code matlab> |
- | h = figure; | + | figure; |
- | fx = zeros(1, T); | + | fx = zeros(1, N); |
- | findex = T/2*linspace(0,1,T/2); | + | fidx = (fs/N) * linspace(0,N-1,N); |
- | fx((T/2)+1:end) = findex; | + | spectrum = fft(signal, N); |
- | fx(1:T/2) = [-T/2, -findex(end:-1:2)]; | + | stem(fidx, abs(spectrum)); |
- | fs = fft(s); | + | xlabel('Frequency (Hz)'); |
- | stem(fx, abs(fftshift(fs))); | + | ylabel('Amplitude'); |
- | xlabel('Frequency component (k)'); | + | title('Spectrum of signal'); |
- | ylabel('Magnitude of component'); | + | |
- | title('Fourier coefficients before amplitude modulation'); | + | |
- | print(h, '-dpng', 'coefficients_before_amod.png'); % doar daca vreti sa salvati ca png graficull | + | |
</code> | </code> | ||
- | * Comparați graficele obținute cu DFT și cele cu FFT. | + | - Plotaţi (cu 'stem') rezultatele şi observaţi frecvenţele. Acum folosiţi "fftshift" pe rezultatul obţinut de la "fft" şi plotaţi din nou rezultatele. Folosiți acest cod: [<color red>1p</color>] <code matlab> |
- | * Modulați semnalul în amplitudine folosind frecvența purtătoare $f_c = \frac{20}{T}$, i.e. face 20 de perioade complete în $T=128$ eșantioane ale semnalului $s(t)$. O variantă simplă de modulare este să calculați: $x(t) = (1+s(t)) \cdot \cos(2\pi f_c t)$. | + | figure; |
- | * Calculați și plotați (cum am făcut mai devreme, cu funcția fft) spectrul semnalului modulat în amplitudine. Comparați-l cu spectrul semnalului original. Este ceea ce v-ați așteptat? | + | fidx = (fs/N)*linspace(-N/2, N/2-1, N); |
+ | stem(fidx, abs(fftshift(spectrum))); | ||
+ | xlabel('Frequency (Hz)'); | ||
+ | ylabel('Amplitude'); | ||
+ | title('Zero-centred frequency spectrum of signal'); | ||
+ | </code> | ||
+ | - De ce într-un caz avem semnal la $3 kHz$ şi $5 kHz$ în timp ce, în celălalt caz pare să avem la $-3 kHz$ şi $3 kHz$ ? | ||
+ | - Care este semnificaţia semnalului de $5 kHz$ ? Când plotaţi rezultatele de la "fft" luaţi în considerare că, în mod implicit output-ul transformatei Discrete Fourier, deci şi "fft", arată frecvenţele de la $0$ la $f_s$ (frecvenţa de eşantionare). | ||
+ | - Putem să reducem frecvenţa de eşantionare în timp ce încă detectăm spectrul dorit de frecvenţe ? (vedeţi bandpass sampling [[https://www.informit.com/articles/article.aspx?p=345472&seqNum=3|Fig 2-7]]). Cât de mult putem reduce frecvenţa de eşantionare? Ce se întâmplă dacă reducem frecvenţa de eşantionare sub 2B? [<color red>1p</color>] | ||
- | === Exercițiul 3 – modularea în amplitudine [2p] === | + | === Exercițiul 3 -- Reconstruire de semnal === |
+ | [<color red>3p</color>] | ||
- | În acest exercițiu veți încerca să refaceți un semnal modulat în amplitudine ({{ps:labs:lab05_modulated_sound.mat|click aici}}). | + | Pentru reconstruirea unui semnal ideea este: |
- | Urmați următorii pași: | + | - dacă se face sampling pe un semnal cu $f_s > 2 \cdot W$ (unde $W$ este frecvenţa maximă a semnalului, i.e. respectiv Nyquist), atunci puteţi să reconstruiţi din semnalul digital semnalul analog (exceptând o eroare de cuantizare) pe baza unui low pass filter (cu un sinc). |
- | * Descărcați semnalul modulat și încărcați-l în Matlab folosind funcția load('lab05_modulated_sound.mat'). Se va încărca semnalul precum și Fs, frecvența de eșantionare. | + | |
- | * Semnalul modulat provine dintr-un semnal original $s(t)$ care a fost înmulțit cu un semnal cosinus de frecvență $fc$, cos($2 \pi \cdot fc \cdot t$), unde t=0:1/Fs:timp_maxim. Precum ați observat și în exercițiul anterior spectrul semnalului modulat conține spectrul semnalului original shiftat la frecvența fc și -fc. Plotați spectrul pentru a vedea acest lucru. | + | |
- | * Dacă înmulțim (din nou) semnalul primit cu același semnal cosinus ar trebui să putem recupera semnalul original după aplicarea unui filtru lowpass. Folosiți fc = Fs / 8. | + | |
- | * Pentru a realiza efectul unui filtru lowpass vom egala cu zero coeficienții corespunzători frecvențelor peste un prag. | + | |
- | * Având noii coeficienți putem reface semnalul în timp folosind inversa Fourier. Realizați acest lucru folosind funcția ifft. | + | |
- | * Puteți asculta semnalul rezultat folosind funcția Matlab sound(semnal). | + | |
- | + | ||
- | <note> Atenție: Vom învăța la curs că spectrul obținut prin transformata Fourier discretă este periodic. Funcțiile fft / ifft consideră primii jumătate plus unu coeficienți pentru frecvențele pozitive, apoi următoarea jumătate corespunzătoare coeficienților negativi. Pentru a obține un spectru centrat în zero (doar ca să îl vizualizăm precum ne-am obișnuit) vom folosi funcția fftshift. </note> | + | |
+ | Vom simula un semnal sinus analog, pe care îl vom eșantiona, apoi îl vom reconstrui. Pentru asta ar trebui să faceţi următorii paşi: | ||
+ | * simulați un semnal sinus 'analog'. Pentru aceasta generați un semnal sinus de frecvență 1Hz cu un număr mare de puncte (i.e. 5000 de puncte pe 5 perioade). Pentru timp folosiți: <code matlab> t = linspace(0, 5, N_analog); </code> (i.e. sinusoida face 5 perioade). | ||
+ | * construiți semnalul digital, adică varianta eșantionată a semnalului analog, folosind un număr mai mic de puncte (i.e. de 100 de ori mai puține) din semnalul analog. [<color red>1p</color>] | ||
+ | * faceți din semnalul digital un semnal continuu (analog), prin crearea unui semnal de aceeași lungime ca cel analog inițial, folosind valorile din semnalul digital pentru valorile de la momentele eșantionate și zero în rest. [<color red>1p</color>] | ||
+ | * faceţi convoluţie între un sinc (de frecvenţă $f_s$, dar centrat pe zero, adică un semnal simetric) şi semnalul continuu creat anterior. [<color red>1p</color>] | ||
+ | |||
+ | Pentru a face convoluție cu un semnal sinc, folosiți codul următor: | ||
+ | <note> | ||
+ | <code> | ||
+ | N_sinc = N_analog; | ||
+ | t_sinc = linspace(-0.2, 0.2, N_sinc/10); | ||
+ | sincvec = sinc(f_s*t_sinc); | ||
+ | s_cont_filtered = conv(s_cont, sincvec); | ||
+ | </code> | ||
+ | </note> | ||
+ | ,unde $f_s = 10$. | ||
+ | <note> | ||
+ | Pentru semnalele continue (analogice), puteți folosi pentru afișare //plot//, iar pentru cele digitale (eșantionate), //stem//. | ||
+ | </note> | ||
/*</hidden>*/ | /*</hidden>*/ | ||
+ | |||