Transformada de Fourier é um dos conceitos mais aplicados no mundo da Ciência e Processamento de Sinal Digital, ela provê a representação do domínio de frequência do sinal original.
Por exemplo, dado um sinal sinusoidal no qual está no domínio de tempo, a Transformada de Fourier fornece as frequências de sinal constituintes. Utilizando a Transformada de Fourier, ambos sinais periódicos e não-periódicos podem ser transformados do domínio de tempo para o domínio de frequência.
O exemplo a seguir cria duas ondas senoidais e elas são adicionadas para criar um único sinal. Quando a Transformada de Fourier é aplicada para o sinal resultante, ela nos fornece os componentes de frequẽncia presentes na onda senoidal.
Primeiramente, iremos importar as bibliotecas necessárias:
import matplotlib.pyplot as plt
import numpy as np
Definimos quantos pontos de tempo são necessários (frequência de amostragem):
sampling_frequency = 100;
Calculamos em quais intervalos os pontos de tempo são amostrados:
sampling_interval = 1 / sampling_frequency
Definimos o período de tempo inicial dos sinais:
begin_time = 0
Definimos o período de tempo final dos sinais:
end_time = 10
Definimos a frequência dos sinais:
signal1_frequency = 4
signal2_frequency = 7
Calculamos os pontos de tempo:
time = np.arange(begin_time, end_time, sampling_interval)
Construímos duas ondas senoidais:
amplitude1 = np.sin(2 * np.pi * signal1_frequency * time)
amplitude2 = np.sin(2 * np.pi * signal2_frequency * time)
Plotamos a representação do domínio de tempo para a onda senoidal 1:
plt.figure(figsize=(19,5))
plt.title('Onda senoidal com frequência de 4 Hz')
plt.plot(time, amplitude1)
plt.xlabel('Tempo')
plt.ylabel('Amplitude');
Plotamos a representação do domínio de tempo para a onda senoidal 2:
plt.figure(figsize=(19,5))
plt.title('Onda senoidal com frequência de 7 Hz')
plt.plot(time, amplitude2)
plt.xlabel('Tempo')
plt.ylabel('Amplitude');
Adicionamos as ondas senoidais:
amplitude = amplitude1 + amplitude2
Plotamos a representação do domínio de tempo para a onda senoidal resultante:
plt.figure(figsize=(19,5))
plt.title('Onda senoidal com múltiplas frequências')
plt.plot(time, amplitude)
plt.xlabel('Tempo')
plt.ylabel('Amplitude');
Calculamos a representação do domínio de frequência:
fourier_transform = np.fft.fft(amplitude) / len(amplitude)
fourier_transform = fourier_transform[range(int(len(amplitude)/2))]
tp_count = len(amplitude)
values = np.arange(int(tp_count/2))
time_period = tp_count / sampling_frequency
frequencies = values / time_period
Plotamos a representação do domínio de frequência:
plt.figure(figsize=(19,5))
plt.title('Transformada de Fourier retratando os componentes de frequência')
plt.plot(frequencies, abs(fourier_transform))
plt.xlabel('Frequência')
plt.ylabel('Amplitude');