分光データに対してラバーバンド補正を実行する方法は?


8

私は基本的に、ラバーバンド/ベースライン修正がどのように機能するかを理解しました。

  1. 与えられたスペクトルは(N)の範囲に分割されます。
  2. すべての範囲の最低点が決定されます。
  3. 最初のベースラインはこれらのポイントから構築されます。
  4. 現在、スペクトル上のすべてのポイントは、現在の範囲の最低ポイントとベースラインの最低ポイントの差によって描かれています。

ただし、扱い方がわからない微妙なニュアンスもあります。たとえば、ポイントの1つが2つの範囲の境界に正確にある場合などです。

さらに、私が書いているアルゴリズムが確かなものであり、他の研究や科学論文で参照できることを証明できる必要があります。

誰かが私にいくつかの参照を与えることができれば私はとても嬉しいでしょう。


あるいは、誰かがベースラインを検出および修正するためのより良いまたは同様の方法を知っているかもしれません。
チーズパン

回答:


6

これはRまたはで簡単に実行できますPython。十分にテストされた機能が利用できるので、境界やニュアンスを気にする必要はありません。さらに、どちらも無料で、科学者の間で人気があります。

Rのソリューション

hyperSpecと呼ばれる、スペクトルデータを処理する特別なパッケージがあります。ラバーバンドのベースライン補正はすでにそこに実装されています(関数spc.rubberband)。すべての詳細はドキュメントで強調表示されています。使い方はとても簡単です:

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

corrected <- spc - baseline

ここに画像の説明を入力してください

Pythonのソリューション

(私の知る限りでは)Pythonのすぐに使えるソリューションはありませんが、scipy.spatial.ConvexHull関数を使用して、スペクトルの周囲に凸包を形成するすべてのポイントのインデックスを見つけることができます。スペクトルがxand y配列に含まれていると仮定します。

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

配列にvは、CCW方向に配置された頂点ポイントのインデックスが含まれます[892, 125, 93, 0, 4, 89, 701, 1023]v昇順の部分、たとえば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])

これで、ベースラインは次のように修正されました。

y = y - rubberband(x, y)

いい答え、そしてバイリンガルも!:-)
Peter K.

1

多くのテクニックがあるかもしれません。あなたの考えは私には良いようです。

他の2つのアイデア:

  1. データのFFTを実行し、最低周波数を除外します。これにより、ベースライン変調も削除されます。確かに、手動で、またはデータからの推測に基づいて、正しいフィルター幅を見つける必要があります。

  2. 複数の長波長でコサイン関数を使用し、データに線形フィットを行います。単純なフィルターを使用するか、データポイントに信号強度を重み付けすることによって、ピークを破棄することもできます。


1

ModpolyおよびImodpolyアルゴリズムを使用したPythonでのソリューション。

ベースラインの修正/削除のためのPythonライブラリ。これにはModpolyおよびIModployアルゴリズムがあり、元の値をpythonリストまたはpandasシリーズとして入力し、多項式次数を指定すると、ベースラインを修正した結果を返すことができます。ライブラリをとしてインストールしますpip install BaselineRemoval。以下は例です

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]

0

[編集2018/03/24]回答以来、スペクトルデータのいくつかの用途が記録されています

スペクトルピークが比較的細かく、より低周波数の動作を伴うベースラインよりもほぼ正である場合、データのスパース性に基づくアルゴリズムであるBEADS(ベースライン推定とスパース性とノイズ除去)を試すことをお勧めします。その派生物のsoome。クロマトグラフデータでうまく機能します。Matlabコードが利用可能、BEADSページにはRまたはC ++コードと既知の使用法が集められています。ここでは、ラマンスペクトル、天文学的なハイパースペクトル銀河スペクトル、X線吸収分光法(XAS)、X線回折(XRD)、およびXAS / XRDの複合測定の用途を見つけることができます。

シミュレーションされたベースラインを使用したクロマトグラフィー

ベースラインとノイズを修正

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.