Differences

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

Link to this comparison view

ps:labs_python:05 [2023/10/31 00:54]
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 30: Line 30:
 noise = np.random.normal(0,​ 0.1, x.shape) noise = np.random.normal(0,​ 0.1, x.shape)
 x = x + noise x = x + noise
-</​code>,​ unde x este semnalul sinusoidal.+</​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).
 </​note>​ </​note>​
  
-<​note>​ Pentru crearea timpilor de eșantionare puteți folosi funcția //​np.linspace(0,​timp_maxim,​numar_esantioane)//​ sau //​np.arange//,​ cu pasul 1/​frecventa_de_esantionare. Pentru acest exercițiu puteți considera //​timp_maxim = 1//​.</​note>​+<​note>​ Pentru crearea timpilor de eșantionare puteți folosi funcția //​np.linspace(0,​timp_maxim,​numar_esantioane)//​ sau //​np.arange//,​ cu pasul //1/​frecventa_de_esantionare//. Pentru acest exercițiu puteți considera //​timp_maxim = 1//​.</​note>​
  
  
 === Exercițiul 2 – modularea în amplitudine === === Exercițiul 2 – modularea în amplitudine ===
-[<color red>3p</​color>​] ​+[<color red>5p</​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 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//2T//2 1T) # pentru ​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] = -// 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>​] ===
  
ps/labs_python/05.1698706462.txt.gz · Last modified: 2023/10/31 00:54 by ionut.gorgos
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