terça-feira, 20 de setembro de 2022

Densidade Espectral de Potência

 A energia $E_X$ de um sinal com energia finita pode ser calculada por:

\[  E_X = \int_{-\infty}^{+\infty} |x(t)|^2 dt \]

sendo $x(t)$ um sinal aleatório ou determinístico que varia no tempo. A densidade espectral de potência $S_X$ indica como a energia de uma sinal está distribuída ao longo do eixo de frequência e pode ser calculada por:

\[  S_X = \int_{-\infty}^{+\infty} R_X(\tau) e^{-j2\pi f \tau} d\tau \]

onde $R_X(\tau)$ é função de autocorrelação de um processo $x(t)$ estacionário no sentido amplo. Essa definição de densidade espectral de energia requer que a transformada de Fourier exista, ou seja, que a integral quadrada seja calculável. Para um sinal binário aleatório (amplitude $+A$, $-A$), a função de autocorrelação é 

\[ R_X(\tau) = \left\{\begin{matrix}
 A^2(1-|\tau|/T) & |\tau| < T\\
 0 & |\tau| \geqslant  T
\end{matrix}\right. \]

e a densidade espectral de potência é neste caso:

\[  S_X(f) = A^2 T sinc^2(fT)  \]

Abaixo temos um exemplo de código Scilab que explora esses conceitos. O sinal gerado é um sinal binário aleatório com amplitude $\pm 1$.

Código Scilab:

 //// Aula de 20/09/2022

close; close; close; close; clc;

N = 10000;  ///bits
tb = 10;
p1 = ones(1,tb);
x = [];
b = sign(rand(1,N,'n'));  ///+1-1

for k=1:N
  x = [x, b(k)*p1]  ;
end

subplot(2,2,1); plot(x(1:200)*1.01);
title('Sinal binário'); xgrid;

Rx = xcorr(x); /// autocorrelação
M = round(max(size(Rx))/2);
subplot(2,2,2); plot(Rx(M-199:M+199));
title('Autocorrelação');

Sx = abs(fft(x));
Sx = Sx.*Sx;
subplot(2,2,3); plot(Sx(1:round(M/2)));

SxR = abs(fft(Rx));
SxR = log10(SxR + 1e-6);
subplot(2,2,4); plot(SxR(1:M));

//////////////////////////////

ruido = 0.35*rand(x,'n');
x = x + ruido;
figure;
subplot(2,2,1); plot(x(1:200)*1.01); title('Sinal binário');

Rx = xcorr(x);
M = round(max(size(Rx))/2);
subplot(2,2,2); plot(Rx(M-199:M+199)); title('Autocorrelação');

Sx = abs(fft(x));
Sx = Sx.*Sx;
subplot(2,2,3); plot(Sx(1:round(M/2)));

SxR = abs(fft(Rx));
subplot(2,2,4); plot(SxR(1:M));

/////////////////
h = convol([0.2 0.4 0.5 0.5 0.4 0.2],[0.3 0.5 0.3]);
h = h/sum(h);

x = filter(h,1,x);

figure;
subplot(2,2,1); plot(x(1:200)*1.01); title('Sinal binário');

Rx = xcorr(x);
M = round(max(size(Rx))/2);
subplot(2,2,2); plot(Rx(M-199:M+199)); title('Autocorrelação');

Sx = abs(fft(x));
Sx = Sx.*Sx;
subplot(2,2,3); plot(Sx(1:round(M/2)));

SxR = abs(fft(Rx));
subplot(2,2,4); plot(SxR(1:M)); 

Exemplo de saída (sinal com ruído):



Nenhum comentário:

Postar um comentário