Laboratorul 05.

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.

Materiale ajutătoare:

  1. Secţiunile 5.1-5.3

Exerciţiul 1 -- Procesarea simplă

[5p]

Vom încerca să implementăm un sistem de procesare digitală simplă, care funcţionează după cum urmează:

  • luaţi 5 eşantioane (samples) din semnalul de intrare, $x_1, x_2, \ldots, x_5$.
  • faceţi o medie a celor 5 eşantioane (samples), $a = 0.2 \cdot (x_1 + x_2 + x_3 + x_4 + x_5)$
  • puneţi la ieşire valoarea curentă $y(n) = a$

Urmăriţi aceşti paşi:

  1. 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$). [1p]
  2. Implementaţi sistemul de procesare menţionat mai sus. [1p]
  3. Creaţi secvenţele corespunzătoare de ieşire. [1p]
  4. Plotaţi toate secvenţele de intrare/ieşire. [1p]
  5. Ce fel de sistem de procesare este acesta ?
  6. Cum ați putea implementa sistemul de procesare menționat mai sus, folosind funcția lfilter din biblioteca scipy? (opțional)
  7. Adăugați la sinusoidele generate mai sus, un zgomot alb de deviație standard 0.1 și medie 0, folosind următorul cod:
import numpy as np
noise = np.random.normal(0, 0.1, x.shape)
x = x + noise

, unde x este semnalul sinusoidal. Plotați din nou toate secvenţele de intrare/ieşire.[1p]

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 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.

Exercițiul 2 – modularea în amplitudine

[5p]

Î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).

Obiectivul vostru:

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.

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} DFT: S(k) = \sum^{N-1}_{n = 0}{s(n)e^{\frac{-j 2 \pi n k}{K}}}, k \in \{0, ..., K-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}

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$. [1p]
  • 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: [1p]
import numpy as np
from scipy.fft import fft, fftshift
import matplotlib.pyplot as plt
 
fx = np.linspace(-T//2, T//2 - 1, T) # pentru T par
spectru = fft(s)
plt.figure()
plt.plot(fx, np.abs(fftshift(spectru)))
plt.stem(fx, np.abs(fftshift(spectru)), basefmt=" ")
plt.xlabel('Frequency component (k)')
plt.ylabel('Magnitude of component')
plt.title('Fourier coefficients before amplitude modulation')
  • 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. [1p]
  • 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)$. [1p]
  • 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? [1p]

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.

ps/labs_python/05.txt · Last modified: 2023/10/31 10:14 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