Esto se puede hacer fácilmente en R
o Python
. Hay funciones bien probadas disponibles, por lo que no tiene que preocuparse por los límites o matices. Además, ambos son gratuitos y populares entre los científicos.
Solución para R
Hay un paquete especial para manejar datos espectrales, llamado hyperSpec . La corrección de la línea base de la banda elástica ya está implementada allí (función spc.rubberband
). Todos los detalles están resaltados en la documentación. El uso es bastante simple:
require(hyperSpec)
spc <- read.spe("paracetamol.SPE")
baseline <- spc.rubberband(spc)
corrected <- spc - baseline
Solución para Python
No existe (según mi leal saber y entender) una solución lista para usar para python, pero puede usar la scipy.spatial.ConvexHull
función para encontrar índices de todos los puntos que forman un casco convexo alrededor de su espectro. Supongamos que el espectro está contenido x
y las y
matrices:
import numpy as np
from scipy.spatial import ConvexHull
def rubberband(x, y):
# Find the convex hull
v = ConvexHull(np.array(zip(x, y))).vertices
La matriz v
contiene índices de los puntos de vértice, dispuestos en la dirección CCW, por ejemplo [892, 125, 93, 0, 4, 89, 701, 1023]
. Tenemos que extraer la parte donde v
está ascendiendo, por ejemplo, 0-1023.
# Rotate convex hull vertices until they start from the lowest one
v = np.roll(v, -v.argmin())
# Leave only the ascending part
v = v[:v.argmax()]
# Create baseline using linear interpolation between vertices
return np.interp(x, x[v], y[v])
Ahora la línea de base se corrige así:
y = y - rubberband(x, y)