This shows you the differences between two versions of the page.
ps:laboratoare:08 [2017/11/20 08:24] andrei.nicolicioiu |
ps:laboratoare:08 [2020/10/07 18:31] (current) ionut.gorgos |
||
---|---|---|---|
Line 1: | Line 1: | ||
===== Laboratorul 08. ===== | ===== Laboratorul 08. ===== | ||
+ | /*<hidden>*/ | ||
+ | ==== DFT în detaliu: DFT leakage, zero-padding ==== | ||
- | ==== DFT in detaliu: DFT leakage, zero-padding ==== | ||
+ | În acest laborator vom continua să explorăm Transformata Fourier Discretă (DFT), urmărind efectul eșantionării în domeniul frecvență (apariția sinc-ului din cauza fenomenului de leakage) și metode de rezolvare a acestuia (zero-padding, ferestre, creșterea numărului de eșantioane). | ||
- | In acest laborator vom continua sa exploram transformata Fourier Discreta (DFT), urmarind efectul esantionarii in domeniul frecventa (aparitia sinc-ului din cauza fenomenului de leakage) si metode de rezolvare a acestuia (zero-padding, ferestre, cresterea numarului de esantioane). | + | === Exercițiul 1 -- DFT leakage și zero-padding [4p] === |
- | === Exercitiul 1 -- DFT leakage si zero-padding [10p] === | + | În acest exercițiu veți reface exemplul pe care l-am făcut la curs cu 2 sinusoide pentru a vedea efectul fenomenului de leakage și a experimenta zero-padding. Pentru asta vom folosi următorul semnal: |
- | + | ||
- | In acest exercitiu veti reface exemplul pe care l-am facut la curs cu 2 sinusoide pentru a vedea efectul fenomenului de leakage si a experimenta zero-padding. Pentru asta vom folosi urmatorul semnal: | + | |
$s(n) = A_1 \sin(2\pi f_1 n t_s) + A_2 \sin(2\pi f_2 n t_s)$, | $s(n) = A_1 \sin(2\pi f_1 n t_s) + A_2 \sin(2\pi f_2 n t_s)$, | ||
- | unde $f_1$ si $f_2$ sunt frecventele celor doua sinusoide care compun semnalul, si $t_s = 1/f_s$ e perioada de sampling ($f_s = 1/t_s$). | + | unde $f_1$ si $f_2$ sunt frecvențele celor două sinusoide care compun semnalul, și $t_s = 1/f_s$ e perioada de eșantionare ($f_s = 1/t_s$). |
- | + | ||
- | Pentru a face asta urmariti urmatorii pasi: | + | |
- | - Creati si plotati semnalul, folosind $A_1=1$, $A_2=0.5$, $f_s = 8000$ Hz, $f_1 = 1000$ Hz, $f_2 = 2000$ Hz pentru $N=8$ esantioane. | + | |
- | - Calculati DFT pentru acest semnal si plotati magnitudinea acesteia, ca in laboratoarele anterioare. Ar trebui sa obtineti ceva de genul urmator: <code></code>{{:ps:laboratoare:lab7_sinewaves_a.png?300|}} {{:ps:laboratoare:lab7_sinewaves_a_fft.png?300|}} | + | |
- | - Apoi eliminati prima sinusoida (ex.: facand $f_1=0$) si verificati daca aveti semnal doar la 2kHz. | + | |
- | - Schimbati $f_2$ de la 2kHz la $f_2=2500$ Hz. Plotati spectrul. Ce putem observa? Ar trebui sa vedeti ca toata energia de la frecventa de 2.5kHz a fost distribuita pe frecventele adiacente. Dupa cum am invatat la curs acesta este fenomenul cunoscut ca "DFT leakage", si apare din cauza faptului ca folosirea unui numar finit de esantioane poate fi modelata ca inmultirea unui semnal infinit esantionat cu o functie rectangulara (al carui spectru este un sinc). Inainte, nu vedeam acest efect pentru ca esantioanele sinc-ului erau exact in punctele unde sinc-ul era 0. | + | |
- | - Pentru a vedea mai bine efectul de leakage trebuie sa crestem numarul de sample-uri folosite pentru DFT. Pentru asta adaugati 0-uri semnalului vostru. De exemplu adaugati 56 de zerouri ca sa obtineti un total de $K=64$ esantioane (din care doar $N=8$ sunt diferite de 0). Apoi calculati DFT pentru acest semnal. Ar trebui sa vedeti forma sinc-ului mult mai clar si de asemenea ca e centrata in jurul frecventei semnalului (2.5kHZ). | + | |
- | - Acum schimbati din nou frecventa la $f2=2000$ Hz dar folosind in continuare zero-padding si plot-ati DFT. Ar trebui sa vedeti ca intradevar sinc-ul era acolo, dar esantioanele de la $1000, 2000, 3000, \ldots$ erau 0. | + | |
- | <hidden> | + | Pentru a face asta urmăriți următorii pași: |
- | <note> | + | - Creați si plotați semnalul, folosind $A_1=1$, $A_2=0.5$, $f_s = 8000$ Hz, $f_1 = 1000$ Hz, $f_2 = 2000$ Hz pentru $N=8$ eșantioane. |
- | Solution without zero-padding: | + | - Calculați DFT pentru acest semnal și plotați magnitudinea acesteia, ca în laboratoarele anterioare. Ar trebui să obțineti ceva de genul următor: |
- | <code matlab lab7_sinewaves.m> | + | {{:ps:laboratoare:lab7_sinewaves_a.png?300|}} {{:ps:laboratoare:lab7_sinewaves_a_fft.png?300|}} |
- | close all; | + | - Apoi eliminați prima sinusoidă (ex.: făcând $f_1=0$) și verificați dacă aveți semnal doar la 2kHz. |
- | clear; | + | - Schimbați $f_2$ de la 2kHz la $f_2=2500$ Hz. Plotați spectrul. Ce putem observa? Ar trebui să vedeti că toată energia de la frecvența de 2.5kHz a fost distribuită pe frecvențele adiacente. După cum am învățat la curs, acesta este fenomenul cunoscut ca "DFT leakage", și apare din cauza faptului că folosirea unui număr finit de eșantioane poate fi modelată ca înmulțirea unui semnal infinit eșantionat cu o funcție rectangulară (al cărui spectru este un sinc). Înainte, nu vedeam acest efect pentru că eșantioanele sinc-ului erau exact în punctele unde sinc-ul era 0. |
- | fs = 8000; | + | - Pentru a vedea mai bine efectul de leakage trebuie să creștem numărul de eșantioane folosite pentru DFT. Pentru asta adăugați zerouri semnalului vostru. De exemplu adăugati 56 de zerouri ca să obțineți un total de $K=64$ eșantioane (din care doar $N=8$ sunt diferite de 0). Apoi calculați DFT pentru acest semnal. Ar trebui să vedeti forma sinc-ului mult mai clară și de asemenea că e centrată în jurul frecvenței semnalului (2.5kHZ). |
- | f1 = 0000; | + | - Acum schimbati din nou frecvența la $f2=2000$ Hz, dar folosind în continuare zero-padding și plotați DFT. Ar trebui să vedeți că într-adevăr sinc-ul era acolo, dar eșantioanele de la $1000, 3000, 4000 \ldots$ erau 0. |
- | f2 = 2500; | + | |
- | A1 = 1; | + | |
- | A2 = 0.5; | + | |
- | N = 8; | + | |
- | t = 0:(N-1); | + | === Exercițiul 2 -- DFT leakage și ferestre [5p] === |
- | s1 = A1*sin(2*pi*(f1/fs)*t); | + | |
- | s2 = A2*sin(2*pi*(f2/fs)*t); | + | |
- | s = s1 + s2; | + | |
- | %% Plot signals | + | În acest exercițiu aveți dat un semnal({{:ps:laboratoare:notes_signal.mat|click aici}}) care conține două note (două unde sinusoidale). Însă, una dintre ele este mult mai puternică decât cealaltă, așa că a doua, cea mai slabă, nu e ușor de detectat din spectrul semnalului. În acest exercițiu vom încerca să folosim o funcție fereastră pentru a determina cele două note. |
- | h = figure; | + | |
- | plot(t, s1, 'r--'); | + | |
- | hold on; | + | |
- | plot(t, s2, 'b-.'); | + | |
- | plot(t, s, 'k-'); | + | |
- | xlabel('Sample index'); | + | |
- | ylabel('Amplitude'); | + | |
- | title('Two sinewaves'); | + | |
- | legend('s1', 's2', 's1 + s2'); | + | |
- | print(h, '-dpng', 'lab7_sinewaves_c.png'); | + | |
+ | Să facem următoarele: | ||
+ | - Incărcați și plotați semnalul dat. Ar trebui să observați că se vor încărca variabilele 'notes_signal' și 'fs', unde fs este frecvența de eșantionare (amintiți-vă ca aveți nevoie de ea pentru a înțelege rezultatul dat de DFT). | ||
+ | - Calculați DFT pentru semnal și plotați magnitudinea, ca în laboratoarele precedente. Ar trebui să obțineți ceva precum aceasta: {{:ps:laboratoare:notes_signal_fftpos.png?300|}}. În acest moment probabil nu puteți spune care sunt cele două frecvențe ale semnalului, din cauza faptului că funcția sinc a primei sinusoide acoperă componenta celei de-a doua sinusoide. | ||
+ | - Folosind zero-padding în acest caz nu va ajuta prea mult (încercați). Așa că vom aplica semnalului o funcție fereastră (ex. 'Hanning' sau 'Hamming'; căutați aceste funcții în Matlab folosind help), precum am discutat la curs. Ideea este să generăm o funcție fereastră pe care o vom înmulții cu semnalul original. Plotați semnalul după aplicarea funcției fereastră. | ||
+ | - Calculați DFT pentru semnalul rezultat după aplicarea funcției fereastră. Puteți spune, cel puțin aproximativ, care sunt cele două frecvente conținute de semnal? | ||
- | %% Compute/plot fft | + | Semnalul, fereastra hanning și semnalul atenuat ar trebui să arate așa: |
- | ffs = fft(s); | + | |
- | fidx = (fs/N)*linspace(0, N-1, N); | + | |
- | h = figure; | + | |
- | stem(fidx, abs(ffs)); | + | |
- | title('FFT of signal'); | + | |
- | xlabel('DFT frequency index'); | + | |
- | print(h, '-dpng', 'lab7_sinewaves_c_fft.png'); | + | |
- | </code> | + | |
- | Code with zero-padding: | + | {{:ps:laboratoare:lab08_notes_signal.png?300|}} {{:ps:laboratoare:lab08_hanning_window.png?300|}} |
- | <code matlab sinewaves_zeropad.m> | + | {{:ps:laboratoare:lab08_notes_signal_window.png?300|}} |
- | close all; | + | |
- | clear; | + | |
- | fs = 8000; | + | |
- | f1 = 0; | + | |
- | f2 = 2000; | + | |
- | A1 = 1; | + | |
- | A2 = 0.5; | + | |
- | N = 8; | + | |
- | Z = 64; | + | |
- | t = 0:(N-1); | ||
- | tt = 0:(Z-1); | ||
- | s1 = A1*sin(2*pi*(f1/fs)*t); | ||
- | s2 = A2*sin(2*pi*(f2/fs)*t); | ||
- | %% Zero-pad the signals | + | === Exercițiul 3 -- Tratarea DFT leakage prin creșterea numărului de eșantione [1p] === |
- | s1 = [s1, zeros(1, Z-N)]; | + | |
- | s2 = [s2, zeros(1, Z-N)]; | + | |
- | s = s1 + s2; | + | |
+ | Precum am discutat la curs, frecvențele date de sinc pot fi reduse prin creșterea numărului de eșantioane diferite de zero ale semnalului nostru. Așa că, atunci când este posibil, aceasta ne va ajuta să vizualizăm semnale foarte aproape în frecvență. | ||
- | %% Plot signals | + | Pentru a vedea acest efect, să utilizăm aceleași note, dar cu un semnal mult mai lung {{:ps:laboratoare:notes_signal_long.mat|click aici}}. |
- | h = figure; | + | |
- | plot(tt, s1, 'r--'); | + | |
- | hold on; | + | |
- | plot(tt, s2, 'b-.'); | + | |
- | plot(tt, s, 'k-'); | + | |
- | xlabel('Sample index'); | + | |
- | ylabel('Amplitude'); | + | |
- | title('Two sinewaves'); | + | |
- | legend('s1', 's2', 's1 + s2'); | + | |
- | print(h, '-dpng', 'lab7_sinewaves_zeropad_b.png'); | + | |
- | %% Compute/plot fft | + | Procedați la fel ca înainte: |
- | ffs = fft(s); | + | - Plotați semnalul și spectrul său. Verificați dacă puteți distinge cele două frecvențe(ar trebui). |
- | fidx = (fs/Z)*linspace(0, Z-1, Z); | + | - Aplicați funcția fereastră și verificați spectrul. Ar trebui sa fie mult mai clar. |
- | h = figure; | + | - Ce note muzicale reprezintă aceste frecvențe? Puteți să redați acest sunet folosind funcția Matlab 'sound'. |
- | stem(fidx, abs(ffs)); | + | |
- | title('FFT of signal'); | + | |
- | xlabel('DFT frequency index'); | + | |
- | print(h, '-dpng', 'lab7_sinewaves_zeropad_fft_b.png'); | + | |
- | </code> | + | |
- | </note> | + | |
- | </hidden> | + | |