Eliminación de ruido usando el filtro Butterworth digital de paso bajo en Scipy – Python

En este artículo, la tarea es escribir un programa de Python para la eliminación de ruido utilizando el filtro Butterworth digital de paso bajo.

¿Qué es el ruido?

El ruido es básicamente la parte no deseada de una señal electrónica. A menudo se genera debido a fallas en el diseño, conexiones sueltas, fallas en los interruptores, etc.

¿Qué hacer si tenemos ruido en nuestra señal?

Para eliminar señales/ruidos no deseados, utilizamos filtros de diferentes tipos y especificaciones. En general, en la industria, necesitamos elegir el mejor ajuste probándolo con la señal para identificar el mejor filtro que se utilizará para eliminar el ruido en un caso de uso determinado.

¿Qué vamos a hacer ahora?

Vamos a implementar un filtro Butterworth digital de paso bajo ahora para eliminar la señal/ruido no deseado de una combinación de ondas sinusoidales.

Especificaciones del filtro:

  • Señal compuesta por 25 Hz y 50 Hz
  • Frecuencia de muestreo 1kHz.
  • Ordene N=10 a 35Hz para eliminar el tono de 50Hz.

Paso a paso:

Paso 1: Importación de las bibliotecas

Python3

# import required library
import numpy as np
import scipy.signal as signal
import matplotlib.pyplot as plt

Paso 2: Definición de las especificaciones

Python3

# Specifications of the filter
f1 = 25  # Frequency of 1st signal
f2 = 50  # Frequency of 2nd signal
N = 10  # Order of the filter
  
  
# Generate the time vector of 1 sec duration
t = np.linspace(0, 1, 1000)  # Generate 1000 samples in 1 sec
  
# Generate the signal containing f1 and f2
sig = np.sin(2*np.pi*f1*t) + np.sin(2*np.pi*f2*t)

Paso 3: Trace la señal original con ruido

Python3

# Display the signal
fig, (ax1, ax2) = plt.subplots(2, 1, sharex=True)
ax1.plot(t, sig)
ax1.set_title('25 Hz and 50 Hz sinusoids')
ax1.axis([0, 1, -2, 2])
  
# Design the Butterworth filter using 
# signal.butter and output='sos'
sos = signal.butter(50, 35, 'lp', fs=1000, output='sos')

Producción:

Paso 4: Gráfico de la señal después de eliminar el ruido 

Python3

# Filter the signal by the filter using signal.sosfilt
# Use signal.sosfiltfilt to get output inphase with input
filtered = signal.sosfiltfilt(sos, sig)
  
  
# Display the output signal
ax2.plot(t, filtered)
ax2.set_title('After 35 Hz Low-pass filter')
ax2.axis([0, 1, -2, 2])
ax2.set_xlabel('Time [seconds]')
plt.tight_layout()
plt.show()

Producción:

Paso 5: Implementación

Python3

# import required library
import numpy as np
import scipy.signal as signal
import matplotlib.pyplot as plt
  
# Given
f1 = 25  # Frequency of 1st signal
f2 = 50  # Frequency of 2nd signal
N = 10  # Order of the filter
  
# Generate the time vector of 1 sec duration
# START CODE HERE ### (≈ 1 line of code)
# Generate 1000 samples in 1 sec
t = np.linspace(0, 1, 1000)
  
# Generate the signal containing f1 and f2
# START CODE HERE ### (≈ 1 line of code)
sig = np.sin(2*np.pi*f1*t) + np.sin(2*np.pi*f2*t)
  
# Display the signal
fig, (ax1, ax2) = plt.subplots(2, 1, sharex=True)
ax1.plot(t, sig)
ax1.set_title('25 Hz and 50 Hz sinusoids')
ax1.axis([0, 1, -2, 2])
  
# Design the Butterworth filter using signal.butter and output='sos'
# START CODE HERE ### (≈ 1 line of code)
sos = signal.butter(50, 35, 'lp', fs=1000, output='sos')
  
# Filter the signal by the filter using signal.sosfilt
# START CODE HERE ### (≈ 1 line of code)
# Use signal.sosfiltfilt to get output inphase with input
filtered = signal.sosfiltfilt(sos, sig)
  
  
# Display the output signal
ax2.plot(t, filtered)
ax2.set_title('After 35 Hz Low-pass filter')
ax2.axis([0, 1, -2, 2])
ax2.set_xlabel('Time [seconds]')
plt.tight_layout()
plt.show()

Producción:

Publicación traducida automáticamente

Artículo escrito por sagnikmukherjee2 y traducido por Barcelona Geeks. The original can be accessed here. Licence: CCBY-SA

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *