Wie führe ich eine Gummibandkorrektur an spektroskopischen Daten durch?

8

Ich habe im Grunde verstanden, wie die Gummiband- / Grundlinienkorrektur funktioniert.

  1. Das gegebene Spektrum ist in (N) Bereiche unterteilt.
  2. Die niedrigsten Punkte in jedem Bereich werden bestimmt.
  3. Die anfängliche Grundlinie wird aus diesen Punkten aufgebaut.
  4. Jetzt werden alle Punkte im Spektrum durch die Differenz zwischen dem niedrigsten Punkt im aktuellen Bereich und dem niedrigsten Punkt auf der Grundlinie gezogen.

Es gibt jedoch einige Nuancen, mit denen ich nicht umgehen kann. Was ist beispielsweise, wenn einer der Punkte genau an der Grenze zwischen zwei Bereichen usw. liegt?

Außerdem muss ich nachweisen können, dass der Algorithmus, den ich schreibe, solide ist und von anderen Arbeiten oder wissenschaftlichen Arbeiten referenziert werden kann.

Wenn mir jemand einen Hinweis geben könnte, würde ich mich sehr freuen.

チ ー ズ パ ン
quelle
Oder vielleicht kennt jemand eine bessere oder ähnliche Methode, um eine Basislinie zu erkennen und zu korrigieren.
ン ー ズ パ

Antworten:

6

Dies kann leicht in Roder erfolgen Python. Es stehen gut getestete Funktionen zur Verfügung, sodass Sie sich keine Gedanken über Grenzen oder Nuancen machen müssen. Darüber hinaus sind beide kostenlos und bei Wissenschaftlern beliebt.

Lösung für R.

Für die Verarbeitung von Spektraldaten gibt es ein spezielles Paket namens hyperSpec . Dort ist die Gummiband-Grundlinienkorrektur bereits implementiert (Funktion spc.rubberband). Alle Details sind in der Dokumentation hervorgehoben. Die Verwendung ist ziemlich einfach:

require(hyperSpec)
spc <- read.spe("paracetamol.SPE")
baseline <- spc.rubberband(spc)

corrected <- spc - baseline

Geben Sie hier die Bildbeschreibung ein

Lösung für Python

Es gibt keine (nach meinem besten Wissen) sofort einsatzbereite Lösung für Python, aber Sie können die scipy.spatial.ConvexHullFunktion verwenden, um Indizes aller Punkte zu finden, die eine konvexe Hülle um Ihr Spektrum bilden. Angenommen, das Spektrum ist in xund yArrays enthalten:

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

Das Array venthält Indizes der Scheitelpunkte, die in CCW-Richtung angeordnet sind, z [892, 125, 93, 0, 4, 89, 701, 1023]. Wir müssen einen Teil extrahieren, der vaufsteigend ist, z. B. 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])

Jetzt wird die Grundlinie wie folgt korrigiert:

y = y - rubberband(x, y)
R Kiselev
quelle
Schöne Antwort und auch zweisprachig! :-)
Peter K.
1

Es kann viele Techniken geben. Ihre Idee scheint mir gut zu sein.

Zwei weitere Ideen:

  1. Machen Sie eine FFT Ihrer Daten und filtern Sie die niedrigsten Frequenzen heraus. Dies entfernt auch die Grundlinienmodulationen. Natürlich müssen Sie die richtige Filterbreite von Hand oder anhand einer fundierten Vermutung aus den Daten ermitteln.

  2. Verwenden Sie Kosinusfunktionen mit mehreren langen Wellenlängen und passen Sie Ihre Daten linear an. Sie können die Peaks auch über einen einfachen Filter oder durch Gewichtung der Datenpunkte mit ihrer Signalstärke entfernen.

M529
quelle
1

Lösung in Python mit Modpoly und Imodpoly Algorithmus.

Python-Bibliothek zur Basiskorrektur / -entfernung. Es verfügt über einen Modpoly- und einen IModploy-Algorithmus, der basiskorrigierte Ergebnisse zurückgeben kann, wenn Sie die ursprünglichen Werte als Python-Liste oder Pandas-Reihe eingeben und den Polynomgrad angeben. Installieren Sie die Bibliothek als pip install BaselineRemoval. Unten ist ein Beispiel

from BaselineRemoval import BaselineRemoval    
input_array=[10,20,1.5,5,2,9,99,25,47]
polynomial_degree=2

baseObj=BaselineRemoval(input_array,polynomial_degree)
Modpoly_output=baseObj.ModPoly()
Imodpoly_output=baseObj.IModPoly()

print('Original input:',input_array)
print('Modpoly base corrected values:',Modpoly_output)
print('IModPoly base corrected values:',Imodpoly_output)

Original input: [10, 20, 1.5, 5, 2, 9, 99, 25, 47]
Modpoly output: [-1.98455800e-04  1.61793368e+01  1.08455179e+00  5.21544654e+00
  7.20210508e-02  2.15427531e+00  8.44622093e+01 -4.17691125e-03
  8.75511661e+00]
Imodpoly output: [-0.84912125 15.13786196 -0.11351367  3.89675187 -1.33134142  0.70220645
 82.99739548 -1.44577432  7.37269705]
Enthusiast
quelle
0

[EDIT 2018/03/24] Seit der Antwort wurden mehrere Verwendungen von Spektraldaten aufgezeichnet

Wenn Ihre spektralen Peaks relativ fein und oberhalb einer Basislinie mit einem niederfrequenteren Verhalten fast positiv sind, empfehle ich, BEADS (Baseline Estimation And Denoising w / Sparsity) , einen Algorithmus, der auf der Sparsity der Daten und basiert, auszuprobieren soome seiner Derivate. Es funktioniert gut mit chromatographischen Daten. Matlab-Code ist verfügbar , und auf der BEADS-Seite werden R- oder C ++ - Codes sowie bekannte Verwendungen erfasst . Hier finden Sie Anwendungen für Raman-Spektren, astronomisches hyperspektrales Galaxienspektrum, Röntgenabsorptionsspektroskopie (XAS), Röntgenbeugung (XRD) und kombinierte XAS / XRD-Messungen.

Chromatographie mit simulierter Grundlinie

Grundlinie und Rauschen korrigiert

Laurent Duval
quelle