Pratica FFT
Pratica FFT
Pratica FFT
DFT
Para
Dizimação no tempo
Conforme escolhido pelo professor o grupo ficou responsável por desenvolver a
função de dizimação no tempo,
A Equação acima que a TFD de N pontos pode ser computada pelo cálculo das
TFDs de pontos e em em vez de
como normalmente fazemos no caso das TFDs de pontos. A equação
anterior pode ser escrita então como:
Implementação MyDFT
function [Y]=MyDFT(X)
N=length(X);%identifica o tamanho do sinal
Wn = exp(-j*(2*pi/N));%Define o valor de Wn
Y = zeros(1,N);%inicia um vetor de zeros
%Constante Wn
Wn=exp((-2*pi*1i)/n);
w=1;
Xpar=MyFFT_DecTempo(par);
Yimpar=MyFFT_DecTempo(impar);
for i=1:(n/2)
X(i) = Xpar(i)+Yimpar(i)*w;
X(i+n/2)= Xpar(i) - Yimpar(i)*w;
w=w*Wn; %Armazena valores de Wn para cada operação.
end
end
end
Este código é uma implementação recursiva da dizimação no tempo, para cada
chamada da função, o vetor recebido é dividido em dois, um com índice par e outro
com impares, que são passados recursivamente para a função. O caso base ocorre
quando os vetores contem apenas um elemento. Durante esse processo são
calculadas as funções e .
Primeiro sinal
Dado um sinal com 2048 pontos, sendo 2048 não 2000 devido a função desenvolvida
trabalhar na potencia de base 2, o sinal é a soma de três senóides com frequências de
15Hz, 45Hz e 70Hz, executando a transformada de Fourier pelos dois métodos
desenvolvidos e pela função FFT do próprio MatLab, obtemos o seguinte resultado.
Segundo Sinal
Para a segunda parte foi criado um sinal, que é a soma de duas senóides uma com
frequência de 10Hz e outra com frequência de 25Hz, mas foi calculado para diversos
números de amostras e analisado as comparações da magnitude entre as funções, a
fase entre as funções e o tempo de execução das funções.
2 amostras:
4 amostras:
8 amostras:
16 amostras:
32 amostras:
64 amostras:
128 amostras:
256 amostras:
512 amostras:
1024 amostras:
2048 amostras:
Como observado nas figuras, um numero muito baixo de amostras retornam como
resultado valores que não permite a interpretação dos dados do sinal, se tornando
impossível identificar a frequência do sinal e a amplitude a cada frequência no sinal.
Comparação Comparação
Amostras MyFFT MyDFT FFT
MyFFtxFFT MyDFTxFFT
Resultados e Conclusão
Como é possível observar na tabela, o método MyDFT é mais simples mas demora
mais e requer mais custo computacional conforme aumenta o numero de amostras, a
função MyFFT, requer menos tempo na execução mas a FFT é a mais eficiente
comparada as outras funções.
Anexo
clc;
clear all;
close all;
N=2048;
fs=2048;
t=0:1/N:1-1/N;
vf=0:1:N-1;
X1=sin(2*pi*t*15);
X2=sin(2*pi*t*45);
X3=sin(2*pi*t*70);
X=X1+X2+X3;
Y1=fft(X);
Y2=MyDFT(X);
Y3=MyFFT_DecTempo(X);
F1=unwrap(angle(Y1));
F2=unwrap(angle(Y2));
F3=unwrap(angle(Y3));
figure
subplot(2,2,1);
plot (t,X);
xlabel('Tempo');ylabel('Amplitude');title('Sinal de Entrada');
subplot(2,2,2);
plot (vf,abs(Y1)/N,'b');
xlabel('Frequencia');ylabel('Magnitude');title('Transformada de
Fourier,FFT')
xlim([0 N-1]);
subplot(2,2,3);
plot (abs(Y2)/N,'r');
xlabel('Frequencia');ylabel('Magnitude');title('Transformada de
Fourier,MyDFT')
xlim([0 N-1]);
subplot(2,2,4);
plot (abs(Y3)/N,'g');
xlabel('Frequencia');ylabel('Magnitude');title('Transformada de
Fourier,MyFFT Dizimação no tempo')
xlim([0 N-1]);
figure
subplot(3,1,1);
plot (t,X);
xlabel('Tempo');ylabel('Amplitude');title('Sinal de Entrada');
subplot(3,1,2);
plot(vf,F1);
xlabel('Frequencia');ylabel('Fase');title('Resposta em Fase');
xlim([0 N-1]);
subplot(3,1,3);
hold on;
plot (vf,F1,'b');
plot (F2,'r');
plot (F3,'g');
xlabel('Frequencia');ylabel('Fase');title('Comparação Das Respostas em
Fase');
xlim([0 N-1]);
%% fase e frequencia
tempos=zeros(5,11);
vetor=zeros(1,11);
for i=1:1:11
N = 2^i;
vetor(i)=N;
vf=0:1:N-1;
fs=512;
t=0:1/fs:N/fs-(1/fs);
S1 = sin(2*pi*t*10);
S2 = sin(2*pi*t*25);
S = S1+S2;
tic;
Y1=fft(S);
tempos(1,i)=toc;
tic;
Y2=MyDFT(S);
tempos(2,i)=toc;
tic;
Y3=MyFFT_DecTempo(S);
tempos(3,i)=toc;
tempos(4,i)=erro(Y1,Y2);
tempos(5,i)=erro(Y1,Y3);
figure;
subplot(2,1,1);
plot (vf,abs(Y1)/N,'b');
hold on;
plot (vf,abs(Y2)/N,'r');
hold on;
plot (vf,abs(Y3)/N,'g');
xlim([0 N-1]);
xlabel('Frequencia');ylabel('Magnitude');title('Comparação Das
Respostas em Magnitude');
subplot(2,1,2);
plot (vf,unwrap(angle(Y1)),'b');
hold on;
plot (vf,unwrap(angle(Y2)),'r');
hold on;
plot (vf,unwrap(angle(Y3)),'g');
xlim([0 N-1]);
xlabel('Frequencia');ylabel('Fase');title('Comparação Das Respostas em
Fase');
end;
figure
plot(vetor,tempos(1,:),'b');
hold on;
plot(vetor,tempos(2,:),'r');
hold on;
plot(vetor,tempos(3,:),'g');
xlim([0 2048]);
xlabel('Numero de amostras');ylabel('Tempo');title('Comparação Do
Tempo de Execução');