This shows you the differences between two versions of the page.
|
ps:labs_python_gpt:05 [2025/10/27 18:59] darius.necula |
ps:labs_python_gpt:05 [2025/10/27 19:27] (current) darius.necula |
||
|---|---|---|---|
| Line 1: | Line 1: | ||
| ===== Laboratorul 05. ===== | ===== Laboratorul 05. ===== | ||
| - | <hidden> | + | |
| - | ==== Semnale digitale - procesarea simplă, eşantionarea și modularea în amplitudine ==== | + | ==== Semnale digitale - procesarea simplă, eşantionarea și subeşantionarea ==== |
| În acest laborator vom începe să experimentăm efectele semnalelor eşantionate şi procesarea semnalelor digitale. | În acest laborator vom începe să experimentăm efectele semnalelor eşantionate şi procesarea semnalelor digitale. | ||
| Line 11: | Line 11: | ||
| === Exerciţiul 1 -- Procesarea simplă === | === Exerciţiul 1 -- Procesarea simplă === | ||
| - | [<color red>5p</color>] | + | [<color red>2p</color>] |
| Vom încerca să implementăm un sistem de procesare digitală simplă, care funcţionează după cum urmează: | Vom încerca să implementăm un sistem de procesare digitală simplă, care funcţionează după cum urmează: | ||
| Line 19: | Line 19: | ||
| Urmăriţi aceşti paşi: | Urmăriţi aceşti paşi: | ||
| - | - Creaţi câteva secvenţe digitale care reprezintă sinusoide de diferite frecvenţe (1, 2, 10, 20, 100 Hz) și amplitudine 1, la aceeaşi frecvenţă de eşantionare (folosiţi acelaşi număr de eşantioane, e.g. $N=128$). [<color red>1p</color>] | + | - Creaţi câteva secvenţe digitale care reprezintă sinusoide de diferite frecvenţe (1, 2, 10, 20, 100 Hz) și amplitudine 1, la aceeaşi frecvenţă de eşantionare (folosiţi acelaşi număr de eşantioane, e.g. $N=128$). |
| - | - Implementaţi sistemul de procesare menţionat mai sus. [<color red>1p</color>] | + | - Implementaţi sistemul de procesare menţionat mai sus.[<color red>1p</color>] |
| - | - Creaţi secvenţele corespunzătoare de ieşire. [<color red>1p</color>] | + | - Creaţi secvenţele corespunzătoare de ieşire. |
| - | - Plotaţi toate secvenţele de intrare/ieşire. [<color red>1p</color>] | + | - Plotaţi toate secvenţele de intrare/ieşire. [<color red>0.5p</color>] |
| - Ce fel de sistem de procesare este acesta ? | - Ce fel de sistem de procesare este acesta ? | ||
| - Cum ați putea implementa sistemul de procesare menționat mai sus, folosind funcția [[https://docs.scipy.org/doc/scipy/reference/generated/scipy.signal.lfilter.html|lfilter]] din biblioteca //scipy//? (opțional) | - Cum ați putea implementa sistemul de procesare menționat mai sus, folosind funcția [[https://docs.scipy.org/doc/scipy/reference/generated/scipy.signal.lfilter.html|lfilter]] din biblioteca //scipy//? (opțional) | ||
| - | - Adăugați la sinusoidele generate mai sus, un zgomot alb de deviație standard 0.1 și medie 0, folosind următorul cod: | + | - Adăugați la sinusoidele generate mai sus, un zgomot alb de deviație standard 0.1 și medie 0. Plotați din nou toate secvenţele de intrare/ieşire.[<color red>0.5p</color>] |
| - | <code python> | + | |
| - | import numpy as np | + | |
| - | noise = np.random.normal(0, 0.1, x.shape) | + | |
| - | x = x + noise | + | |
| - | </code>, unde x este semnalul sinusoidal. Plotați din nou toate secvenţele de intrare/ieşire.[<color red>1p</color>] | + | |
| <note tip> | <note tip> | ||
| 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). | 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). | ||
| Line 39: | Line 34: | ||
| === Exercițiul 2 – modularea în amplitudine === | === Exercițiul 2 – modularea în amplitudine === | ||
| - | [<color red>5p</color>] | + | [<color red>3p</color>] |
| Î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). | Î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). | ||
| Line 55: | Line 50: | ||
| Pentru asta va trebui să urmăriți acești pași: | Pentru asta va trebui să urmăriți acești pași: | ||
| - | * Creați semnalul $s(t)$ pentru $t\in\{1,\ldots,T=128\}$, folosind $a=0.05$. [<color red>1p</color>] | + | * 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 FFT (Transformata Fourier Rapidă), pe care nu am făcut-o încă la curs, dar o vom face în următoarele cursuri. Pentru moment, puteți folosi acest cod: [<color red>1p</color>] | + | * Calculați și plotați (cu //stem//) spectrul folosind FFT (Transformata Fourier Rapidă), pe care nu am făcut-o încă la curs, dar o vom face în următoarele cursuri. Pentru moment, puteți folosi acest cod: |
| <code python> | <code python> | ||
| import numpy as np | import numpy as np | ||
| Line 77: | Line 72: | ||
| <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> | <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> | ||
| - | <hidden> | + | === Exercițiul 3 -- Subeşantionare (Bandpass sampling) === |
| - | === Exercițiul 3 – modularea în amplitudine [<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}}). | + | |
| - | Urmați următorii pași: | + | |
| - | * Descărcați semnalul modulat și încărcați-l în MATLAB folosind funcția: <code matlab>load('lab05_modulated_sound.mat')</code> 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 trece-jos. Folosiți fc = Fs / 8. | + | |
| - | * Pentru a realiza efectul unui filtru trece-jos 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)//. Pentru a opri sunetul folosiți comanda <code matlab> clear sound </code> | + | |
| - | + | ||
| - | <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> | + | |
| - | </hidden> | + | |
| - | + | ||
| - | <hidden> | + | |
| - | === Exercițiul 2 -- Subeşantionare (Bandpass sampling) === | + | |
| [<color red>3p</color>] | [<color red>3p</color>] | ||
| Line 105: | Line 84: | ||
| - 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}$ | - 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 ce avem energie în ambele frecvenţe $f_c$ şi $-f_c$ ? | - De ce avem energie în ambele frecvenţe $f_c$ şi $-f_c$ ? | ||
| - | - 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> | + | - Generaţi cod Python 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> |
| figure; | figure; | ||
| fx = zeros(1, N); | fx = zeros(1, N); | ||
| Line 126: | Line 105: | ||
| - 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). | - 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>] | - 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>] | ||
| + | |||
| + | <hidden> | ||
| + | === Exercițiul 3 – modularea în amplitudine [<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}}). | ||
| + | Urmați următorii pași: | ||
| + | * Descărcați semnalul modulat și încărcați-l în MATLAB folosind funcția: <code matlab>load('lab05_modulated_sound.mat')</code> 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 trece-jos. Folosiți fc = Fs / 8. | ||
| + | * Pentru a realiza efectul unui filtru trece-jos 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)//. Pentru a opri sunetul folosiți comanda <code matlab> clear sound </code> | ||
| + | |||
| + | <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> | ||
| + | </hidden> | ||
| + | |||
| + | <hidden> | ||
| === Exercițiul 3 -- Reconstruire de semnal === | === Exercițiul 3 -- Reconstruire de semnal === | ||