Eu tenho dois espectros do mesmo objeto astronômico. A questão essencial é a seguinte: como posso calcular a mudança relativa entre esses espectros e obter um erro preciso nessa mudança?
Mais alguns detalhes se você ainda estiver comigo. Cada espectro será uma matriz com um valor x (comprimento de onda), valor y (fluxo) e erro. O deslocamento do comprimento de onda será sub-pixel. Suponha que os pixels sejam espaçados regularmente e que haverá apenas uma única mudança de comprimento de onda aplicada a todo o espectro. Portanto, a resposta final será algo como: 0,35 +/- 0,25 pixels.
Os dois espectros terão um continuum sem característica pontuado por alguns recursos de absorção bastante complicados (quedas) que não modelam facilmente (e não são periódicos). Eu gostaria de encontrar um método que compare diretamente os dois espectros.
O primeiro instinto de todo mundo é fazer uma correlação cruzada, mas com as mudanças de subpixel, você terá que interpolar entre os espectros (suavizando primeiro?) - além disso, os erros parecem desagradáveis para acertar.
Minha abordagem atual é suavizar os dados convolvendo com um kernel gaussiano, depois estragar o resultado suavizado e comparar os dois espectros estriados - mas não confio neles (especialmente nos erros).
Alguém sabe uma maneira de fazer isso corretamente?
Aqui está um pequeno programa python que produzirá dois espectros de brinquedos com deslocamento de 0,4 pixels (gravados em toy1.ascii e toy2.ascii) com os quais você pode brincar. Mesmo que esse modelo de brinquedo use um recurso gaussiano simples, suponha que os dados reais não possam ser ajustados a um modelo simples.
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))