La biblioteca SciPy es un recurso poderoso para la computación científica, y su módulo scipy.signal
proporciona herramientas completas para el procesamiento de señales. El filtrado es un aspecto fundamental del procesamiento de señales, y los filtros de Butterworth se emplean con frecuencia debido a su respuesta de magnitud máximamente plana en la banda de paso. Este artículo profundiza en la función scipy.signal.butter
, una herramienta clave para diseñar estos filtros dentro de SciPy.
Tabla de contenido
- Comprensión de los filtros de Butterworth
- Uso de
scipy.signal.butter
- Ejemplo: Diseño de un filtro de Butterworth de paso bajo
- Ejemplo: Aplicación del filtro y visualización
- Conclusión
Comprensión de los filtros de Butterworth
Los filtros de Butterworth son conocidos por su respuesta de magnitud máximamente plana dentro de la banda de paso. Esta característica asegura una distorsión mínima de la señal en el rango de frecuencia deseado. Sin embargo, esta planitud tiene el costo de una caída relativamente gradual en la banda de supresión (el rango de frecuencia donde el filtro atenúa la señal). Para lograr una caída más pronunciada, se necesita un orden de filtro más alto.
Uso de scipy.signal.butter
La función scipy.signal.butter
es la herramienta principal para diseñar filtros de Butterworth en SciPy. Sus parámetros clave son:
N
: El orden del filtro. Órdenes más altos producen una caída más pronunciada, pero aumentan la complejidad y la posible inestabilidad.Wn
: La frecuencia de corte (o frecuencias para filtros de paso de banda y paso de banda detenido), normalizada a la frecuencia de Nyquist (la mitad de la frecuencia de muestreo). Un valor de 0.5 representa la mitad de la frecuencia de muestreo.btype
: El tipo de filtro: ‘lowpass’, ‘highpass’, ‘bandpass’ o ‘bandstop’.analog
:True
diseña un filtro analógico;False
(predeterminado) diseña un filtro digital.output
: Especifica el formato de salida. ‘ba’ (coeficientes del numerador y el denominador) y ‘sos’ (secciones de segundo orden) son opciones comunes. ‘sos’ generalmente se prefiere para la estabilidad numérica, especialmente con filtros de orden superior.
Ejemplo: Diseño de un filtro de Butterworth de paso bajo
Diseñemos un filtro de Butterworth de paso bajo de cuarto orden con una frecuencia de corte de 10 Hz, asumiendo una frecuencia de muestreo de 100 Hz:
import numpy as np
from scipy import signal
import matplotlib.pyplot as plt
# Frecuencia de muestreo
fs = 100 # Hz
# Frecuencia de corte (normalizada)
cutoff = 10 / (fs / 2) # Normalizar a la frecuencia de Nyquist
# Orden del filtro
order = 4
# Diseñar el filtro usando SOS para estabilidad
sos = signal.butter(order, cutoff, btype='lowpass', analog=False, output='sos')
#Imprimir SOS
print("Secciones de segundo orden (sos):", sos)
Ejemplo: Aplicación del filtro y visualización
Para aplicar el filtro y visualizar los resultados:
# Señal de ejemplo
t = np.linspace(0, 1, fs, endpoint=False)
sig = np.sin(2 * np.pi * 20 * t) + np.sin(2 * np.pi * 5 * t)
# Aplicar el filtro
filtered_sig = signal.sosfilt(sos, sig)
# Graficar la señal original y la señal filtrada
plt.figure(figsize=(10, 6))
plt.plot(t, sig, label='Señal Original')
plt.plot(t, filtered_sig, label='Señal Filtrada')
plt.xlabel('Tiempo (s)')
plt.ylabel('Amplitud')
plt.title('Señal Original vs. Señal Filtrada')
plt.legend()
plt.grid(True)
plt.show()
Conclusión
scipy.signal.butter
es una herramienta poderosa para diseñar filtros de Butterworth. Comprender sus parámetros y utilizar la salida ‘sos’ para la estabilidad numérica son cruciales para un diseño de filtro eficaz en sus flujos de trabajo de procesamiento de señales. Recuerde normalizar las frecuencias de corte a la frecuencia de Nyquist. La visualización de las respuestas del filtro usando Matplotlib mejora la comprensión y permite el análisis del rendimiento.