Procesamiento de señales en Python
Picos, filtros y espectros sobre una serie muestreada.
import numpy as np
from scipy import signal
rng = np.random.default_rng(7)
t = np.linspace(0, 2, 400)
limpia = np.sin(2 * np.pi * 3 * t)
ruidosa = limpia + rng.normal(0, 0.4, size=t.size)
picos, props = signal.find_peaks(ruidosa, height=0.5, distance=20)
print(len(picos), props["peak_heights"][:3].round(2))
b, a = signal.butter(4, 0.1, btype="low")
suavizada = signal.filtfilt(b, a, ruidosa)
print(round(float(np.std(ruidosa - limpia)), 3),
round(float(np.std(suavizada - limpia)), 3))
frecs, potencia = signal.welch(ruidosa, fs=200, nperseg=128)
print(round(float(frecs[np.argmax(potencia)]), 1))
Cómo funciona
find_peaksacepta altura, distancia y prominencia.butterdiseña un filtro;filtfiltlo aplica sin desfase.detrendquita una tendencia lineal antes del análisis.
Palabras clave y builtins usados aquí
asfloatlenprintround
El intento, en números
- Líneas
- 18
- Caracteres a escribir
- 603
- Tokens
- 209
- Ritmo de tres estrellas
- 110 tpm
Al ritmo de tres estrellas de 110 tokens por minuto, este intento toma unos 114 segundos.
Paso 2 de 3 en Álgebra lineal y señales; paso 17 de 23 en Computación científica con SciPy.