Laboratório - 05/09/2000
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.
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.