Saltar al contenido principal

Cómo realizar procesamiento de señales utilizando SciPy.

Aquí tienes un tutorial paso a paso sobre cómo realizar procesamiento de señales utilizando SciPy.

Paso 1: Importar las bibliotecas requeridas

Para comenzar, necesitas importar las bibliotecas necesarias. En este caso, utilizaremos scipy.signal para las operaciones de procesamiento de señales y numpy para la manipulación de matrices.

import numpy as np
from scipy import signal

Paso 2: Crear una señal

A continuación, creemos una señal simple con la que trabajar. Para este tutorial, generaremos una señal sinusoidal.

# Definir los parámetros de la señal
frecuencia = 10 # Frecuencia de la señal en Hz
amplitud = 1 # Amplitud de la señal
tasa_muestreo = 100 # Número de muestras por segundo
duración = 1 # Duración de la señal en segundos

# Generar el eje de tiempo
t = np.linspace(0, duración, int(tasa_muestreo * duración), endpoint=False)

# Generar la señal sinusoidal
datos_señal = amplitud * np.sin(2 * np.pi * frecuencia * t)

Paso 3: Graficar la señal

Antes de comenzar a procesar la señal, visualicémosla utilizando matplotlib.

import matplotlib.pyplot as plt

plt.plot(t, datos_señal)
plt.xlabel('Tiempo (s)')
plt.ylabel('Amplitud')
plt.title('Señal')
plt.show()

Paso 4: Aplicar un filtro

Ahora, apliquemos un filtro paso bajo a la señal utilizando la biblioteca scipy.signal. Usaremos un filtro Butterworth como ejemplo.

# Definir los parámetros del filtro
frecuencia_corte = 5 # Frecuencia de corte en Hz
orden_filtro = 4 # Orden del filtro

# Crear el filtro Butterworth
b, a = signal.butter(orden_filtro, frecuencia_corte / (tasa_muestreo / 2), 'low')

# Aplicar el filtro a la señal
señal_filtrada = signal.lfilter(b, a, datos_señal)

Paso 5: Graficar la señal filtrada

Grafiquemos la señal filtrada para visualizar el efecto del filtro paso bajo.

plt.plot(t, datos_señal, label='Señal Original')
plt.plot(t, señal_filtrada, label='Señal Filtrada')
plt.xlabel('Tiempo (s)')
plt.ylabel('Amplitud')
plt.title('Señal con Filtro Paso Bajo')
plt.legend()
plt.show()

Paso 6: Realizar la Transformada de Fourier

Para analizar el contenido de frecuencia de la señal, podemos realizar una Transformada de Fourier utilizando el módulo scipy.fft.

# Realizar la Transformada de Fourier
espectro_señal = np.fft.fft(datos_señal)

# Generar el eje de frecuencia
frecuencias = np.fft.fftfreq(len(datos_señal), 1 / tasa_muestreo)

# Graficar el espectro
plt.plot(frecuencias, np.abs(espectro_señal))
plt.xlabel('Frecuencia (Hz)')
plt.ylabel('Magnitud')
plt.title('Espectro de la Señal')
plt.show()

Paso 7: Realizar el espectrograma

Por último, generemos un espectrograma de la señal utilizando el módulo scipy.signal.

# Definir los parámetros del espectrograma
tamaño_ventana = 256
superposición = int(tamaño_ventana * 0.75)

# Calcular el espectrograma
frecuencias, tiempos, espectrograma = signal.spectrogram(datos_señal, fs=tasa_muestreo, window='hann',
nperseg=tamaño_ventana, noverlap=superposición)

# Graficar el espectrograma
plt.pcolormesh(tiempos, frecuencias, 10 * np.log10(espectrograma), shading='auto')
plt.colorbar(label='Densidad Espectral de Potencia (dB/Hz)')
plt.xlabel('Tiempo (s)')
plt.ylabel('Frecuencia (Hz)')
plt.title('Espectrograma')
plt.show()

¡Eso es todo! Has realizado exitosamente el procesamiento de señales utilizando SciPy. Siéntete libre de explorar más funciones y técnicas proporcionadas por la biblioteca SciPy para tus necesidades específicas de procesamiento de señales.