1 - Introdução

Para um sinal [latex]x[n][/latex] discreto e aperiódico no tempo a Transformada Discreta de Fourier (TDF) será um sinal contínuo e periódico na frequência. Caso [latex]x[n][/latex] seja periódico, a TDF será um sinal discreto e periódico na frequência.

A TDF é dada por:

[latex] X(\omega )=\sum _{n=-\infty }^{\infty }x[n]\,e^{-i\omega n} [/latex]

Uma maneira eficiente de obter computacionalmente amostras da função [latex] X(\omega )[/latex] é utilizar o algoritmo chamado de Fast Fourier Transform (FFT).

2 - Octave

No Octave, para visualizar corretamente os dados retornados pela função fft() deve ser levado em consideração:

  • o número de pontos utilizados (quanto maior, melhor será a fidelidade das amostras da fft com a TDF);
  • a frequência na qual os pontos foram amostrados (para corresponder a frequência em Hz é necessário conhecer a frequência na qual os dados do sinal discreto foram obtidos);

Para facilitar, pode-se utilizar a seguinte função:

 
% Analisador de frequências (utilizando FFT)
%
% autor: Elias J.
% data: 29/01/2020
% fs = frquencia de amostragem
% x = sinal de entrada
% X = vetor da resposta em frequência de x
% freq = vetor de frequências
 
 
 
 
% Analisador de frequências (utilizando FFT)
%
% autor: Elias J.
% data: 23/07/2021
% fs = frquencia de amostragem
% x = sinal de entrada
% X = vetor da resposta em frequência de x
% freq = vetor de frequências
% use scale = true -> divide o vetor por 1/N (relação direta com a série de Fourier)
% use scale = false -> TDF
 
 
 
function [X, freq] = plot_fft (x, fs, scale=true, logscale=false, viewfase=false)
  
  N = length(x);  
  T = N/fs; % período
  freq = linspace(0,N,N)/T;
  fc = ceil(N/2); % para ajustar os dados do vetor
  if scale
    X = fftn(x)/N;  
    X = 2*X(1:fc);
  else
    X = fftn(x);  
    X = X(1:fc);
  end
  
  if viewfase % visualização da fase
    subplot(2,1,1)
  end 
  if logscale
    plot(freq(1:fc), 20*log10(abs(X*N)));
    ylabel('20log|X|')
  else
    plot(freq(1:fc), abs(X));
    ylabel('|X|')
  end
  title('Análise de Fourier')
  xlabel('freq (Hz)')
  grid on
  X = round(X*1000)/1000.0;
  if viewfase
    subplot(2,1,2)
    plot(freq(1:fc), atan2d(imag(X), real(X)),'.');
    ylabel('fase')
    xlabel('freq (Hz)')
    grid on 
  end 
  
end
 

3 - Resultados

3.1 - Sinal periódico

Considere o seguinte sinal

[latex] x[n] = 0.8cos(2\pi \cdot 100n) + 2sin(2\pi \cdot 100n) [/latex]

fs = 5000;
n = -100:1/fs:100;
 
x = 0.8*cos(2*pi*100*n) + 2*sin(2*pi*200*n);
 
figure
[X,f] = plot_fft(x,fs);
axis([0 500 0 max(abs(X))])

3.2 - Sinal aperiódico

Considere o seguinte sinal

[latex] x[n] = 10 \cdot sinc(2 \cdot 10n) [/latex]

fs = 500;
n = -100:1/fs:100;

x = 10*sinc(2*10*n);

figure
[X,f] = plot_fft(x,fs);
axis([0 15 0 max(abs(X))])

3.3 - Tempo de execução

Para medir o tempo de execução de uma determinada função basta usar os comandos tic e toc

tic
X = fftn(x)/N;
tempo_decorrido = toc

Dicas

Assista aos vídeos:

https://www.youtube.com/watch?v=uRnT6AGfgfU&list=PLYnNpzT-Y7kW8YCCOrsAl6qVfAKoL0YtC&index=22