Você está na página 1de 10

Questão 1

Para a primeira questão foram calculadas a transformada discreta de Fourier de duas formas
distintas, uma utilizando a fórmula direta da DFT (Discrete Fourier Transform) e a outra pelo
cálculo da FFT (Fast Fourier Transform).
Para o cálculo da DFT, a fórmula utilizada é:
𝑁𝑁−1
−𝑗𝑗2𝜋𝜋𝜋𝜋𝜋𝜋
𝑋𝑋(𝑘𝑘) = � 𝑥𝑥(𝑛𝑛)𝑒𝑒 𝑁𝑁
𝑛𝑛=0

Para o cálculo do somatório, seguimos a seguinte lógica:


𝑋𝑋(𝑘𝑘) = 0

𝑋𝑋(𝑘𝑘) = 𝑥𝑥(𝑘𝑘) + 𝑥𝑥(0)𝑒𝑒 0 → 𝑋𝑋(𝑘𝑘) = 𝑥𝑥(0)


−𝑗𝑗2𝜋𝜋𝜋𝜋 −𝑗𝑗2𝜋𝜋𝜋𝜋
𝑋𝑋(𝑘𝑘) = 𝑥𝑥(𝑘𝑘) + 𝑥𝑥(1)𝑒𝑒 𝑁𝑁 → 𝑋𝑋(𝑘𝑘) = 𝑥𝑥(0) + 𝑥𝑥(1)𝑒𝑒 𝑁𝑁

−𝑗𝑗2𝜋𝜋𝜋𝜋2 −𝑗𝑗2𝜋𝜋𝜋𝜋 −𝑗𝑗2𝜋𝜋𝜋𝜋2


𝑋𝑋(𝑘𝑘) = 𝑥𝑥(𝑘𝑘) + 𝑥𝑥(2)𝑒𝑒 𝑁𝑁 → 𝑋𝑋(𝑘𝑘) = 𝑥𝑥(0) + 𝑥𝑥(1)𝑒𝑒 𝑁𝑁 + 𝑥𝑥(2)𝑒𝑒 𝑁𝑁

−𝑗𝑗2𝜋𝜋𝜋𝜋(𝑁𝑁−1) −𝑗𝑗2𝜋𝜋𝜋𝜋 −𝑗𝑗2𝜋𝜋𝜋𝜋2 −𝑗𝑗2𝜋𝜋𝜋𝜋(𝑁𝑁−1)


𝑋𝑋(𝑘𝑘) = 𝑥𝑥(𝑘𝑘) + 𝑥𝑥(𝑁𝑁 − 1)𝑒𝑒 𝑁𝑁 → 𝑋𝑋(𝑘𝑘) = 𝑥𝑥(0) + 𝑥𝑥(1)𝑒𝑒 𝑁𝑁 + 𝑥𝑥(2)𝑒𝑒 𝑁𝑁 +...+ 𝑥𝑥(𝑁𝑁 − 1)𝑒𝑒 𝑁𝑁

Desta forma podemos utilizar um “for” para o cálculo do somatório:


for N=0:tamx-1
Xdft(k+1) = Xdft(k+1) + x(N+1)*exp(-%i*2*%pi*N*k/tamx);
End

Onde a variável tamx representa o tamanho N e o array N representa as amostras n.


Desta forma conseguimos calcular cada amostra X(k), como devem ser calculadas N amostras
(k varia de 0 a N-1), então um outro “for” foi colocado para o cálculo dessas N amostras.
for k=0:tamx-1
for N=0:tamx-1
Xdft(k+1) = Xdft(k+1) + x(N+1)*exp(-%i*2*%pi*N*k/tamx);
end
end
A função completa da dft pode ser vista a seguir:
function Xdft=dft(x)
tamx=length(x);
Xdft=zeros(1,tamx);

for k=0:tamx-1
for N=0:tamx-1
Xdft(k+1) = Xdft(k+1) + x(N+1)*exp(-%i*2*%pi*N*k/tamx);
end
end
endfunction

Com o uso da função escrita para a DFT, podemos calcular a transformada discreta de Fourier
para os sinais dados na questão.
𝑛𝑛 𝑛𝑛
a) 𝑥𝑥[𝑛𝑛] = 2 cos �𝜋𝜋 𝑁𝑁� + sin2 �𝜋𝜋 𝑁𝑁�. Com 0 ≤ 𝑛𝑛 ≤ 9 e 𝑁𝑁 = 100.

Definimos primeiramente a variável 𝑛𝑛 para o primeiro exercício, como um vetor com valor
inicial igual a 0, valor final igual a 9 e incrementos de 1 em 1. A constante N igual a 100 e a função
x[n] dada na questão.
n1=0:1:9;
N=100;
x1=2*cos(%pi*n1/N)+(sin(%pi*n1/N))^2;

A partir da função escrita, é então calculada sua dft e sua fft, que retornam vetores de valores
complexos. A magnitude de tais valores complexos podem ser obtidos a partir do módulo de cada
componente. Após o cálculo da dft e da fft é feito o módulo deste sinal e após tal calculo são
plotados seus respectivos valores. Como o k, variável independente da transformada de Fourier
(𝑋𝑋(𝑘𝑘)) varia entre 0 e 𝑁𝑁 − 1, exatamente como o n, foi utilizado o n como eixo x para 𝑋𝑋(𝑘𝑘)
também.
Xf1=abs(dft(x1));
Xf12=abs(fft(x1));

subplot(2,1,1)
plot(n1,x1, '-o')
title('x[n]=2cos(pi*n/100)+(sin(pi*n/100))^2')
xgrid(2);

subplot(2,2,3)
plot(n1,Xf1, '-o')
title('X1[w] a partir da dft')
xgrid(2);

subplot(2,2,4)
plot(n1,Xf12, '-o')
title('X1[w] a partir da fft')
xgrid(2);
O gráfico gerado pode ser visto a seguir:
b) 𝑥𝑥[𝑛𝑛] = 𝑒𝑒 −2𝑛𝑛 . Com 0 ≤ 𝑛𝑛 ≤ 20
N2=0:1:20;
x2=%e^(-2*n2);
Xf2=abs(dft(x2));
Xf22=abs(fft(x2));

subplot(2,1,1)
plot(n2,x2, '-o')
e = gce();
e.children(1).polyline_style=3;
title('x[n]=e^(-2*n)')
xgrid(2);

subplot(2,2,3)
plot(n2,Xf2, '-o')
e = gce();
e.children(1).polyline_style=3;
title('X2[w] a partir da dft')
xgrid(2);

subplot(2,2,4)
plot(n2,Xf22, '-o')
e = gce();
e.children(1).polyline_style=3;
title('X2[w] a partir da fft')
xgrid(2);

O gráfico gerado pode ser visto a seguir:


c) 𝑥𝑥[𝑛𝑛] = 𝛿𝛿[𝑛𝑛 − 1] . Com 0 ≤ 𝑛𝑛 ≤ 20
n3=0:1:20;
x3=zeros(1,21);
x3(2)=1;
Xf3=round(abs(dft(x3)));
Xf32=round(abs(fft(x3)));

subplot(2,1,1)
plot(n3,x3, '-o')
e = gce();
e.children(1).polyline_style=3;
title('x[n]=delta(n-1)')
xgrid(2);

subplot(2,2,3)
plot(n3,Xf3, '-o')
e = gce();
e.children(1).polyline_style=3;
title('X3[w] a partir da dft')
xgrid(2);

subplot(2,2,4)
plot(n3,Xf32, '-o')
e = gce();
e.children(1).polyline_style=3;
title('X3[w] a partir da fft')
xgrid(2);

O gráfico gerado pode ser visto a seguir:


d)𝑥𝑥[𝑛𝑛] = 𝑛𝑛 . Com 0 ≤ 𝑛𝑛 ≤ 5
n4=0:1:5;
x4=n4;
Xf4=abs(dft(x4));
Xf42=abs(fft(x4));

subplot(2,1,1)
plot(n4,x4, '-o')
e = gce();
e.children(1).polyline_style=3;
title('x[n]=n')
xgrid(2);

subplot(2,2,3)
plot(n4,Xf4, '-o')
e = gce();
e.children(1).polyline_style=3;
title('X4[w] a partir da dft')
xgrid(2);

subplot(2,2,4)
plot(n4,Xf42, '-o')
e = gce();
e.children(1).polyline_style=3;
title('X4[w] a partir da fft')
xgrid(2);

O gráfico gerado pode ser visto a seguir:

Como podemos ver, o gráfico gerado a partir da DFT é igual ao gerado pela FFT em todos os
casos, sendo a FFT uma alternativa rápida para o cálculo de DFT’s.
Questão 2
Primeiramente devemos escrever as sequências no scilab, para isso determinamos o n das
duas primeiras sequencias, como 0 ≤ 𝑛𝑛 ≤ 2. Iniciamos o vetor com zeros e depois adicionamos os
valores em cada uma de suas amostras.
n=0:1:2;
N= length(n);

x1=zeros(1,N);
x1(1)=1;
x1(2)=-1;
x1(3)=-0.5;

x2=zeros(1, N);
x2(1)=1;
x2(2)=-0.5;
x2(3)=-1;

Para o cálculo da convolução, primeiramente foi utilizada a função convol(x1,x2), interna do


scilab. Após isso também foi reutilizada a função dft da questão anterior para o cálculo da
convolução a partir da DFT.
Temos que uma convolução no tempo, pode ser representada por uma multiplicação na
frequência. Portanto, ao aplicar a DFT nos dois sinais, multiplicar um pelo outro e aplicar a
transformada inversa IDFT, devemos encontrar o mesmo resultado da função convol. Mas para
isso, devemos lembrar que a DFT retorna um sinal com a N amostras, mesmo tamanho do sinal no
tempo, mas a convolução retorna uma sequência com N+M-1 amostras, onde N é a quantidade de
amostras da primeira sequência e M a quantidade de amostras da segunda sequência. Sendo assim,
devemos adicionar zeros a cada sequência, de tal forma que a sequência possua N+M-1 amostras.
Para a sequencia x1, devemos adicionar M-1 amostras, já para a sequencia x2, devemos
adicionar N-1 zeros.
A função para a IDFT é dada por:
𝑁𝑁−1
1 𝑗𝑗2𝜋𝜋𝜋𝜋𝜋𝜋
𝑥𝑥(𝑛𝑛) = � 𝑋𝑋(𝑘𝑘)𝑒𝑒 𝑁𝑁
N
𝑘𝑘=0

Esta equação pode ser escrita da seguinte forma:


function xdft=idft(X)
tamx=length(X);
xdft=zeros(1,tamx);

for k=0:tamx-1
for N=0:tamx-1
xdft(k+1) = xdft(k+1) + (1/tamx)*X(N+1)*exp(%i*2*%pi*N*k/tamx);

end
end
endfunction
A inicialização das variáveis pode ser vista a seguir:
n=0:1:2;
N=length(n);
M=length(n);

x1=zeros(1,N);
x1(1)=1;
x1(2)=-1;
x1(3)=-0.5;

x2=zeros(1,M);
x2(1)=1;
x2(2)=-0.5;
x2(3)=-1;

O cálculo da convolução a partir da função convol e da DFT também podem ser vistas a
seguir:
[y]=convol(x1,x2);

x1=[x1 zeros(1,M-1)];
x2=[x2 zeros(1,N-1)];
Xf1=dft(x1);
Xf2=dft(x2);
Xf3=Xf1.*Xf2;
x3=idft(Xf3);
n3=0:length(x1)-1;

subplot(2,1,1)
plot(n3,y, '-o')
title('convolução x1*x2')
xgrid(2);
e = gce();
e.children(1).polyline_style=3;

subplot(2,1,2)
plot(n3,x3, '-o')
title('convolução x1*x2 a partir da DFT')
xgrid(2);
e = gce();
e.children(1).polyline_style=3;
O gráfico obtido pode ser visto a seguir:

b)
Para a sequência 𝑥𝑥2 , foi pedido para escolher um valor para a amplitude a do sinal. Foi escolhido o
valor 3.
n1=0:1:4;
n2=0:1:1;
N=length(n1);
M=length(n2);

x1=zeros(1,N);
x1(1)=0;
x1(2)=0;
x1(3)=1;
x1(4)=1;
x1(5)=1;

x2=zeros(1,M);
a=3;
x2(1)=a;
x2(2)=a;

A partir dos sinais gerados, foi realizada a mesma operação feita na letra a desta questão.
[y]=convol(x1,x2);

x1=[x1 zeros(1,M-1)];
x2=[x2 zeros(1,N-1)];
Xf1=dft(x1);
Xf2=dft(x2);
Xf3=Xf1.*Xf2;
x3=idft(Xf3);
n3=0:(N+M-1)-1;
subplot(2,1,1)
plot(n3,y, '-o')
title('convolução x1*x2')
xgrid(2);
e = gce();
e.children(1).polyline_style=3;

subplot(2,1,2)
plot(n3,x3, '-o')
title('convolução x1*x2 a partir da DFT')
xgrid(2);
e = gce();
e.children(1).polyline_style=3;

O gráfico obtido pode ser visto a seguir:

Como podemos ver, os gráficos são iguais, comprovando assim que a convolução no tempo
pode ser representada pela multiplicação na frequência.

Você também pode gostar