เปรียบเทียบการเปลี่ยนแปลงพิกเซลย่อยระหว่างสเป็คตรัมสองครั้งโดยตรงและรับข้อผิดพลาดที่น่าเชื่อถือ


9

ฉันมีสเปกตรัมสองอันของวัตถุทางดาราศาสตร์เดียวกัน คำถามสำคัญคือ: ฉันจะคำนวณการเปลี่ยนแปลงสัมพัทธ์ระหว่าง spectra เหล่านี้และได้รับข้อผิดพลาดที่แม่นยำในการเปลี่ยนแปลงนั้นได้อย่างไร

รายละเอียดเพิ่มเติมถ้าคุณยังอยู่กับฉัน แต่ละสเปกตรัมจะเป็นอาร์เรย์ที่มีค่า x (ความยาวคลื่น), ค่า y (ฟลักซ์) และข้อผิดพลาด การเปลี่ยนความยาวคลื่นจะเป็นพิกเซลย่อย สมมติว่าระยะห่างของพิกเซลเป็นประจำและมีเพียงการเลื่อนความยาวคลื่นเดียวที่ใช้กับสเปกตรัมทั้งหมด ดังนั้นคำตอบสุดท้ายจะเป็นดังนี้: 0.35 +/- 0.25 พิกเซล

spectra ทั้งสองนั้นจะมีความต่อเนื่องที่ไม่มีรูปแบบมาแทนที่ด้วยคุณสมบัติการดูดซับที่ค่อนข้างซับซ้อน (dips) ที่ไม่ได้สร้างแบบจำลองได้ง่าย (และไม่ได้เป็นคาบ) ฉันต้องการหาวิธีที่เปรียบเทียบสเปกตรัมทั้งสองโดยตรง

สัญชาตญาณแรกของทุกคนคือการทำครอสสัมพันธ์ แต่ด้วยการเลื่อนพิกเซลย่อยคุณจะต้องสอดแทรกระหว่างสเปคตรัม

วิธีการปัจจุบันของฉันคือทำให้ข้อมูลราบรื่นขึ้นโดยใช้เคอร์เนลแบบเกาส์เซียนแล้วจึงทำให้ผลที่ได้เป็นไปอย่างราบรื่นและเปรียบเทียบสเปกตรัมสองอันที่แยกกัน - แต่ฉันไม่ไว้ใจ (โดยเฉพาะข้อผิดพลาด)

ไม่มีใครรู้วิธีที่จะทำอย่างถูกต้องหรือไม่

นี่คือโปรแกรมไพ ธ อนสั้น ๆ ที่จะสร้างสเปกตรัมของเล่นสองอันที่ถูกเลื่อนด้วย 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))

ถ้าฉันเข้าใจอย่างถูกต้องปัญหาเสียงคล้ายกับการลงทะเบียนภาพยกเว้นคุณเพียงแค่มีการเปลี่ยนแปลงพิกเซลย่อยเชิงเส้นในแกนเดียว อาจลองใช้เทคนิคการลงทะเบียนรูปภาพมาตรฐานเช่นความสัมพันธ์ของเฟสหรือไม่
พอลอาร์

หากคุณมีการหน่วงเวลาอย่างแท้จริงในสัญญาณเดียว (เช่นการเปลี่ยนแปลงในพารามิเตอร์ความยาวคลื่นที่คุณพูดถึง) คุณอาจสามารถใช้ประโยชน์จากคุณสมบัติการแปลงฟูริเยร์ที่เปลี่ยนการหน่วงเวลาเป็นออฟเซ็ตเชิงเส้นในโดเมนความถี่ สิ่งนี้สามารถใช้งานได้หากตัวอย่างทั้งสองไม่ได้รับความเสียหายจากสัญญาณรบกวนหรือการรบกวนที่แตกต่างกัน
Jason R

1
หัวข้อนี้อาจเป็นประโยชน์
Jim Clay

1
คุณมีข้อมูลจริงที่จะทดสอบหรือไม่? ค่าเสียงที่คุณให้นั้นมีค่ามากเกินไปสำหรับค่าความสัมพันธ์ไขว้ที่จะถูกต้องตัวอย่างย่อย นี่คือสิ่งที่พบกับสัญญาณรบกวนหลาย 2.0 และออฟเซ็ต 0.7 (= 1,000.7 บนแกน x ของพล็อต) ตัวอย่างเช่น: i.stack.imgur.com/UK5JD.png
endolith

คำตอบ:


5

ฉันคิดว่าการใช้การเชื่อมโยงข้ามและการประมาณค่าสูงสุดจะทำงานได้ดี ดังที่อธิบายไว้ในการสุ่มตัวอย่างก่อนขึ้นความสัมพันธ์ข้ามไร้ประโยชน์หรือไม่? การสอดแทรกหรือการยกตัวอย่างก่อนที่ความสัมพันธ์ข้ามจะไม่ทำให้คุณได้รับข้อมูลเพิ่มเติมอีก ข้อมูลเกี่ยวกับจุดสูงสุดตัวอย่างย่อยมีอยู่ในตัวอย่างรอบ ๆ คุณเพียงแค่ต้องแยกมันด้วยข้อผิดพลาดน้อยที่สุด ฉันรวบรวมบันทึกบางส่วนที่นี่

วิธีที่ง่ายที่สุดคือสมการกำลังสอง / แก้ไขพาราโบลาซึ่งผมมีตัวอย่างเช่นงูหลามของที่นี่ มันเป็นเรื่องที่คาดคะเนที่แน่นอนถ้าสเปกตรัมของคุณจะขึ้นอยู่กับหน้าต่างเสียนหรือถ้าจุดสูงสุดที่เกิดขึ้นจะตกอยู่ตรงกับจุดกึ่งกลางระหว่างกลุ่มตัวอย่าง แต่อย่างอื่นมีข้อผิดพลาดบางอย่าง ดังนั้นในกรณีของคุณคุณอาจต้องการใช้สิ่งที่ดีกว่า

นี่คือรายการของตัวประมาณค่าที่ซับซ้อนมากขึ้น แต่แม่นยำยิ่งขึ้น "จากวิธีการข้างต้นตัวประมาณตัวที่สองของ Quinn มีข้อผิดพลาด RMS น้อยที่สุด"

ฉันไม่รู้คณิตศาสตร์ แต่บทความนี้บอกว่าการประมาณพาราโบลามีความแม่นยำทางทฤษฎี 5% ของความกว้างของถังขยะ FFT

การใช้การแก้ไข FFT ในเอาต์พุตความสัมพันธ์ข้ามไม่มีข้อผิดพลาดใด ๆดังนั้นจึงเป็นวิธีที่ดีที่สุดถ้าคุณต้องการความแม่นยำที่ดีจริงๆ หากคุณต้องการความสมดุลของความแม่นยำและความเร็วในการคำนวณขอแนะนำให้ทำการแก้ไขแบบ FFT แล้วตามด้วยตัวประมาณอื่น ๆ เพื่อให้ได้ผลลัพธ์ที่ "ดีพอ"

นี่ใช้พาราโบลาพอดี แต่จะส่งออกค่าที่เหมาะสมสำหรับออฟเซ็ตหากเสียงรบกวนต่ำ:

def parabolic_polyfit(f, x, n):
    a, b, c = polyfit(arange(x-n//2, x+n//2+1), f[x-n//2:x+n//2+1], 2)
    xv = -0.5 * b/a
    yv = a * xv**2 + b * xv + c

    return (xv, yv)

arraysize = 1001
fluxlevel = 100.0
noise = 0.3 # 2.0 is too noisy for sub-sample accuracy
signal_std = 15.0
signal_depth = 40.0
gaussian = lambda x: np.exp(-(mu-x)**2/ (2 * signal_std))
mu = 500.1
a_flux = np.array([ra.normalvariate(fluxlevel, noise) for x in range(arraysize)] - gaussian(np.arange(arraysize)) * signal_depth)
mu = 500.8
b_flux = np.array([ra.normalvariate(fluxlevel, noise) for x in range(arraysize)] - gaussian(np.arange(arraysize)) * signal_depth)

a_flux -= np.mean(a_flux)
b_flux -= np.mean(b_flux)

corr = ss.fftconvolve(b_flux, a_flux[::-1])

peak = np.argmax(corr)
px, py = parabolic_polyfit(corr, peak, 13)

px = px - (len(a_flux) - 1)
print px

ป้อนคำอธิบายรูปภาพที่นี่ ป้อนคำอธิบายรูปภาพที่นี่

เสียงในตัวอย่างของคุณให้ผลลัพธ์ที่แตกต่างกันมากกว่าตัวอย่างทั้งหมดดังนั้นฉันจึงลดมันลง การปรับโค้งให้เหมาะสมโดยใช้จุดสูงสุดให้มากขึ้นจะช่วยให้การประเมินค่อนข้างกระชับ แต่ฉันไม่แน่ใจว่ามันใช้งานได้จริงหรือไม่

ด้วย noise = 0.2 และ 3-fit ให้ค่าเช่น 0.398 และ 0.402 สำหรับ offset = 0.4

ด้วย noise = 2.0 และ 13-fit ให้ค่าเช่น 0.156 และ 0.595 สำหรับ offset = 0.4


ฉันพยายามที่จะแก้ปัญหาที่แน่นอนสำหรับการลงทะเบียนภาพ ฉันต้องการความแม่นยำของพิกเซลย่อย (0.1 น่าจะดีพอ) แต่ที่สำคัญที่สุดคือไม่ต้องมีอคติดังนั้นวิธีการแก้ไขจะไม่ทำงาน มีวิธีการที่ดี (และนำไปใช้ใน python หรือไม่) สำหรับสิ่งนี้ วิธี zero-padding จะใช้งานได้ แต่มันแพงเกินไปที่จะใช้งานได้จริง
keflavich

@kelavich: คุณได้ทดสอบวิธีการแก้ไขทั้งหมดและพบอคติที่ยอมรับไม่ได้หรือไม่ วิธีที่แนะนำคือการรวมกันของบางศูนย์ padding ตามด้วยการแก้ไขข้อผิดพลาดต่ำ ฉันไม่ทราบวิธีอื่นใด แต่ฉันคิดว่านี่จะให้ความแม่นยำแก่คุณ
endolith

ใช่ฉันพบอคติที่ยอมรับไม่ได้ในการแก้ไขเชิงเส้นและลำดับที่สอง ฉันได้ลองใช้การเติมศูนย์ FFT แล้ว แต่ผลลัพธ์นั้นถูกครอบงำด้วยเสียงเรียกเข้าความถี่สูง ... โอกาสใดที่คุณสามารถเพิ่มตัวอย่างการเติมศูนย์ได้?
keflavich
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.