У мене є два спектри одного і того ж астрономічного об’єкта. Основне питання полягає в наступному: Як я можу обчислити відносний зсув між цими спектрами і отримати точну помилку на цьому зсуві?
Ще кілька деталей, якщо ти все ще зі мною. Кожен спектр буде масивом зі значенням x (довжина хвилі), значенням y (потік) та помилкою. Зсув довжини хвилі буде нижчим пікселем. Припустимо, що пікселі регулярно розташовані між собою і що буде лише один зсув довжини хвилі, застосований до всього спектру. Тож кінцева відповідь буде приблизно такою: 0,35 +/- 0,25 пікселів.
Два спектри будуть безліччю безхарактерного континууму, що визначається деякими досить складними характеристиками поглинання (опускання), які не моделюються легко (і не є періодичними). Я хотів би знайти метод, який безпосередньо порівнює два спектри.
Перший інстинкт кожного - це зробити перехресну кореляцію, але при зміні субпікселів вам доведеться інтерполювати між спектрами (спочатку згладжуючи?) - також помилки здаються неприємними, щоб виправитись.
Мій сучасний підхід полягає в згладжуванні даних шляхом з'єднання з гауссовим ядром, потім спланування згладженого результату та порівняння двох сплайнованих спектрів - але я не вірю цьому (особливо помилкам).
Хтось знає про спосіб зробити це правильно?
Ось коротка програма пітона, яка створить два іграшкових спектри, зміщені на 0,4 пікселя (виписані у toy1.ascii та toy2.ascii), з якими можна грати. Хоча ця модель іграшки використовує просту гауссову функцію, припустимо, що фактичні дані не можуть відповідати простої моделі.
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))