Table of Contents

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ă:

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:

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')

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.