2013-04-13 5 views
5

मेरे पास दो डेटा सेट हैं जिन्हें मैं पार करने की कोशिश कर रहा हूं। वे arctan फ़ंक्शन के समान दिखते हैं, इसलिए मैं इसे सिग्नल प्रोसेसिंग करने के तरीके के बारे में जानने के लिए मॉडल के रूप में उपयोग कर रहा हूं।गैर-आवधिक फ़ंक्शन का क्रॉस-सहसंबंध NumPy

x = linspace(-15, 15, 2**13) 
f1 = arctan(x) 
f2 = arctan(x + 2) 

enter image description here

सवाल मैं है, मुझे कितना हरी झंडी शिफ्ट करने की क्या ज़रूरत है नीले एक के साथ करने के लिए (अधिकतर) ओवरलैप इसे पाने के लिए जवाब देने के लिए की जरूरत है? मैंने सोचा कि यह f1 और f2 के क्रॉस-सहसंबंध समारोह में अधिकतम खोजना जितना आसान होगा, और मैंने व्यापक रूप से सलाह यहां दी: How to correlate two time series with gaps and different time bases?। यह मैं

c = correlate(f1, f2, 'full') 
s = arange(1-2**13, 2**13) 
dx = 30/2**13 
shift = s[c.argmax()]*dx 

क्या कोशिश कर रहा है मैं और अधिक या कम ठीक 2 बराबर करने के लिए shift उम्मीद होती है, लेकिन वास्तव में यह केवल 0.234 है। यह मुझे कोई समझ नहीं आता है; मुझे क्रॉस-सहसंबंध में अधिकतम का एक्स-समन्वय मिला है, जिसे पाया जाना चाहिए जहां दो संकेतों का अधिकतम ओवरलैप है।

इस तरह के फ़ंक्शन के लिए इस मात्रा की गणना करने के तरीके पर कोई विचार?

संपादित करें: मैं अपने वास्तविक डेटा के लिए, जोड़ना चाहिए, सभी मान शून्य और एक

के बीच संपादित हो जाएगा: निम्नलिखित कार्य वास्तव में अधिक मेरा असली डेटा की तरह हैं:

x = linspace(-15, 15, 400) 
f1 = (arctan(-x) + pi/2)/pi 
f2 = (arctan(-x + 2) + pi/2)/pi 

enter image description here

तो सूत्र यहाँ दी का उपयोग कर: http://paulbourke.net/miscellaneous/correlate/ मैं एक पार से संबंध समारोह है कि सही करने के लिए बाईं ओर लोगों और शून्य जोड़ने के लिए डेटा पैड लिख सकते हैं:

def xcorr(x, y); 
    mx = x.mean() 
    my = y.mean() 
    sx = x.std() 
    sy = y.std() 
    r = zeros(2*len(x)) 

    for d in range(-len(x), len(x)): 
     csum = 0 
     for i in range(0, len(x): 
      yindx = i - d 
      if i - d < 0: 
       yval = 1 
      elif i - d >= len(x): 
       yval = 0 
      else: 
       yval = y[yindx] 
      csum += (x[i] - mx) * (yval - my) 
     r[d + len(x)] = csum/(sx * sy) 
    return r 
इस समारोह के साथ

, मैं अब

c = xcorr(f1, f2) 
s = arange(-400, 400) 
dx = 30/400 
shift = s[c.argmax()] * dx 

कौन सा 2.025 करने के लिए बाहर आता है, जो के रूप में करीब है के रूप में आप इस परिशुद्धता के साथ 2 करने के लिए प्राप्त कर सकते हैं कर सकते हैं। तो ऐसा लगता है कि जेमी सही था, मुद्दा यह है कि correlate सिग्नल की पैडिंग कैसे करता है।

तो, जाहिर है कि मेरे xcorr फ़ंक्शन वास्तव में धीमा है क्योंकि यह खड़ा है। अब सवाल यह है कि क्या कोई तरीका है कि मैं न्यूमपी को एक समान काम कर सकता हूं, या क्या मुझे ctypes का उपयोग करके सी में अपना एल्गोरिदम लिखना चाहिए?

+0

दिलचस्प- यदि मैं 1.5 में एफ 1 और एफ 2 जोड़ता हूं उन्हें हमेशा सकारात्मक, शिफ्ट शून्य हो जाता है ... –

+0

@Eike तो आपको अपनी टिप्पणी एक उत्तर देना चाहिए। शायद आगे की व्याख्याओं के लिए एक लिंक जोड़ें। –

+0

दुर्भाग्यवश, http://en.wikipedia.org/wiki/Cross-correlation पर एक तेज जांच इनपुट संकेतों के लिए पूर्ण मूल्य आवश्यकता के बारे में कोई विनिर्देश नहीं लाती है। मुझे नहीं पता कि numpy.correlate फ़ंक्शन में ऐसी सीमाएं हैं या नहीं। –

उत्तर

1

क्रॉस-सहसंबंध का अधिकतम भाग वह शिफ्ट है जिस पर आपके दो संकेतों के उत्पादों का योग अधिकतम है। एक सोचता है कि दो सिग्नलों का पार सहसंबंध, दूसरे की एक बार शिफ्ट, शिफ्ट पर अधिकतम होगा। और जब यह अनंत संकेतों के लिए सच है, तो दो दो सिग्नल शून्य-पैड, इसलिए दो समान रूप से लंबे संकेतों के साथ, आपके पास शून्य की शिफ्ट के लिए 2**13 गैर-शून्य मानों पर केवल एक सारांश है, और बेहतर मिलान से उच्च मान दो कार्य, ऑफसेट हैं लेकिन कम गैर-शून्य मान हैं।

यदि आपके संकेत +/- अनंत पर 0 थे, तो यह बहुत बुरा नहीं होगा। जैसा कि है, मैं क्रॉस-सहसंबंध का उपयोग कर किसी भी उचित समाधान के साथ आने में सक्षम नहीं हूं।

+0

ठीक है, अगर मैं मैन्युअल रूप से क्रॉस-सहसंबंध की गणना करता हूं, तो मैं अपने पैडिंग के साथ जो भी चाहूं कर सकता हूं। मैं अपने प्रश्न को एक ऐसे फ़ंक्शन को शामिल करने के लिए संशोधित करूंगा जो मेरे डेटा की तरह थोड़ा अधिक है और पैडिंग करने के लिए एल्गोरिदम मैं मैन्युअल रूप से चाहता हूं ... –

3

जैसा कि लोगों ने बताया है, क्रॉस-सहसंबंध डेटा से परे पैडिंग द्वारा उलझन में है।

हालांकि ऐसा लगता है कि आप अच्छे डेटा को फेंक रहे हैं, तो अक्सर डेटा सेट को ट्रिम करना बेहतर होता है ताकि सहसंबंध बिना किसी धारणा के किया जा सके (कम से कम जब डेटा के साथ वास्तविक डेटा को सहसंबंधित करने के विकल्प की तुलना में पैडिंग के लिए)।

x = linspace(-15, 15, 4000) 
f1 = (arctan(-x) + pi/2)/pi 
f2 = (arctan(-x + 2) + pi/2)/pi 

L4 = int(len(f2)/8) 
sf2 = f2[L4:-L4] 

c = correlate(f1-mean(f1), sf2-mean(f1), 'same') 
print "peak correlation occurs at:", x[argmax(c)] # -2.02925731433 

plt.plot(x, c) 
plt.show() 

enter image description here

इसके अलावा, हालांकि, मैं नहीं यकीन है कि सबसे अच्छा तरीका यहाँ है कि xcorr हूँ। विभिन्न बदलावों के लिए वाई-अक्ष मूल्यों के बीच की दूरी को केवल संक्षेप में कैसे और न्यूनतम लेना, जो शून्य के सभी मुद्दों से दूर हो जाता है, आदि।