Tôi có hai quang phổ của cùng một đối tượng thiên văn. Câu hỏi thiết yếu là đây: Làm thế nào tôi có thể tính được sự dịch chuyển tương đối giữa các quang phổ này và nhận được một lỗi chính xác trên sự dịch chuyển đó?
Một số chi tiết nếu bạn vẫn còn với tôi. Mỗi phổ sẽ là một mảng có giá trị x (bước sóng), giá trị y (thông lượng) và lỗi. Sự thay đổi bước sóng sẽ là pixel phụ. Giả sử rằng các pixel thường xuyên cách nhau và sẽ chỉ có một bước sóng duy nhất được áp dụng cho toàn bộ phổ. Vì vậy, câu trả lời cuối cùng sẽ là một cái gì đó như: 0,35 +/- 0,25 pixel.
Hai quang phổ sẽ có rất nhiều liên tục không có dấu chấm câu bởi một số tính năng hấp thụ khá phức tạp (dips) không dễ dàng mô hình hóa (và không định kỳ). Tôi muốn tìm một phương pháp so sánh trực tiếp hai phổ.
Bản năng đầu tiên của mọi người là thực hiện một mối tương quan chéo, nhưng với các thay đổi subpixel, bạn sẽ phải nội suy giữa các quang phổ (bằng cách làm mịn trước?) - cũng có thể, các lỗi có vẻ khó chịu.
Cách tiếp cận hiện tại của tôi là làm mịn dữ liệu bằng cách kết hợp với hạt nhân gaussian, sau đó chia nhỏ kết quả được làm mịn và so sánh hai phổ được tách - nhưng tôi không tin tưởng nó (đặc biệt là các lỗi).
Có ai biết một cách để làm điều này đúng?
Dưới đây là một chương trình python ngắn sẽ tạo ra hai phổ đồ chơi được dịch chuyển 0,4 pixel (được viết bằng toy1.ascii và toy2.ascii) mà bạn có thể chơi cùng. Mặc dù mô hình đồ chơi này sử dụng tính năng gaussian đơn giản, giả sử rằng dữ liệu thực tế không thể phù hợp với một mô hình đơn giản.
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))