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/30 00:12] (current) ionut.gorgos |
||
|---|---|---|---|
| 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>3p</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. [<color red>0.5p</color>] |
| - | - 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? [<color red>0.5p</color>] |
| - 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>4p</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$. [<color red>0.5p</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: [<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: [<color red>0.5p</color>] |
| <code python> | <code python> | ||
| import numpy as np | import numpy as np | ||
| Line 76: | Line 71: | ||
| <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> | ||
| + | |||
| + | === Exercițiul 3 -- Subeşantionare (Bandpass sampling) === | ||
| + | [<color red>3p</color>] | ||
| + | |||
| + | Î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. | ||
| + | |||
| + | 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: | ||
| + | |||
| + | {{:ps:labs:bandpass.png?500|}} | ||
| + | |||
| + | Task-uri/întrebări: | ||
| + | - 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$ ? | ||
| + | - 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 python> | ||
| + | import numpy as np | ||
| + | from scipy.fft import fft, fftshift | ||
| + | import matplotlib.pyplot as plt | ||
| + | |||
| + | plt.figure() | ||
| + | fx = np.zeros(1, N) | ||
| + | fidx = (fs/N) * np.linspace(0,N-1,N) | ||
| + | spectrum = fft(signal, N) | ||
| + | plt.stem(fidx, np.abs(spectrum)) | ||
| + | plt.xlabel('Frequency (Hz)') | ||
| + | plt.ylabel('Amplitude') | ||
| + | plt.title('Spectrum of signal') | ||
| + | </code> | ||
| + | - 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 python> | ||
| + | import numpy as np | ||
| + | from scipy.fft import fft, fftshift | ||
| + | import matplotlib.pyplot as plt | ||
| + | |||
| + | plt.figure() | ||
| + | fidx = (fs/N)*np.linspace(-N/2, N/2-1, N) | ||
| + | plt.stem(fidx, np.abs(fftshift(spectrum))) | ||
| + | plt.xlabel('Frequency (Hz)') | ||
| + | plt.ylabel('Amplitude') | ||
| + | plt.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://web.archive.org/web/20240102080629/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> | <hidden> | ||
| Line 93: | Line 130: | ||
| <hidden> | <hidden> | ||
| - | === Exercițiul 2 -- Subeşantionare (Bandpass sampling) === | ||
| - | [<color red>3p</color>] | ||
| - | |||
| - | Î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. | ||
| - | |||
| - | 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: | ||
| - | |||
| - | {{:ps:labs:bandpass.png?500|}} | ||
| - | |||
| - | Task-uri/întrebări: | ||
| - | - 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$ ? | ||
| - | - 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> | ||
| - | figure; | ||
| - | fx = zeros(1, N); | ||
| - | fidx = (fs/N) * linspace(0,N-1,N); | ||
| - | spectrum = fft(signal, N); | ||
| - | stem(fidx, abs(spectrum)); | ||
| - | xlabel('Frequency (Hz)'); | ||
| - | ylabel('Amplitude'); | ||
| - | title('Spectrum of signal'); | ||
| - | </code> | ||
| - | - 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> | ||
| - | figure; | ||
| - | 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 -- Reconstruire de semnal === | === Exercițiul 3 -- Reconstruire de semnal === | ||