同じ天体の2つのスペクトルがあります。重要な質問はこれです:これらのスペクトル間の相対的なシフトを計算して、そのシフトで正確なエラーを取得するにはどうすればよいですか?
まだ私と一緒にいるなら、もう少し詳しく。各スペクトルは、x値(波長)、y値(光束)、および誤差を持つ配列になります。波長シフトはサブピクセルになります。ピクセルが等間隔に配置されており、スペクトル全体に適用される波長シフトが1つだけであると仮定します。したがって、最終的な答えは、0.35 +/- 0.25ピクセルのようなものになります。
2つのスペクトルは、簡単にモデル化できない(そして周期的ではない)かなり複雑な吸収特性(ディップ)によって区切られた、多くの特徴のない連続体になります。2つのスペクトルを直接比較する方法を見つけたいのですが。
すべての人の最初の本能は相互相関を行うことですが、サブピクセルシフトを使用すると、スペクトル間を補間する必要があります(最初にスムージングすることによって?)。また、エラーが正しくなるには厄介なようです。
私の現在のアプローチは、ガウスカーネルとのたたみ込みによってデータを平滑化し、平滑化された結果をスプライン化し、2つのスプライン化されたスペクトルを比較することですが、信頼できません(特にエラー)。
これを正しく行う方法を誰かが知っていますか?
これは、0.4ピクセルだけシフトされた2つのおもちゃのスペクトル(toy1.asciiおよびtoy2.asciiで書き出されます)を生成する短いpythonプログラムです。このおもちゃのモデルは単純なガウス機能を使用していますが、実際のデータは単純なモデルでは適合できないと想定しています。
import numpy as np
import random as ra
import scipy.signal as ss
arraysize = 1000
fluxlevel = 100.0
noise = 2.0
signal_std = 15.0
signal_depth = 40.0
gaussian = lambda x: np.exp(-(mu-x)**2/ (2 * signal_std))
mu = 500.1
np.savetxt('toy1.ascii', zip(np.arange(arraysize), np.array([ra.normalvariate(fluxlevel, noise) for x in range(arraysize)] - gaussian(np.arange(arraysize)) * signal_depth), np.ones(arraysize) * noise))
mu = 500.5
np.savetxt('toy2.ascii', zip(np.arange(arraysize), np.array([ra.normalvariate(fluxlevel, noise) for x in range(arraysize)] - gaussian(np.arange(arraysize)) * signal_depth), np.ones(arraysize) * noise))