This shows you the differences between two versions of the page.
ps:labs_python:05 [2023/10/31 00:59] ionut.gorgos |
ps:labs_python:05 [2023/10/31 10:14] (current) ionut.gorgos |
||
---|---|---|---|
Line 1: | Line 1: | ||
===== Laboratorul 05. ===== | ===== Laboratorul 05. ===== | ||
- | <hidden> | + | /*<hidden>*/ |
- | ==== Semnale digitale - procesarea simplă, eşantionarea și recuperarea semnalului ==== | + | ==== Semnale digitale - procesarea simplă, eşantionarea și modularea în amplitudine ==== |
Î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 45: | Line 45: | ||
Obiectivul vostru: | Obiectivul vostru: | ||
- | Folosiți o frecvență purtătoare $f_c = \frac{20}{T}$, unde $T$ este numărul eșantioanelor (samples). | + | Folosiți o frecvență purtătoare $f_c = \frac{20}{T}$, unde $T$ este numărul eșantioanelor (samples) și calculați cu ajutorul DFT (Discrete Fourier Transform) și FFT (Fast Fourier Transform) spectrul semnalelor. |
- | /*<hidden> */ | ||
Vom considera că DFT are același număr de componente ca și semnalul de intrare ($K = N$). Formulele pentru DFT și pentru inversa ei (IDFT) sunt următoarele: | Vom considera că DFT are același număr de componente ca și semnalul de intrare ($K = N$). Formulele pentru DFT și pentru inversa ei (IDFT) sunt următoarele: | ||
\begin{equation} | \begin{equation} | ||
Line 54: | Line 53: | ||
IDFT\ (inversa\ DFT): s(n) = \frac{1}{K}\sum^{K-1}_{k = 0}{S(k)e^{\frac{j 2 \pi n k}{K}}}, n \in \{0, ..., N-1\} | IDFT\ (inversa\ DFT): s(n) = \frac{1}{K}\sum^{K-1}_{k = 0}{S(k)e^{\frac{j 2 \pi n k}{K}}}, n \in \{0, ..., N-1\} | ||
\end{equation} | \end{equation} | ||
- | De asemenea, calculați cu ajutorul FFT (FFT este varianta rapidă a DFT) și plotați spectrul folosind acest cod: | ||
- | /*</hidden>*/ | ||
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>0.5p</color>] | + | * Creați semnalul $s(t)$ pentru $t\in\{1,\ldots,T=128\}$, folosind $a=0.05$. [<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>] | + | * 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>] |
<code python> | <code python> | ||
import numpy as np | import numpy as np | ||
- | import scipy as sp | + | from scipy.fft import fft, fftshift |
import matplotlib.pyplot as plt | import matplotlib.pyplot as plt | ||
- | fx = np.zeros(T) | + | fx = np.linspace(-T//2, T//2 - 1, T) # pentru T par |
- | findex = T/2 * np.linspace(0, 1, T // 2) | + | spectru = fft(s) |
- | fx[T // 2:] = findex | + | |
- | fx[1:(T//2)] = -findex[:0:-1] | + | |
- | fx[0] = -T // 2 | + | |
- | fs = sp.fft.fft(s) | + | |
plt.figure() | plt.figure() | ||
- | plt.stem(fx, abs(sp.fft.fftshift(fs))) | + | plt.plot(fx, np.abs(fftshift(spectru))) |
+ | plt.stem(fx, np.abs(fftshift(spectru)), basefmt=" ") | ||
plt.xlabel('Frequency component (k)') | plt.xlabel('Frequency component (k)') | ||
plt.ylabel('Magnitude of component') | plt.ylabel('Magnitude of component') | ||
plt.title('Fourier coefficients before amplitude modulation') | plt.title('Fourier coefficients before amplitude modulation') | ||
</code> | </code> | ||
- | * Modulați semnalul în amplitudine folosind frecvența purtătoare $f_c = \frac{20}{T}$, i.e. face 20 de perioade complete în $T=128$ eșantioane ale semnalului $s(t)$. O variantă simplă de modulare este să calculați: $x(t) = (1+s(t)) \cdot \cos(2\pi f_c t)$. [<color red>0.5p</color>] | + | * Calculați și plotați (cu //stem//) spectrul cu ajutorul DFT, folosind formula de mai sus, apoi comparați rezultatul cu cel al funcției //fft//. [<color red>1p</color>] |
- | * Calculați și plotați (cum am făcut mai devreme, cu funcția //fft//) spectrul semnalului modulat în amplitudine. Comparați-l cu spectrul semnalului original. Este ceea ce v-ați așteptat? [<color red>0.5p</color>] | + | * Modulați semnalul în amplitudine folosind frecvența purtătoare $f_c = \frac{20}{T}$, i.e. face 20 de perioade complete în $T=128$ eșantioane ale semnalului $s(t)$. O variantă simplă de modulare este să calculați: $x(t) = (1+s(t)) \cdot \cos(2\pi f_c t)$. [<color red>1p</color>] |
+ | * Calculați și plotați (cum am făcut mai devreme, cu funcția //fft//) spectrul semnalului modulat în amplitudine. Comparați-l cu spectrul semnalului original. Este ceea ce v-ați așteptat? [<color red>1p</color>] | ||
+ | <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 – modularea în amplitudine [<color red>3p</color>] === | === Exercițiul 3 – modularea în amplitudine [<color red>3p</color>] === | ||