Sunteți pe pagina 1din 17

1.

SEMNALE ÎN TIMP DISCRET

LUCRAREA 1
SEMNALE ÎN TIMP DISCRET

Un semnal în timp discret este definit prin valorile acestuia măsurate la


momente discrete de timp. Semnalele în timp discret sunt reprezentate matematic
prin secvențe de numere notate:

x[n] , N1  n  N 2 (2.1)

În Octave aceste secvențe se pot defini ca vectori linie sau coloană, având
elemente reale sau complexe. O primă limitare apare din faptul că acești vectori sunt
de lungime finită în timp ce în problemele de prelucrarea numerică a semnalelor se
poate lucra cu secvențe de lungime infinită.

1.1.1. Definirea semnalelor în timp discret

În studiul semnalelor și sistemelor în timp discret se utilizează câteva secvențe


de bază ce vor fi prezentate în continuare, împreună cu modul lor de definire în
Octave.

• Impulsul unitate
Din punct de vedere matematic este definit astfel:
1 , n = 0
 [ n] =  (2.2)
0 , n  0
Utilizând proprietatea de deplasare în timp se poate scrie că
1 , n = n0
 [n − n0 ] =  (2.3)
0 , n  n0
1
1. SEMNALE ÎN TIMP DISCRET

Deoarece în Octave nu putem defini secvențe de lungime infinită trebuie precizat


domeniul de valori pentru n. Pentru a facilita definirea unor secvențe de acest tip
vom crea o funcție Octave:

function [y,n] = impuls(li,ls,k)


% Impulsul unitate (Dirac) in timp discret
% Parametrii de iesire:
% y = delta(n-k) (vector linie) pe suportul li:ls
% n = suportul temporal li:ls (vector linie)
% Parametrii de intrare:
% li = limita inferioara a suportului temporal;
% ls = limita superioara a suportului temporal;
% k = indicele aferent delta(n-k)
if (nargin~=3)|(nargout>2)
error('Verificati argumentele de intrare/iesire!')
end
if li>=ls
error('Suport temporal invalid!')
end
if (k<li)|(k>ls)
error('Indice in afara suportului temporal!')
end

L = ls-li+1;
y = zeros(1,L);
y(k-li+1) = 1;
n = li:ls;
endfunction

Observații:
• Regulile pentru definirea corectă a funcțiilor Octave sunt enumerate aici:
https://octave.org/doc/v4.0.0/Defining-Functions.html
• Numele funcției va fi și numele fișierului în care se va salva funcția. Nu se vor
folosi nume identice cu cele deja existente în Octave!
• Funcțiile se apelează din alte fișiere Octave aflate în același director curent!
Funcțiile NU se execută ca un script obișnuit (butonul Run)!

Exemple:

2
1. SEMNALE ÎN TIMP DISCRET

Utilizând funcția Octave impuls creată anterior, să se definească și să se


reprezinte grafic secvențele următoare.
1. 𝑦1 [𝑛] = 𝛿[𝑛]
2. 𝑦2 [𝑛] = 0.5 ∙ 𝛿[𝑛 − 3], pentru −10 ≤ 𝑛 ≤ 10.
[y1,n] = impuls(-10,10,0)
figure, stem(n,y1), grid
[y2,n] = impuls(-10,10,3);
figure, stem(n,0.5*y2), grid

• Treapta unitate
Din punct de vedere matematic, treapta unitate este definită astfel:
1 , n  0
u[n] =  (2.4)
0 , n  0
Utilizând proprietatea de deplasare în timp se poate scrie că
1 , n  n0
u[n − n0 ] =  (2.5)
 0 , n  n0
Se va crea de asemenea o funcție Octave pentru definirea secvențelor
discrete de tip treaptă unitate, având un suport temporal finit:

function [y,n] = treapta(li,ls,k)


% Treapta unitate in timp discret
% Parametrii de iesire:
% y = u(n-k) (vector linie) pe suportul li:ls
% n = suportul temporal li:ls
% Parametrii de intrare:
% li = limita inferioara a suportului temporal;
% ls = limita superioara a suportului temporal;
% k = indicele din u(n-k)
if (nargin~=3)|(nargout>2)
error('Verificati argumentele de intrare/iesire!')
end
if li>=ls
error('Suport temporal invalid!')
end
if (k<li)|(k>ls)
error('Indice in afara suportului temporal!')
end

3
1. SEMNALE ÎN TIMP DISCRET

L = ls-li+1;
y = zeros(1,L);
y(k-li+1:L) = 1;
n = li:ls;
endfunction

Exemple:
Să se definească și să se reprezinte grafic secvențele:
1. 𝑦1 [𝑛] = 𝑢[𝑛]
2. 𝑦2 [𝑛] = 0.7 ∙ (𝑢[𝑛 + 3] − 𝑢[𝑛 − 3]), pentru −5 ≤ 𝑛 ≤ 10.

[y1,n] = treapta(-5,10,0);
figure, stem(n,y1), grid
[y21,n] = treapta(-5,10,-3);
[y22,n] = treapta(-5,10,3);
y2 = 0.7*(y21-y22);
figure, stem(n,y2), grid

E1. Exerciții:
Să se definească și să se reprezinte grafic următoarele secvențe discrete:
1. 𝑥1 [𝑛] = 𝛿[𝑛 − 1] + 𝑢[𝑛 − 5] + 𝛿[𝑛 + 2] − 2 ∙ 𝛿[𝑛 − 9],
pentru −10 ≤ 𝑛 ≤ 20
1 𝑛 1 𝑛
2. 𝑥2 [𝑛] = ( ) − (− ) , pentru 0 ≤ 𝑛 ≤ 10
2 2
𝑛𝜋 𝑛𝜋
3. 𝑥3 [𝑛] = ln |cos ( ) − sin ( )|, pentru −20 ≤ 𝑛 ≤ 20
15 15
𝑛𝜋
4. 𝑥4 [𝑛] = (−1)𝑛 cos ( ), pentru 0 ≤ 𝑛 ≤ 10
15

În general, un semnal în timp discret provine din eșantionarea unui semnal


continuu cu o perioadă de eșantionare Ts. Valorile stocate în vectorul care reprezintă
semnalul discret corespund valorilor amplitudinii semnalului continuu la momente
întregi de perioada de eșantionare 𝑛 ∙ 𝑇𝑠 , 𝑛 ∈ ℕ.

𝑠(𝑛) = 𝑠𝑐 (𝑛𝑇𝑠 )

De exemplu, pentru un semnal sinusoidal de frecvență 𝐹0

𝑠𝑐 (𝑡) = 𝐴0 ∙ sin(2𝜋 ∙ 𝐹0 ∙ 𝑡)

4
1. SEMNALE ÎN TIMP DISCRET

Semnalul eșantionat va fi:

𝐹0
𝑠(𝑛) = 𝐴0 ∙ sin(2𝜋 ∙ 𝐹0 ∙ 𝑛 ∙ 𝑇𝑠 ) = 𝐴0 sin (2𝜋 𝑛)
𝐹𝑠
𝐹
Notând frecvența normată 𝑓0 = 0, respectiv pulsaţia normată 𝜔0 = 2𝜋𝑓0 =
𝐹𝑠
𝐹0
2𝜋 rezultă:
𝐹𝑠
𝑠(𝑛) = 𝐴0 sin(2𝜋 ∙ 𝑓0 ∙ 𝑛) = 𝐴0 sin(𝜔0 𝑛)

Exemple:
1. Să se reprezinte grafic cu funcția stem un semnal discret obținut prin eșantionarea
unui semnal sinusoidal de frecvență 300 Hz, de durată 10 milisecunde și
amplitudine 2. Frecvența de eșantionare Fs = 4kHz. Câte eșantioane are semnalul
discret?

F0 = 300; Fs = 4000;
Tmax = 10^(-2); % durata semnalului 10 ms
N = Tmax*Fs; % numar de esantioane N=10ms*4kHz
w0 = 2*pi*F0/Fs; % pulsatia normata
n = 0:N-1;
x = 2*sin(w0*n);
figure(1), stem(n,x), grid

2. Să se reprezinte grafic cu funcția plot semnalul analogic obținut din semnalul în


timp discret anterior prin conversia digital-analogică (Fs = 4kHz). Reprezentați
semnalul analogic în timp absolut (ms) și determinați perioada și frecvența
nenormată ale semnalului analogic.

F0 = 300; Fs = 4000;
Tmax = 10^(-2); % durata semnalului 10 ms
Ts = 1/Fs;
t = 0:Ts:Tmax-Ts;
xa = 2*sin(2*pi*F0*t);
figure(2), plot(t,xa,'-o'), xlabel('t[ms]'), grid

Observație: Având eșantioanele semnalului discret, semnalul analogic se poate


reprezenta cu funcția plot având ca parametri timpul absolut t(ms) și vectorul cu

5
1. SEMNALE ÎN TIMP DISCRET

eșantioanele semnalului discret. Nu mai trebuie calculat semnalul analogic, practic


se obțin aceleași valori de amplitudine:

%xa = 2*sin(2*pi*F0*t);
figure(3),
subplot(121),plot(n,x,'-or','markersize',10)
subplot(122),plot(t,xa,'-*b','markersize', 15)

1.1.2. Convoluția liniară a semnalelor în timp discret

Produsul de convoluție liniară a două secvențe numerice x1[n] și x2[n] este


definit astfel:

x[n] = x1[n]  x2 [n] =  x1[k ]  x2 [n − k ] (2.6)
k =−

unde secvențele x1[n] și x2[n] s-au presupus a avea lungime infinită.


În Octave secvențele numerice sunt privite ca niște vectori și ținând cont de
faptul că ele sunt finite și că indicele primului element dintr-un vector nu poate fi
zero (se efectuează o indexare cu 1) atunci definiția de mai sus devine:
N −1
x[n + 1] =  x1[k + 1]  x2 [n − k ] (2.7)
k =0

unde N este maximul dintre lungimile celor două secvențe.

Sintaxa:
conv(x1,x2)
• returnează ca rezultat un vector de lungime egală cu lungimea vectorului x1 plus
lungimea vectorului x2 minus 1, ce reprezintă produsul de convoluție liniară al
celor două secvențe definite prin vectorii x1 și x2.

Exemplu:
Să se calculeze și să se reprezinte grafic produsul de convoluție liniară a secvențelor
x1[n] = u[n] − u[n − 5] ( 0  n  10 ) și x2 [n] = (0,9) n ( 0  n  20 ).
x1 = treapta(0,10,0)-treapta(0,10,5);
n = 0:20;
x2 = 0.9.^n;

6
1. SEMNALE ÎN TIMP DISCRET

x = conv(x1,x2);
subplot(2,2,1),stem(0:10,x1),title(’x1’),grid
subplot(2,2,2),stem(n,x2),title(’x2’),grid
subplot(2,1,2),stem(0:length(x)-1,x),title(’x’),grid
x1 x2
1 1

0.8 0.8

0.6 0.6

0.4 0.4

0.2 0.2

0 0
0 5 10 0 5 10 15 20

x
5

E2. Exercițiu:
0 5 10 15 20 25 30

Să se calculeze și să se reprezinte grafic (ca în exemplul precedent) produsul de


convoluție liniară a următoarei perechi de secvențe:
x1[n] = sin ( 0.1    n ) x2[n] =  [n − 5] pentru 0  n  20

1.1.3. Transformata Fourier discretă

Transformata Fourier în timp discret (DTFT – Discrete Time Fourier


Transform) a unei secvențe x[n] este dată de relația:

X (e j ) =  x[n]e − jn (2.8)


n

F
unde  este pulsația normată: .  = 2
FS
F este frecvența nenormată (exprimată în Hz) iar FS este frecvența de eșantionare.
F
Similar, frecvența normată este: f = .
FS
Funcția X (e j ) este periodică de perioadă 2 , deci este suficient să
cunoaștem comportarea sa în intervalul [− , ) (interval de bază). Datorită faptului
că această funcție este continuă, variabila  putând lua o infinitate de valori, nu este
posibilă o implementare pe o mașină de calcul.

7
1. SEMNALE ÎN TIMP DISCRET

Pentru a realiza totuși o analiză în frecvență se utilizează transformata Fourier


discretă TFD (DFT – Discret Fourier Transform), obținută prin discretizarea
variabilei  pe intervalul [0,2 ) în N puncte:

k
k = 2 , cu k = 0,1,, N − 1 .
N

Astfel, transformata Fourier discretă a unei secvențe x[n] este dată de relația:

2
−j
X [k ] =  x[n]e
kn
N
cu k = 0,1,, N − 1 (2.9)
n

X a ( j )

S S
− S  2max
2 2 Ω[rad/s]
-Ωmax 0 Ωmax F[Hz]
-Fmax 0 Fmax FS/2 FS


=
X ( e j )
FS
F
f =
FS


-π -ωmax 0 ωmax π 2π f
-0.5 -fmax 0 fmax 0.5 1

k
k = 0,..., N − 1 k = 2
X (k ) N

k
0 123 N/2 N-1

8
1. SEMNALE ÎN TIMP DISCRET

În figură sunt prezentate reprezentările spectrului unui semnal discret în


funcție de pulsație sau frecvență normată și corespondența cu frecvența analogică.
De asemenea se observă corespondența între componentele spectrale de indice k
calculate cu TFD și spectrul reprezentat în pulsații normate.

În Octave, pentru calculul transformatei Fourier discrete se folosește funcția fft.


Denumirea sa reprezintă prescurtarea de la Fast Fourier Transform (transformata
Fourier rapidă) și indică faptul că este folosit pentru calcul un algoritm rapid.

Sintaxe:
y = fft(x)
• dacă x este un vector se returnează un vector y de aceeași dimensiune cu vectorul
x ce conține valorile transformatei Fourier discrete aplicată elementelor vectorului
x; lungimea transformatei Fourier (numărul de puncte N în care se calculează
transformata) este egală în acest caz cu lungimea vectorului x.
• dacă x este o matrice se va returna matricea y de aceeași dimensiune cu matricea
x; coloana i din matricea y va conține valorile transformatei Fourier discrete
aplicată elementelor coloanei i din matricea x.

y = fft(x,N)
• aceleași considerente ca în sintaxa precedentă cu deosebirea că în acest caz se
specifică și numărul de puncte N în care se calculează transformata.

Exemple:
3. Să se calculeze transformata Fourier discretă a secvenței:
x1[n] = u[n] − u[n − 10] , pentru 0  n  20
Să se reprezinte grafic partea reală, partea imaginară, modulul și faza transformatei
Fourier discrete calculate.

x1=treapta(0,20,0)-treapta(0,20,10);
X=fft(x1);

figure(1),plot(X)
// se obține o reprezentare grafică fără semnificație, deoarece X este un vector cu valori complexe.
Octave nu va semnala acest lucru printr-o eroare, întrucât funcția plot poate primi un argument
complex și pentru acesta va afișa grafic partea imaginară în funcție de partea reală.

figure(1),subplot(121),plot(abs(X)),grid, title('|X| in
21 puncte')

9
1. SEMNALE ÎN TIMP DISCRET

// calculul transformatei Fourier discrete s-a efectuat într-un număr de puncte egal cu lungimea
vectorului x1 (vezi help fft în Command Window); pentru o mai bună reprezentare vom
efectua calculul într-un număr mai mare de puncte (N = 512)

X1=fft(x1,512);
subplot(122),plot(abs(X1)),grid, title('|X1| in 512
puncte')

// Ambele reprezentări corespund însă intervalului de frecvență [0,2 ) (pe abscisă


avem numărul de puncte în care s-a calculat transformata Fourier). De obicei se
dorește însă reprezentarea în intervalul de bază [− , ) al pulsației normate. Având
în vedere faptul că funcția este periodică de perioadă 2 , reprezentarea din
intervalul [− ,0) corespunde cu reprezentarea din intervalul [ ,2 ) . Prin urmare
trebuie realizată o inversare a celor două jumătăți ale vectorului X1. Acest lucru se
realizează în Octave prin utilizarea comenzii fftshift (schimbă între ele cele
două jumătăți ale unui vector). În plus, pentru a avea pe abscisă reprezentarea în
intervalul [− , ) trebuie generat un vector cu pas liniar care să conțină în intervalul
respectiv un număr de elemente egal cu lungimea transformatei Fourier discrete
calculate:
w=-pi:2*pi/512:pi-2*pi/512;
figure(2),plot(w,fftshift(abs(X1))),grid

10
1. SEMNALE ÎN TIMP DISCRET

// În figura 2 s-a reprezentat spectrul de amplitudini, iar în figura 3 se va reprezenta


spectrul de fază calculat cu ajutorul funcției angle().
figure(3),plot(w,fftshift(angle(X1))),grid

// În final putem reprezenta pârțile reală și imaginară ale TFD observându-se


simetria, respectiv antisimetria acestora.
figure(4)
subplot(2,1,1),plot(w,fftshift(real(X1))),grid
subplot(2,1,2),plot(w,fftshift(imag(X1))),grid

11
1. SEMNALE ÎN TIMP DISCRET

Observații:
• Reprezentarea spectrelor a fost făcută în funcție de pulsația normată
 [− , ) .
• Valorile calculate în X1=fft(x1,512) reprezintă spectrul calculat în
k
k = 2 , unde 𝑘 = 0,1, … , 𝑁 − 1. Astfel, numărul de puncte N în care se
N
calculează fft determină rezoluția spectrală. Cu cât N este mai mare, cu atât
aproximarea spectrului de frecvențe continue X (e j ) este mai bună.
• Dacă lungimea secvenței x[n] este mai mică decât N, secvența se completează
cu zerouri, spectrul calculat reprezentând convoluția între spectrul secvenței
de lungime infinită și spectrul funcției poartă de lungime egală cu a secvenței
date.
• Spectrul calculat cu funcția fft poate fi reprezentat și în funcție de
o indicele TFD: 𝑘 = 0,1, … , 𝑁 − 1.
𝐹 𝜔
o frecvența normată: 𝑓 = = , 𝑓 ∈ [−0.5 , 0.5).
𝐹𝑆 2𝜋
f = -0.5:1/N:0.5-1/N;
o frecvența nenormată 𝐹 = 𝑓 ∙ 𝐹𝑆 [𝐻𝑧] , 𝐹 ∈ [− 𝐹𝑆 ⁄2 , 𝐹𝑆 ⁄2).

Exemple:
4. a) Să se genereze secvența discretă 𝑠[𝑛] obținută prin eșantionarea cu= frecvența
de eșantionare 𝐹𝑠 = 8𝑘𝐻𝑧 a semnalului 𝑠(𝑡) = sin(2𝜋𝐹0 𝑡) de frecvenţă 𝐹0 =
500𝐻𝑧 şi durată 𝑡𝑀𝐴𝑋 = 40𝑚𝑠. Câte eşantioane are secvenţa discretă?
Fs = 8000; F0 = 500; t_max = 0.04;
t = 0:1/Fs:t_max-1/Fs;
s = sin(2*pi*F0*t);
12
1. SEMNALE ÎN TIMP DISCRET

No_samples = length(s); % sau: No_samples = t_max*Fs


// secvența 𝑠[𝑛] a rezultat ‘mergând’ cu pasul 𝑇𝑠 = 1⁄𝐹 pe durata a 𝑡𝑀𝐴𝑋 secunde.
𝑠

b) Să se calculeze TFD a secvenței în N=256 puncte cu funcția fft și să se


reprezinte spectrul de amplitudini (modulul TFD) în funcție de k=0:N-1.

N_fft = 256;
S = fft(s,N_ftt);
k = 0:N_fft-1;
figure(1),plot(k,abs(S))

𝑘1 𝑘2

// în Figura 1 se pot recunoaște 2 impulsuri Dirac, ceea ce ar putea corespunde


teoretic transformatei Fourier a unui sinus:
𝑖
ℱ{sin(𝜔0 𝑡)}(𝜔) = [𝛿(𝜔 + 𝜔0 ) − 𝛿(𝜔 − 𝜔0 )]
2
Se vor calcula așadar valorile de pulsație normată corespunzătoare celor 2 impulsuri
Dirac, știind ca reprezentarea corespunde perioadei [0, 2𝜋). Rezultă astfel indicii de
eșantionare a transformatei Fourier, 𝑘1 și 𝑘2 aferenți impulsurilor Dirac. Se observă
ușor din grafic că valorile calculate sunt corecte.
𝑘1 𝐹0 𝑁𝑓𝑓𝑡 𝐹0
𝜔𝑘1 = 2𝜋 = 𝜔0 = 2𝜋𝑓0 = 2𝜋 ⟹ 𝑘1 = = 16
𝑁𝑓𝑓𝑡 𝐹𝑠 𝐹𝑠
𝑘2 𝐹𝑠 − 𝐹0
𝜔𝑘2 = 2𝜋 = 2𝜋 − 𝜔0 = 2𝜋(1 − 𝑓0 ) = 2𝜋 ⟹
𝑁𝑓𝑓𝑡 𝐹𝑠
𝑁𝑓𝑓𝑡 (𝐹𝑠 − 𝐹0 )
𝑘2 = = 240
𝐹𝑠
c) Să se reprezinte spectrul de amplitudini în pulsații normate  [− , ) .

13
1. SEMNALE ÎN TIMP DISCRET

w = -pi: 2*pi/N_fft :pi-2*pi/N_fft;


figure(2),plot(w,fftshift(abs(S))),grid

// în Figura 2 este reprezentat spectrul de amplitudini în perioada de bază [−𝜋, 𝜋).


Se poate verifica (folosind lupa Zoom in) că valoarea de pulsație normată 𝜔0 =
2𝜋𝐹0 /𝐹𝑠 = 0.39 se regăsește pe grafic în dreptul impulsurilor Dirac.

d) Să se reprezinte spectrul de amplitudini în frecvențe normate f [−0.5,0.5)

f = -0.5: 1/N_fft :0.5-1/N_fft; % sau: f = w/(2*pi)


figure(3),plot(f,fftshift(abs(S))),grid

14
1. SEMNALE ÎN TIMP DISCRET

// în Figura 3, spectrul de amplitudini este reprezentat în funcție de frecvența normată


𝐹[𝐻𝑧]
𝑓= , astfel încât impulsurile unitate corespund valorii pe abscisă 𝑓0 = 0.0625.
𝐹𝑠
e) Să se reprezinte spectrul de amplitudini în frecvențe nenormate [Hz]

F = -Fs/2: Fs/N_fft :Fs/2-Fs/N_fft; %sau:F=w/(2*pi)*Fs


figure(4),plot(F,fftshift(abs(S))),grid

// în Figura 4, spectrul de amplitudini al semnalului sinusoidal este reprezentat direct


în funcție de frecvența nenormată, astfel încât impulsurile Dirac sunt poziționate
chiar pe frecvența 𝐹0 a sinusoidei.

f) Să se reprezinte cu subplot spectrul de amplitudini și de fază în funcție de frecvența


normată.

figure(5),subplot(211),plot(f,fftshift(abs(S))),grid
subplot(212),plot(f,fftshift(angle(S))),grid

15
1. SEMNALE ÎN TIMP DISCRET

g) Să se reprezinte cu subplot partea reală și partea imaginară în funcție de frecvența


normată.

figure(6),subplot(211),plot(f,fftshift(real(S))),grid
subplot(212),plot(f,fftshift(imag(S))),grid

Fiecare spectru va fi reprezentat într-o figură separată (funcția figure()). Graficul


va fi completat cu funcțiile: grid, title și xlabel.

16
1. SEMNALE ÎN TIMP DISCRET

E3. Exercițiu
1. Pentru programul de la exemplul anterior modificați pe rând următorii parametri
și explicați schimbările apărute în reprezentarea spectrului semnalului.
a) Frecvența semnalului F0 = 200Hz .
b) Numărul de puncte al TFD N=1024 (pentru semnalul inițial cu F0 = 500Hz ).

17

S-ar putea să vă placă și