मेरे पास दो डेटा सेट हैं जिन्हें मैं पार करने की कोशिश कर रहा हूं। वे arctan
फ़ंक्शन के समान दिखते हैं, इसलिए मैं इसे सिग्नल प्रोसेसिंग करने के तरीके के बारे में जानने के लिए मॉडल के रूप में उपयोग कर रहा हूं।गैर-आवधिक फ़ंक्शन का क्रॉस-सहसंबंध NumPy
x = linspace(-15, 15, 2**13)
f1 = arctan(x)
f2 = arctan(x + 2)
सवाल मैं है, मुझे कितना हरी झंडी शिफ्ट करने की क्या ज़रूरत है नीले एक के साथ करने के लिए (अधिकतर) ओवरलैप इसे पाने के लिए जवाब देने के लिए की जरूरत है? मैंने सोचा कि यह 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
तो सूत्र यहाँ दी का उपयोग कर: 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
का उपयोग करके सी में अपना एल्गोरिदम लिखना चाहिए?
दिलचस्प- यदि मैं 1.5 में एफ 1 और एफ 2 जोड़ता हूं उन्हें हमेशा सकारात्मक, शिफ्ट शून्य हो जाता है ... –
@Eike तो आपको अपनी टिप्पणी एक उत्तर देना चाहिए। शायद आगे की व्याख्याओं के लिए एक लिंक जोड़ें। –
दुर्भाग्यवश, http://en.wikipedia.org/wiki/Cross-correlation पर एक तेज जांच इनपुट संकेतों के लिए पूर्ण मूल्य आवश्यकता के बारे में कोई विनिर्देश नहीं लाती है। मुझे नहीं पता कि numpy.correlate फ़ंक्शन में ऐसी सीमाएं हैं या नहीं। –