J'ai deux spectres du même objet astronomique. La question essentielle est la suivante: comment puis-je calculer le décalage relatif entre ces spectres et obtenir une erreur précise sur ce décalage?
Encore plus de détails si vous êtes toujours avec moi. Chaque spectre sera un tableau avec une valeur x (longueur d'onde), une valeur y (flux) et une erreur. Le décalage de longueur d'onde va être sous-pixel. Supposons que les pixels soient régulièrement espacés et qu'il n'y aura qu'un seul décalage de longueur d'onde appliqué à l'ensemble du spectre. Ainsi, la réponse finale sera quelque chose comme: 0,35 +/- 0,25 pixels.
Les deux spectres vont être constitués d'un continuum sans particularité ponctué de quelques caractéristiques d'absorption plutôt compliquées (creux) qui ne se modélisent pas facilement (et ne sont pas périodiques). Je voudrais trouver une méthode qui compare directement les deux spectres.
Le premier réflexe de tout le monde est de faire une corrélation croisée, mais avec des changements de sous-pixels, vous devrez interpoler entre les spectres (en lissant d'abord?) - De plus, les erreurs semblent désagréables pour corriger.
Mon approche actuelle consiste à lisser les données en convoluant avec un noyau gaussien, puis à spliner le résultat lissé et à comparer les deux spectres splinés - mais je ne lui fais pas confiance (en particulier les erreurs).
Quelqu'un connaît-il un moyen de le faire correctement?
Voici un petit programme en python qui produira deux spectres de jouets décalés de 0,4 pixel (écrits en toy1.ascii et toy2.ascii) avec lesquels vous pourrez jouer. Même si ce modèle de jouet utilise une fonction gaussienne simple, supposons que les données réelles ne peuvent pas être adaptées à un modèle simple.
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))