Differences

This shows you the differences between two versions of the page.

Link to this comparison view

ps:labs_python:07 [2023/11/11 13:57]
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:
-  ​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. +  ​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. 
-  ​Calculați DFT pentru acest semnal și plotați (cu //stem//) magnitudinea acesteia, ca în laboratoarele anterioare. Ar trebui să obțineti ceva de genul următor: ​+  ​Calculați DFT pentru acest semnal și plotați (cu //stem//) magnitudinea acesteia, ca în laboratoarele anterioare. Ar trebui să obțineti ceva de genul următor: ​
 {{:​ps:​labs:​lab7_sinewaves_a.png?​300|}} {{:​ps:​labs:​lab7_sinewaves_a_fft.png?​300|}} ​ {{:​ps:​labs:​lab7_sinewaves_a.png?​300|}} {{:​ps:​labs:​lab7_sinewaves_a_fft.png?​300|}} ​
   - Apoi eliminați prima sinusoidă (ex.: făcând $f_1=0$) și verificați dacă aveți semnal doar la 2kHz. [<color red>​1p</​color>​]   - Apoi eliminați prima sinusoidă (ex.: făcând $f_1=0$) și verificați dacă aveți semnal doar la 2kHz. [<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>​]   - 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 ===
 [<color red>​5p</​color>​] [<color red>​5p</​color>​]
  
-În acest exercițiu aveți dat un semnal({{:​ps:​labs_python:​notes_signal.7z|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.+În acest exercițiu aveți dat un semnal({{:​ps:​labs_python:​lab7_notes_signal.7z|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.
  
 Să facem următoarele:​ 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). +  ​* Î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. Ar trebui să obțineți ceva precum aceasta: ​+  ​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: ​
  
 {{:​ps:​labs:​notes_signal_fftpos.png?​300|}} {{:​ps:​labs:​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. Î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). Ideea este să generăm o funcție fereastră pe care o vom înmulți cu semnalul original. Plotați semnalul după aplicarea funcției fereastră. +  ​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//​). Ideea este să generăm o funcție fereastră pe care o vom înmulți cu semnalul original. Plotați semnalul după aplicarea funcției fereastră. ​[<color red>​1p</​color>​]  
-  ​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?+<​note>​Funcțiile menționate mai sus pot fi găsite în biblioteca //scipy//, modulul //​signal//<​code>​ 
 +from scipy.signal import windows 
 +</​code>​ 
 +</​note>​ 
 +  ​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 51: Line 55:
 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ță. 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ță.
  
-Pentru a vedea acest efect, să utilizăm aceleași note, dar cu un semnal mult mai lung {{:ps:labs:notes_signal_long.mat|click aici}}.+Pentru a vedea acest efect, să utilizăm aceleași note, dar cu un semnal mult mai lung {{:ps:labs_python:lab7_notes_signal_long.7z|click aici}}.
  
 Procedați la fel ca înainte: Procedați la fel ca înainte:
   - Plotați semnalul și spectrul său pozitiv. Verificați dacă puteți distinge cele două frecvențe(ar trebui).   - Plotați semnalul și spectrul său pozitiv. Verificați dacă puteți distinge cele două frecvențe(ar trebui).
   - Aplicați funcția fereastră și verificați spectrul. Ar trebui sa fie mult mai clar.   - Aplicați funcția fereastră și verificați spectrul. Ar trebui sa fie mult mai clar.
-  - Ce note muzicale reprezintă aceste frecvențe? ​Puteți să redați acest sunet folosind funcția MATLAB ​//sound//.+  - Ce note muzicale reprezintă aceste frecvențe? ​Pentru a reda sunetul stocat în vectorul ​//s//, folosiți codul următor: 
 +<​code>​ 
 +import sounddevice as sd 
 +import time
  
-</​hidden>​+sd.play(s, fs) 
 +time.sleep(T) # Ne asigură că putem auzi tot semnalul, unde T = durata semnalului s 
 +sd.stop() 
 +</​code>​ 
 + 
 +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>​*/
ps/labs_python/07.1699703847.txt.gz · Last modified: 2023/11/11 13:57 by darius.necula
CC Attribution-Share Alike 3.0 Unported
www.chimeric.de Valid CSS Driven by DokuWiki do yourself a favour and use a real browser - get firefox!! Recent changes RSS feed Valid XHTML 1.0