This shows you the differences between two versions of the page.
ps:labs_python:07 [2023/11/11 14:52] darius.necula |
ps:labs_python:07 [2023/11/13 17:24] (current) ionut.gorgos |
||
---|---|---|---|
Line 1: | Line 1: | ||
===== Laboratorul 07. ===== | ===== Laboratorul 07. ===== | ||
- | <hidden> | + | /*<hidden>*/ |
==== DFT în detaliu: DFT leakage, zero-padding ==== | ==== DFT în detaliu: DFT leakage, zero-padding ==== | ||
- | Prezentarea PowerPoint pentru acest laborator poate fi găsită aici: [[https://docs.google.com/presentation/d/1I0jGMdwlAporLfDDVjQGpfOmVjAoRhKS/edit?usp=sharing&ouid=110538702824281541719&rtpof=true&sd=true|aici]] | ||
Î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). | Î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). | ||
Line 14: | Line 13: | ||
- | unde $f_1$ si $f_2$ sunt frecvențele celor două sinusoide care compun semnalul, $t_s = 1/f_s$ e perioada de eșantionare ($f_s = 1/t_s$ ) și $n=0:N-1$, unde $N$ reprezintă numărul de eșantioane. | + | unde $f_1$ și $f_2$ sunt frecvențele celor două sinusoide care compun semnalul, $t_s = 1/f_s$ e perioada de eșantionare ($f_s = 1/t_s$ ) și $n=0:N-1$, unde $N$ reprezintă numărul de eșantioane. |
Pentru a face asta urmăriți următorii pași: | Pentru a face asta urmăriți următorii pași: | ||
Line 23: | Line 22: | ||
- Schimbați $f_2$ de la 2kHz la $f_2=2500$ Hz. Plotați spectrul (cu //stem//). Ce putem observa? Ar trebui să vedeți că toată energia de la frecvența de 2.5kHz a fost distribuită pe frecvențele adiacente. 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. [<color red>1p</color>] | - Schimbați $f_2$ de la 2kHz la $f_2=2500$ Hz. Plotați spectrul (cu //stem//). Ce putem observa? Ar trebui să vedeți că toată energia de la frecvența de 2.5kHz a fost distribuită pe frecvențele adiacente. 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. [<color red>1p</color>] | ||
- 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ăugați la finalul semnalului 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ă vedeți forma sinc-ului mult mai clară și de asemenea că e centrată în jurul frecvenței semnalului (2.5kHZ). [<color red>1p</color>] | - 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ăugați la finalul semnalului 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ă vedeți forma sinc-ului mult mai clară și de asemenea că e centrată în jurul frecvenței semnalului (2.5kHZ). [<color red>1p</color>] | ||
- | - Acum schimbați din nou frecvența la $f2=2000$ Hz, dar folosind în continuare zero-padding și plotați DFT (cu //stem//). Ar trebui să vedeți că într-adevăr sinc-ul era acolo, dar eșantioanele de la $1000, 3000, 4000 \ldots$ erau 0. [<color red>1p</color>] | + | - Acum schimbați din nou frecvența la $f2=2000$ Hz, dar folosind în continuare zero-padding și plotați DFT (cu //stem//). Ar trebui să vedeți că într-adevăr sinc-ul era acolo, dar magnitudinea de la eșantioanele $1000, 3000, 4000 \ldots$ era 0. [<color red>1p</color>] |
=== Exercițiul 2 -- DFT leakage și ferestre === | === Exercițiul 2 -- DFT leakage și ferestre === | ||
Line 31: | Line 30: | ||
Să facem următoarele: | Să facem următoarele: | ||
- | * Încărcați și plotați semnalul dat. Ar trebui să încărcați 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) așa cum ați făcut în laboratorul anterior. [<color red>1p</color>] | + | * Încărcați și plotați semnalul dat. Ar trebui să încărcați variabilele //notes_signal// și //fs//, unde //fs// este frecvența de eșantionare (amintiți-vă că aveți nevoie de ea pentru a înțelege rezultatul dat de DFT) așa cum ați făcut în laboratorul anterior. [<color red>1p</color>] |
* Calculați DFT pentru semnal și plotați spectrul pozitiv al semnalului (cu //stem//), ca în laboratoarele precedente. [<color red>1p</color>] | * Calculați DFT pentru semnal și plotați spectrul pozitiv al semnalului (cu //stem//), ca în laboratoarele precedente. [<color red>1p</color>] | ||
Ar trebui să obțineți ceva precum aceasta: | Ar trebui să obțineți ceva precum aceasta: | ||
Line 43: | Line 42: | ||
</code> | </code> | ||
</note> | </note> | ||
- | * 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? [<color red>2p</color>] | + | * Calculați DFT pentru semnalul rezultat după aplicarea funcției fereastră. Puteți spune, cel puțin aproximativ, care sunt cele două frecvențe conținute de semnal? [<color red>2p</color>] |
Semnalul, fereastra //Hanning// și semnalul atenuat ar trebui să arate așa: | Semnalul, fereastra //Hanning// și semnalul atenuat ar trebui să arate așa: | ||
Line 71: | Line 70: | ||
</code> | </code> | ||
- | </hidden> | + | Pentru a salva într-un fișier sunetul stocat în vectorul //s//, folosiți codul următor: |
+ | <code> | ||
+ | from scipy.io.wavfile import write | ||
+ | |||
+ | sound = np.int16(s/np.max(np.abs(s)) * 32767) | ||
+ | write('s.wav', fs, sound) | ||
+ | </code> | ||
+ | |||
+ | /*</hidden>*/ |