İki spektrum arasındaki alt piksel kaymalarını doğrudan karşılaştırın - ve inandırıcı hatalar alın


9

Aynı astronomik nesnenin iki spektrumuna sahibim. Temel soru şudur: Bu spektrumlar arasındaki göreceli değişimi nasıl hesaplayabilir ve bu vardiyada doğru bir hata alabilirim?

Hala benimleysen biraz daha ayrıntı. Her spektrum x değeri (dalga boyu), y değeri (akı) ve hata içeren bir dizi olacaktır. Dalgaboyu kayması alt piksel olacak. Piksellerin düzenli aralıklarla yerleştirildiğini ve tüm spektruma yalnızca tek bir dalga boyu kaydırması olacağını varsayın. Böylece son cevap şuna benzer: 0.35 +/- 0.25 piksel.

İki spektrum, kolayca modellenmeyen (ve periyodik olmayan) oldukça karmaşık emilim özellikleri (daldırma) ile noktalanan çok sayıda özelliksiz süreklilik olacaktır. İki spektrumu doğrudan karşılaştıran bir yöntem bulmak istiyorum.

Herkesin ilk içgüdüsü çapraz korelasyon yapmaktır, ancak alt piksel kaymalarıyla, spektrumlar arasında enterpolasyon yapmak zorunda kalacaksınız (önce yumuşatarak?) - Ayrıca, hataların doğru olması kötü görünüyor.

Şu anki yaklaşımım, bir gauss çekirdeği ile kıvrım yaparak verileri düzeltmek, daha sonra düzgünleştirilmiş sonucu spline etmek ve iki spline spektrumu karşılaştırmak - ama buna güvenmiyorum (özellikle hatalar).

Herkes bunu düzgün yapmak için bir yol biliyor mu?

İşte oynayabileceğiniz 0,4 piksel (toy1.ascii ve toy2.ascii'de yazılmıştır) ile değiştirilen iki oyuncak spektrumunu üretecek kısa bir python programı. Bu oyuncak model basit bir gaussian özellik kullanıyor olsa da, gerçek verilerin basit bir modele sığmayacağını varsayalım.

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))

Doğru anlıyorsam, sorun bir görüntüde doğrusal bir alt piksel kayması olması dışında görüntü kaydına benzer geliyor. Faz korelasyonu gibi standart görüntü kayıt tekniklerini deneyebilir misiniz?
Paul R

Bir sinyalde saf bir gecikme varsa (yani bahsettiğiniz dalga boyu parametresindeki kayma), zaman gecikmesini frekans alanında doğrusal bir faz ofsetine dönüştüren Fourier dönüşümü özelliğinden yararlanabilirsiniz. İki örnek farklı ölçüm gürültüsü veya paraziti nedeniyle bozulmazsa bu işe yarayabilir.
Jason R

1
Bu konu yararlı olabilir
Jim Clay

1
Test edilecek gerçek verileriniz var mı? Verdiğiniz gürültü değeri, çapraz korelasyonun alt örnek doğru olması için çok fazla. : Bu gürültü 2,0 birkaç pistlere sahip bulur ve örnek için, (parselin x ekseni üzerinde = 1000,7) 0,7 ofset nedir i.stack.imgur.com/UK5JD.png
Endolit

Yanıtlar:


5

Çapraz korelasyon kullanmak ve zirveye enterpolasyon yapmak işe yarayacağını düşünüyorum. Anlatıldığı gibi İş'in önce çapraz-korelasyon kadar-örnekleme yararsız? , çapraz korelasyondan önce enterpolasyon veya örnekleme size daha fazla bilgi vermez. Alt numune zirvesi hakkında bilgi, etrafındaki örneklerde bulunur. Sadece minimum hata ile çıkarmanız gerekir. Burada bazı notlar topladım .

En basit yöntem, burada bir Python örneği olan kuadratik / parabolik enterpolasyon . Bu kesin sözde var senin spektrum bir Gauss penceresinde dayanıyorsa veya tepe numuneler arasındaki orta üzerinde tam olarak düşmek olur, ama eğer aksi arıza varsa . Yani sizin durumunuzda muhtemelen daha iyi bir şey kullanmak istersiniz.

İşte daha karmaşık, ancak daha doğru tahmin edicilerin bir listesi . "Yukarıdaki yöntemlerden, Quinn'in ikinci tahmincisi en az RMS hatasına sahiptir."

Matematiği bilmiyorum, ancak bu makale parabolik enterpolasyonlarının bir FFT kutusunun genişliğinin% 5'inin teorik doğruluğuna sahip olduğunu söylüyor.

Çapraz korelasyon çıkışında FFT enterpolasyonu kullanmanın herhangi bir yanlılık hatası yoktur , bu yüzden gerçekten iyi bir doğruluk istiyorsanız en iyisi budur. Doğruluk ve hesaplama hızını dengelemeniz gerekiyorsa, bir miktar FFT enterpolasyonu yapmanız ve daha sonra "yeterince iyi" bir sonuç elde etmek için diğer tahmincilerden biriyle takip etmeniz önerilir.

Bu sadece parabolik oturmayı kullanır, ancak gürültü düşükse ofset için doğru değeri verir:

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

resim açıklamasını buraya girin resim açıklamasını buraya girin

Numunenizdeki gürültü, bir numuneden daha fazla farklılık gösteren sonuçlar üretir, bu yüzden onu düşürdüm. Eğrinin zirvenin daha fazla noktasını kullanarak takılması tahmini biraz sıkılaştırmaya yardımcı olur, ancak bunun istatistiksel olarak geçerli olup olmadığından emin değilim ve aslında daha düşük gürültü durumu için tahmini daha da kötü hale getirir.

Gürültü = 0,2 ve 3 noktaya oturması ile, ofset = 0,4 için 0,398 ve 0,402 gibi değerler verir.

Gürültü = 2.0 ve 13 noktaya sığması ile ofset = 0.4 için 0.156 ve 0.595 gibi değerler verir.


Görüntü kaydı için tam olarak bu sorunu çözmeye çalışıyorum. Alt piksel doğruluğuna ihtiyacım var (0.1 muhtemelen yeterince iyi olurdu), ancak en önemlisi, enterpolasyon yöntemleri işe yaramıyor. Bunun için iyi (ve python'da uygulanmış) yöntemler var mı? Sıfır doldurma yöntemi işe yarayacaktır, ancak pratik olmak için çok pahalıdır.
keflavich

@kelavich: Tüm enterpolasyon yöntemlerini test ettiniz ve kabul edilemez önyargı buldunuz mu? Önerilen yaklaşım, bazı sıfır dolguların ardından düşük hata enterpolasyonunun bir kombinasyonudur . Başka bir yöntem bilmiyorum, ama eminim bu size bol miktarda doğruluk sağlayacaktır.
endolith

Evet, doğrusal ve 2. dereceden enterpolasyonda kabul edilemez önyargı buldum. FFT sıfır doldurmayı denedim, ancak sonuçta yüksek frekanslı zil sesi hakim ... sıfır doldurma örneği ekleyebilme şansınız var mı?
keflavich
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.