Ho due spettri dello stesso oggetto astronomico. La domanda essenziale è questa: come posso calcolare lo spostamento relativo tra questi spettri e ottenere un errore preciso su tale spostamento?
Qualche dettaglio in più se sei ancora con me. Ogni spettro sarà un array con un valore x (lunghezza d'onda), un valore y (flusso) ed errore. Lo spostamento della lunghezza d'onda sarà sub-pixel. Supponiamo che i pixel siano spaziati regolarmente e che venga applicato un solo spostamento della lunghezza d'onda all'intero spettro. Quindi la risposta finale sarà simile a: 0,35 +/- 0,25 pixel.
I due spettri saranno molti continuum senza caratteristiche, punteggiati da alcune caratteristiche di assorbimento (avvallamenti) piuttosto complicate che non si modellano facilmente (e non sono periodiche). Vorrei trovare un metodo che confronta direttamente i due spettri.
Il primo istinto di tutti è quello di fare una correlazione incrociata, ma con i cambiamenti dei subpixel, dovrai interpolare tra gli spettri (livellando prima?) - inoltre, gli errori sembrano cattivi da correggere.
Il mio approccio attuale è di lisciare i dati contorcendomi con un kernel gaussiano, quindi di spline il risultato livellato e confrontare i due spettri scanalati - ma non mi fido di esso (specialmente gli errori).
Qualcuno sa un modo per farlo correttamente?
Ecco un breve programma Python che produrrà due spettri giocattolo che sono spostati di 0,4 pixel (scritti in toy1.ascii e toy2.ascii) con cui puoi giocare. Anche se questo modello di giocattolo utilizza una semplice funzione gaussiana, supponi che i dati effettivi non possano essere adattati a un modello semplice.
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))