SciPy señal.mantequilla

Anika Tabassum Era 15 febrero 2024
SciPy señal.mantequilla

SciPy, una biblioteca compacta de Python, emite algunos niveles significativos de algoritmos considerando optimización, estadísticas y muchos otros parámetros. El paquete signal de esta biblioteca se centra en funciones comunes relacionadas con el procesamiento de señales.

El filtro Butterworth es un tipo especial de filtro digital y es uno de los más comunes utilizados en el análisis de movimiento y circuitos de audio. Además, la documentación de las funciones bajo el paquete señal incluye la mantequilla que asegura el diseño del filtro IIR estilo Matlab.

Diseñar filtros manualmente es una tarea integral, y monitorear las respuestas después de aplicarlos es difícil.

Entonces, la biblioteca de Python se actualiza con funciones más intuitivas (tanto para señales digitales como analógicas) para imitar los casos manuales. El scipy.signal.butter es una adición de este tipo.

La siguiente sección cubrirá un ejemplo de un filtro de paso de banda Butterworth con scipy.signal.butter. Esto se refiere a tener una frecuencia de corte (lowcut, highcut); por lo tanto, el filtro solo aceptará una respuesta a distancia.

Por lo tanto, los valores máximos se descartan y se logra una frecuencia de señal plana comparativa con el mejor compromiso en atenuación y diferencia de fase.

Usa scipy.signal.butter en Python

En concreto, la función mantequilla toma globalmente 2 parámetros obligatorios. En primer lugar, se toma el orden, lo que implica tener la fuerza del filtro.

Cuanto mayor sea el orden, se espera el mejor nivel de producción. A continuación, el objeto similar a una matriz tiene la banda de paso y la frecuencia de la banda de parada.

La tasa de Nyquist tiene una contribución significativa para determinar la tasa de muestreo. Aparte de eso, existiría el problema del alias y, por lo tanto, el riesgo de perder datos importantes de frecuencia.

Este concepto se representa en el ejemplo de codificación en términos de algunas expresiones.

Técnicamente, la tarea es tomar una señal ruidosa. Filtre la frecuencia de rango esperada a través de la función mantequilla.

Y así, obtenemos las respuestas planas “sin ondulación” necesarias para nuestro caso específico. Saltemos al bloque de código para una mejor comprensión.

Fragmento de código:

from scipy.signal import butter, lfilter
import numpy as np
import matplotlib.pyplot as plt

Inicialmente, se realizan las importaciones. Hemos utilizado Google Colab para el editor de codificación.

El siguiente enlace lo redirigirá a la base de código principal.

A continuación, tendremos dos funciones definidas por el usuario. El primero calculará las frecuencias de corte y luego, a través de la función butter, devolverá el coeficiente de filtro (b, a).

Y la siguiente función tendrá la señal de entrada (la señal que requiere ser filtrada) y devolverá la señal filtrada (y). Veamos las clases.

def butter_bandpass(lowcut, highcut, fs, order):
    nyq = 0.5 * fs
    low = lowcut / nyq
    high = highcut / nyq
    b, a = butter(order, [low, high], btype="band")
    return b, a
def butter_bandpass_filter(x, lowcut, highcut, fs, order):
    b, a = butter_bandpass(lowcut, highcut, fs, order)
    y = lfilter(b, a, x)
    return y

En la siguiente etapa, generaremos una señal ruidosa aleatoria con una frecuencia, un período y la mayoría de los demás parámetros necesarios para desarrollar señales. Llamaremos a las funciones butter_bandpass() y butter_bandpass_filter() para filtrar la señal ruidosa.

def filtering():

    fs = 5000.0
    lowcut = 500.0
    highcut = 1000.0
    T = 0.05
    nsamples = int(T * fs)
    t = np.linspace(0, T, nsamples, endpoint=False)
    sig = np.sin(2 * np.pi * 2 * t)
    noise = 5 * np.random.randn(nsamples)
    x = sig + noise
    order = 5

    plt.figure(figsize=(10, 12))

    plt.subplot(3, 1, 1)
    plt.plot(t, x, "m", label="Noisy signal")
    plt.legend(loc="upper left")
    plt.grid(True)
    plt.axis("tight")

    y = butter_bandpass_filter(x, lowcut, highcut, fs, order)
    plt.subplot(3, 1, 2)
    plt.plot(t, y, "orange", label="Filtered signal")
    plt.xlabel("time (seconds)")
    plt.grid(True)
    plt.axis("tight")
    plt.legend(loc="upper left")

    plt.subplot(3, 1, 3)
    plt.plot(t, x, label="Noisy signal")
    plt.plot(t, y, label="Filtered signal")

    plt.show()


filtering()

Y los proyectos de salida:

  1. Gráfico de señal ruidosa (señal de entrada)

    señal.mantequilla 1

  2. Señal filtrada (después de aplicar el filtro Butterworth)

    señal.mantequilla 2

  3. Vista previa de la señal ruidosa y la señal filtrada juntas

    señal.mantequilla 3

Como en la última cerca de código, verá cómo usamos matplotlib para mostrar los resultados. En el primer gráfico (magenta), tenemos la señal ruidosa generada y, a partir de los valores del eje y, notará que los picos de la señal alcanzan más de 10 y -10.

En el segundo gráfico (naranja), verá que la señal filtrada tiene un límite de 6 a -6 en el eje vertical. Las medidas se basan en la ganancia y el rango de frecuencia general.

La gráfica final (azul y naranja) muestra cómo sucesivamente el filtro Butterworth funcionó en la señal de entrada. Esta trama es la versión fusionada de las dos tramas anteriores.

Anika Tabassum Era avatar Anika Tabassum Era avatar

Era is an observer who loves cracking the ambiguos barriers. An AI enthusiast to help others with the drive and develop a stronger community.

LinkedIn Facebook