Isso pode ser feito facilmente em R
ou Python
. Existem funções bem testadas disponíveis, para que você não precise se preocupar com limites ou nuances. Além disso, ambos são gratuitos e populares entre os cientistas.
Solução para R
Há um pacote especial para lidar com dados espectrais, chamado hyperSpec . A correção da linha de base do elástico já está implementada lá (função spc.rubberband
). Todos os detalhes estão destacados na documentação. O uso é bem simples:
require(hyperSpec)
spc <- read.spe("paracetamol.SPE")
baseline <- spc.rubberband(spc)
corrected <- spc - baseline
Solução para Python
Não existe (de acordo com o meu conhecimento) uma solução pronta para uso para python, mas você pode usar a scipy.spatial.ConvexHull
função para encontrar índices de todos os pontos que formam um casco convexo em torno de seu espectro. Suponha que o espectro esteja contido em x
e y
matrizes:
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
A matriz v
contém índices dos pontos do vértice, dispostos na direção anti-horário, por exemplo [892, 125, 93, 0, 4, 89, 701, 1023]
. Temos que extrair parte de onde v
está subindo, por exemplo, 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])
Agora a linha de base é corrigida assim:
y = y - rubberband(x, y)