Implementar filtro passa-baixo em Python
Um filtro passa-baixo é um termo que está entre os fundamentos do processamento de sinal e é usado com freqüência para filtrar sinais para obter resultados mais precisos.
Este tutorial discutirá o filtro passa-baixa e como criá-lo e implementá-lo em Python.
Um filtro passa-baixa é utilizado para passar um sinal que tem uma frequência inferior à frequência de corte, que mantém um determinado valor especificado pelo usuário. Todos os sinais com frequências maiores que a frequência de corte enfraquecidos.
Use Scipy
para criar um filtro Low-Pass Butterworth em Python
Em Python, podemos utilizar funções da biblioteca SciPy
para criar um filtro passa-baixo. SciPy
, abreviatura de Scientific Python, é uma biblioteca utilizada para fornecer funções que realizam processamento, otimização e estatísticas de sinais. Esta biblioteca também usa a biblioteca NumPy
por baixo.
Existem alguns filtros passa-baixa existentes no mundo real. No entanto, criaremos um filtro passa-baixa Butterworth em Python, pois ele tem uma frequência plana no máximo, o que significa que não há ondulações na banda passante. Isso o torna um dos filtros passa-baixa mais populares e usados.
Para implementar com sucesso este método em Python, primeiro precisaremos importar os módulos NumPy
, SciPy
e Matplotlib
para o código Python.
O código a seguir usa o módulo SciPy
para criar um filtro passa-baixo Butterworth em Python.
import numpy as np
from scipy.signal import butter, lfilter, freqz
import matplotlib.pyplot as plt
def butter_lowpass(cutoff, fs, order=5):
nyq = 0.5 * fs
normal_cutoff = cutoff / nyq
b, a = butter(order, normal_cutoff, btype="low", analog=False)
return b, a
def butter_lowpass_filter(data, cutoff, fs, order=5):
b, a = butter_lowpass(cutoff, fs, order=order)
y = lfilter(b, a, data)
return y
# Setting standard filter requirements.
order = 6
fs = 30.0
cutoff = 3.667
b, a = butter_lowpass(cutoff, fs, order)
# Plotting the frequency response.
w, h = freqz(b, a, worN=8000)
plt.subplot(2, 1, 1)
plt.plot(0.5 * fs * w / np.pi, np.abs(h), "b")
plt.plot(cutoff, 0.5 * np.sqrt(2), "ko")
plt.axvline(cutoff, color="k")
plt.xlim(0, 0.5 * fs)
plt.title("Lowpass Filter Frequency Response")
plt.xlabel("Frequency [Hz]")
plt.grid()
# Creating the data for filteration
T = 5.0 # value taken in seconds
n = int(T * fs) # indicates total samples
t = np.linspace(0, T, n, endpoint=False)
data = (
np.sin(1.2 * 2 * np.pi * t)
+ 1.5 * np.cos(9 * 2 * np.pi * t)
+ 0.5 * np.sin(12.0 * 2 * np.pi * t)
)
# Filtering and plotting
y = butter_lowpass_filter(data, cutoff, fs, order)
plt.subplot(2, 1, 2)
plt.plot(t, data, "b-", label="data")
plt.plot(t, y, "g-", linewidth=2, label="filtered data")
plt.xlabel("Time [sec]")
plt.grid()
plt.legend()
plt.subplots_adjust(hspace=0.35)
plt.show()
Vaibhhav is an IT professional who has a strong-hold in Python programming and various projects under his belt. He has an eagerness to discover new things and is a quick learner.
LinkedIn