Saya memiliki dua spektrum objek astronomi yang sama. Pertanyaan penting adalah ini: Bagaimana saya bisa menghitung pergeseran relatif antara spektrum ini dan mendapatkan kesalahan akurat pada pergeseran itu?
Beberapa detail lagi jika Anda masih bersama saya. Setiap spektrum akan berupa array dengan nilai x (panjang gelombang), nilai y (fluks), dan kesalahan. Pergeseran panjang gelombang akan menjadi sub-pixel. Asumsikan bahwa piksel ditempatkan secara teratur dan hanya akan ada satu pergeseran panjang gelombang tunggal yang diterapkan ke seluruh spektrum. Jadi jawaban akhirnya akan seperti: 0,35 +/- 0,25 piksel.
Dua spektrum akan menjadi banyak kontinum tanpa ciri diselingi oleh beberapa fitur penyerapan yang agak rumit (dips) yang tidak mudah dimodelkan (dan tidak periodik). Saya ingin menemukan metode yang secara langsung membandingkan dua spektrum.
Insting pertama setiap orang adalah melakukan korelasi silang, tetapi dengan pergeseran subpixel, Anda harus melakukan interpolasi di antara spektrum (dengan menghaluskan terlebih dahulu?) - juga, kesalahan tampaknya tidak tepat untuk dilakukan dengan benar.
Pendekatan saya saat ini adalah memuluskan data dengan berbelit-belit dengan kernel gaussian, kemudian untuk spline hasil yang diperhalus, dan membandingkan dua spektrum splined - tapi saya tidak percaya itu (terutama kesalahan).
Adakah yang tahu cara melakukan ini dengan benar?
Berikut adalah program python pendek yang akan menghasilkan dua spektrum mainan yang digeser 0,4 piksel (ditulis dalam toy1.ascii dan toy2.ascii) yang dapat Anda mainkan. Meskipun model mainan ini menggunakan fitur gaussian sederhana, asumsikan bahwa data aktual tidak dapat cocok dengan model sederhana.
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))