Ich habe zwei Spektren desselben astronomischen Objekts. Die wesentliche Frage lautet: Wie kann ich die relative Verschiebung zwischen diesen Spektren berechnen und einen genauen Fehler bei dieser Verschiebung erhalten?
Noch ein paar Details, wenn du noch bei mir bist. Jedes Spektrum ist ein Array mit einem x-Wert (Wellenlänge), einem y-Wert (Fluss) und einem Fehler. Die Wellenlängenverschiebung wird ein Subpixel sein. Angenommen, die Pixel sind regelmäßig beabstandet und es wird nur eine einzige Wellenlängenverschiebung auf das gesamte Spektrum angewendet. Die Endantwort lautet also ungefähr: 0,35 +/- 0,25 Pixel.
Die beiden Spektren werden eine Menge merkwürdiges Kontinuum sein, das durch einige ziemlich komplizierte Absorptionsmerkmale (Einbrüche) unterbrochen wird, die sich nicht leicht modellieren lassen (und nicht periodisch sind). Ich möchte eine Methode finden, die die beiden Spektren direkt vergleicht.
Der erste Instinkt eines jeden besteht darin, eine Kreuzkorrelation durchzuführen, aber bei Subpixel-Verschiebungen müssen Sie zwischen den Spektren interpolieren (indem Sie zuerst glätten?) - auch Fehler scheinen böse zu sein, um richtig zu werden.
Mein aktueller Ansatz besteht darin, die Daten zu glätten, indem ich sie mit einem Gaußschen Kernel falte, dann das geglättete Ergebnis zu spalten und die beiden Spline-Spektren zu vergleichen - aber ich vertraue ihm nicht (insbesondere den Fehlern).
Kennt jemand einen Weg, dies richtig zu machen?
Hier ist ein kurzes Python-Programm, das zwei Spielzeugspektren erzeugt, die um 0,4 Pixel verschoben sind (geschrieben in toy1.ascii und toy2.ascii), mit denen Sie spielen können. Obwohl dieses Spielzeugmodell eine einfache Gauß-Funktion verwendet, wird davon ausgegangen, dass die tatsächlichen Daten nicht mit einem einfachen Modell übereinstimmen können.
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))