Processamento Digital de Sinais

Prof. Eduardo Parente Ribeiro


Laboratório - 05/09/2000
 

Resolução em frequência

O objetivo deste tópico é visualizar a resolução em frequência da DFT (fft) do sinal em função do numero de amostras presentes no sinal. Um recurso comumente utilizado para "aumentar"  a resolução em frequência é o simples preenchimento com zeros da sequência. Como isto funciona ?

Imagine um sinal composto por duas senoides de frequências muito próximas: 0.4pi  e 0.44pi.
» n1=0:63;
» x1=sin(0.4*pi*n1)+sin(0.44*pi*n1);
» plot(x1)

Perceba o batimento que ocorre (envoltoria) devido às duas frequências serem muito próximas.

Agora vamos observar a FFT:
» X1=fft(x1);
» plot(abs(X1))

O que representam estes dois picos ? Serão eles os representantes das duas frequências ?
Certamente não. Como a fft mostra o intervalo que seria de 0 a 2pi, o segundo pico (entre pi e 2pi) na verdade representa a frequência negativa (entre -pi e 0).
A duas frequências estão tão próximas que não conseguimos diferencia-las. Isto acontece porque no eixo das frequências [k] temos apenas 64 pontos, pois o sinal original continha apenas 64 amostras. Vamos supor que o sinal original foi observado durante um tempo maior que possibilitou a coleta de 256 amostras, e num terceiro cenário, 1024 amostras:
 
» n2=0:255;
» x2=sin(0.4*pi*n2)+sin(0.44*pi*n2);
» plot(x2)
» n3=0:1023;
» x3=sin(0.4*pi*n3)+sin(0.44*pi*n3);
» plot(x3)

Agora vamos visualizar suas respectivas FFT's:

Conclusão, quanto maior o tempo de observação do sinal, maior será o numero de amostras e menor será a resolução em frequência. Mais precisamente o espaçamento entre cada ponto em frequência (bin) é sempre igual a 1/T onde T é a duração do sinal.

Mas será que mesmo com poucos pontos não seria possível "melhorar" a qualidade do gráfico da FFT e conseguir distinguir entre as duas frequências?
A resposta é sim.
Vamos experimentar completar as sequências com zeros:
» x1z=[x1 zeros(1,256-64)];

Agora vamos visualizar o espectro:
X1Z=fft(x1z);
plot(abs(X1Z));

Que interessante, já conseguimos perceber que cada pico não é único.
Então, vamos colocar mais zeros, completando até 1024:
x1zzz=[x1 zeros(1,1024-64)];
X1ZZZ=fft(x1zzz);
plot(abs(X1ZZZ))

Melhorou um pouco, mas não muito. Por que? Pense a respeito.

. . .
 
 
 
 

Trata-se do problema do janelamento.
Uma possível linha de raciocínio é a seguinte: Inicialmente nos tempos apenas 64 amostras, significa que o sinal original que ia de menos infinito até mais infinito foi multiplicado por uma função que vale zero em todos os pontos exceto entre 0 e 63. Ou seja uma janela quadrada. Pelo teorema da convolução, a Transformada de Fourier deste produto equivale a convolução da Transformada de cada um dos fatores. A transformada do sinal original corresponde a dois picos perfeitos, isto é, funções impulsos, em cada metade do gráfico (num total de 4). A Transformada da função janela quadrada corresponde a função sinc=sen(w.n)/(pi.n). Portanto, mesmo que acrescentássemos mais infinitos zeros o resultado seria não os picos puros, mas sim a convolução dos picos com a função sinc. Quando nós visualizamos a FFT com apenas 64 pontos, não "percebemos" os outros pontos vizinhos. Mas a medida que acrescentamos zeros ao final do sinal, em nada estamos alterando em relação a condição inicial (sinal janelado com janela quadrada de tamanho 64), apenas "permitindo" que com mais amostras (mesmo sendo todas elas zero), a FFT tenha mais amostras e mostre o restante do gráfico que estava "escondido".
E se em vez da janelas quadrada nós usássemos a janela de hamming.
x1h=x1.*hamming(64)';
plot(n1,x1,x1,x1h)
legend('hamm','quad')

Complete com zero e verifique a FFT:
x1hz=[x1h zeros(1,256-64)];
X1HZ=fft(x1hz);
plot(abs(X1HZ))

Cá entre nós, não ficou mais bonito? Claramente se pode dizer que existem duas senoides presentes no sinal.
 
 
 
 
 

Modulação e Demodulação

Imagine que o sinal x, representa a informação a ser transmitida, no nosso exemplo uma função gaussiana.
n=0:63;
nn=n/64*4-2;
x=exp(-nn.^2);
X=fft(x);
plot(x);
plot(abs(fftshift(X)))

Agora vamos arrumar uma portadora cossenoidal e modular nosso sinal:
c=cos(0.4*pi*n);
xm=x.*c;
plot(xm)

E o espectro do sinal modulado:
XM=fft(xm)
plot(abs(XM)

Agora, vamos supor que este sinal chegou no receptor e desejamos demodulá-lo. Como fazer?
....

Uma maneira é multiplica-lo por um cosseno com a mesma frequência da portadora e depois passar o resultado por um filtro passa baixo. Qual a frequência de corte?
Sugestão: visualize o espectro do sinal demodulado.

Voce seria capaz de fazer a demodulação e obter a informação transmitida abaixo?

Bom proveito do laboratório.
Bom feriado.

Prof. Eduardo.