क्रॉस सहसंबंध का उपयोग करके आस्टसीलस्कप संकेतों का समय देरी से अनुमान


12

मैंने एक oscope से 2 सिग्नल रिकॉर्ड किए हैं। वे इस तरह दिखते हैं: यहाँ छवि विवरण दर्ज करें

मैं उनके बीच मतलबी समय की देरी को मापना चाहता हूं। प्रत्येक सिग्नल में 2000000 के नमूने की आवृत्ति के साथ 2000 नमूने हैं।

डेटा एक सीएसवी फ़ाइल में है। अभी तक मेरे पास इतना ही है।
मैंने csv फ़ाइल के समय के डेटा को मिटा दिया ताकि csv फ़ाइल में केवल वोल्टेज का स्तर हो।

x1 = csvread('C://scope1.csv');
x2 = csvread('C://scope2.csv');  
cc = xcorr(x1,x2);
plot(cc);  

यह यह परिणाम देता है: यहाँ छवि विवरण दर्ज करें

मैंने जो पढ़ा है उससे मुझे इन संकेतों के क्रॉस सहसंबंध को लेने की जरूरत है और इससे मुझे समय की देरी से संबंधित एक चोटी मिलनी चाहिए। हालाँकि जब मैं इन संकेतों का क्रॉस सहसंबंध लेता हूं तो मुझे 2000 में एक चोटी मिलती है जो मुझे पता है कि सही नहीं है। इससे पहले कि मैं उन्हें सहसंबंधी पार करूं, मुझे इन संकेतों का क्या करना चाहिए? बस किसी दिशा की तलाश है।

संपादित करें: डीसी ऑफसेट को हटाने के बाद यह परिणाम है जो मुझे अब मिल रहा है:
यहाँ छवि विवरण दर्ज करें

क्या इसे परिभाषित करने के लिए एक और अधिक परिभाषित समय देरी को साफ करने का एक तरीका है?

EDIT 2: यहाँ फाइलें हैं:
http://dl.dropbox.com/u/10147354/scope1col.csv
http://dl.dropbox.com/u/10147354/scope2col.csv


कैसे, वास्तव में, आप क्रॉस-सहसंबंध कर रहे हैं? आपके प्रत्यक्ष प्रश्न के उत्तर में, आपको क्रॉस-सहसंबंध से पहले अपने संकेतों के लिए कुछ भी करने की आवश्यकता नहीं होनी चाहिए, हालांकि कुछ उदाहरणों में फ़िल्टरिंग पहले शोर से छुटकारा पाने में मदद करती है जो परिणामों को विकृत कर सकती है।
जिम क्ले

1
कृपया उस कोड को पोस्ट करें जिसका आपने उपयोग किया है और अधिक महत्वपूर्ण रूप से क्रॉस-सहसंबंध संकेत का एक प्लॉट। कुछ टूल / लाइब्रेरीज़ ग्राफ के बीच में (लैग = 0) स्कोर डालते हैं; मुझे याद नहीं कि अगर मतलब ऐसा करता है।
pichenettes

@ पाइकेनेट्स: अद्यतन पोस्ट
निक

@JimClay: अपडेटेड पोस्ट
निक

@NickS। यदि आपके सिग्नल पूरी तरह से संरेखित हैं, तो आपको अपने cc प्लॉट के बीच में एक चोटी मिलेगी। तो 2000 में चोटी का मतलब कोई देरी नहीं है। अब हम कहते हैं कि आपके पास 10 नमूनों की देरी है, जिसका मतलब है कि सिग्नल 2 सिग्नल 1 से 10 नमूने दूर है। यह 2000 से 2010 (या 1990) तक cc में आपकी चोटी को हिला देगा। इसलिए आपका समय विलंब आपके वास्तविक चरम स्थान, MINUS 2000 से मेल खाता है।
Spacey

जवाबों:


11

@NickS

चूंकि यह निश्चित है कि भूखंडों में दूसरा संकेत वास्तव में पहले की पूरी तरह से विलंबित संस्करण है, इसके अलावा शास्त्रीय क्रॉस-सहसंबंध के अलावा अन्य तरीकों का भी प्रयास किया जाना है। इसका कारण यह है कि क्रॉस-सहसंबंध (सीसी) केवल एक अधिकतम संभावना अनुमानक है यदि आपके सिग्नल (एस) एक दूसरे के विलंबित संस्करण हैं। इस मामले में, वे स्पष्ट रूप से नहीं हैं, उनके बारे में गैर-स्थिरता के बारे में कुछ भी नहीं कहना है।

इस मामले में, मेरा मानना ​​है कि जो काम कर सकता है वह संकेतों की महत्वपूर्ण ऊर्जा का समय-आकलन है । दी गई, 'महत्वपूर्ण' कुछ हद तक व्यक्तिपरक हो सकती है या नहीं, लेकिन मेरा मानना ​​है कि सांख्यिकीय बिंदुओं से आपके संकेतों को देखकर, हम 'महत्वपूर्ण' को निर्धारित कर पाएंगे और वहां से जा सकेंगे।

यह करने के लिए, मैंने निम्नलिखित किया:

चरण 1: संकेत लिफाफे की गणना करें:

यह कदम सरल है, क्योंकि आपके प्रत्येक सिग्नल के हिल्बर्ट-ट्रांसफॉर्म के आउटपुट का पूर्ण मूल्य गणना है। लिफाफे की गणना करने के अन्य तरीके हैं, लेकिन यह बहुत सीधे आगे है। यह विधि अनिवार्य रूप से आपके संकेत के विश्लेषणात्मक रूप की गणना करती है, दूसरे शब्दों में, चरण प्रतिनिधित्व। जब आप पूर्ण मूल्य लेते हैं, तो आप चरण को नष्ट कर रहे हैं और केवल ऊर्जा के बाद।

इसके अलावा जब से हम आपके संकेतों की ऊर्जा के समय-देरी-अनुमान का पीछा कर रहे हैं, इस दृष्टिकोण को वारंट किया गया है।

यहाँ छवि विवरण दर्ज करें

चरण 2: गैर-रेखीय मध्यस्थ फिल्टर के किनारे-संरक्षण के साथ डे-शोर:

यह एक महत्वपूर्ण कदम है। यहां उद्देश्य आपकी ऊर्जा के लिफाफे को सुचारू करना है, लेकिन विनाश के बिना या अपने किनारों को बाहर निकालना और तेजी से बढ़ाना। वास्तव में इसके लिए समर्पित एक संपूर्ण क्षेत्र है, लेकिन यहां हमारे उद्देश्यों के लिए, हम बस गैर-रेखीय मेडियल फ़िल्टर को लागू करने के लिए एक आसान का उपयोग कर सकते हैं । (मेडियन फ़िल्टरिंग)। यह एक शक्तिशाली तकनीक है क्योंकि इसके विपरीत मतलब छानने, औसत दर्जे का छानने अपने किनारों को शून्य नहीं होगा, लेकिन एक ही समय में महत्वपूर्ण किनारों में महत्वपूर्ण गिरावट के बिना अपने संकेत बाहर 'चिकनी', के बाद से कोई भी समय किसी भी गणित किया जा रहा है अपने सिग्नल पर प्रदर्शन किया है (बशर्ते खिड़की की लंबाई विषम हो)। यहाँ हमारे मामले के लिए, मैंने खिड़की के आकार के 25 नमूनों का औसत दर्जे का फ़िल्टर चुना:

यहाँ छवि विवरण दर्ज करें

चरण 3: निकालें समय: गाऊसी कर्नेल घनत्व अनुमान कार्यों का निर्माण:

यदि आप सामान्य तरीके के बजाय उपरोक्त प्लॉट बग़ल में देखते हैं तो क्या होगा? गणितीय रूप से बोलते हुए, इसका मतलब है कि, यदि आपको हमारे आयाम संकेतों के प्रत्येक नमूने को y- आयाम-अक्ष पर अनुमानित किया जाए तो आपको क्या मिलेगा? ऐसा करने में हम बोलने के लिए समय निकालने का प्रबंधन करेंगे, और केवल सिग्नल के आँकड़ों का अध्ययन करने में सक्षम होंगे।

सहज रूप से ऊपर के आंकड़े से क्या चबूतरे? जबकि शोर ऊर्जा कम है, इसका यह फायदा है कि यह अधिक 'लोकप्रिय' है। इसके विपरीत, जबकि सिग्नल लिफाफे में ऊर्जा होती है, शोर की तुलना में अधिक ऊर्जावान होता है, यह थ्रेसहोल्ड के पार खंडित होता है। अगर हम 'लोकप्रियता' को ऊर्जा का मापक मानें तो क्या होगा? यह वही है जो हम (मेरे क्रूड) एक के कार्यान्वयन के साथ करेंगे कर्नेल घनत्व समारोह , (केडीई) के साथ एक गाऊसी कर्नेल के साथ करेंगे।

ऐसा करने के लिए, प्रत्येक नमूना लिया जाता है और एक माध्य के रूप में इसके मूल्य का उपयोग करके निर्मित एक गॉसियन फ़ंक्शन, और एक पूर्व-सेट बैंडविड्थ (विचरण) ने एक प्राथमिकता का चयन किया। अपने गॉसियन के विचरण को स्थापित करना एक महत्वपूर्ण पैरामीटर है, लेकिन आप इसे अपने एप्लिकेशन और विशिष्ट संकेतों के आधार पर शोर के आंकड़ों के आधार पर सेट कर सकते हैं। (मेरे पास केवल आपकी 2 फाइलें बंद हैं)। यदि हम केडीई आकलन का निर्माण करते हैं, तो हमें निम्नलिखित कथानक मिलते हैं:

यहाँ छवि विवरण दर्ज करें

आप केडीई को हिस्टोग्राम के निरंतर रूप के रूप में बोल सकते हैं, और आपकी बिन-चौड़ाई के रूप में विचरण कर सकते हैं। हालाँकि, यह एक सुचारू पीडीएफ की गारंटी देने का लाभ है जिसे हम बाद में पहले और दूसरे व्युत्पन्न पथरी पर कर सकते हैं। अब जब हमारे पास गॉसियन केडीई हैं, तो हम देख सकते हैं कि लोकप्रियता में शोर के नमूने कहां हैं। याद रखें कि यहाँ x- अक्ष, आयाम अंतरिक्ष पर हमारे डेटा के अनुमानों का प्रतिनिधित्व करता है। इस प्रकार, हम देख सकते हैं कि कौन सी थ्रेशोल्ड शोर सबसे ऊर्जावान है, और वे हमें बताते हैं कि किन थ्रेसहोल्ड से बचना है।

दूसरे प्लॉट में, गॉसियन केडीई का पहला व्युत्पन्न लिया जाता है, और हम पहले-व्युत्पन्न के बाद पहले नमूने के एब्सिस्सा को लेते हैं। के मिश्रण के शिखर के बाद को लेते हैं। (या पहले जीरो-क्रॉसिंग)। हम इस पद्धति का उपयोग कर सकते हैं और 'सुरक्षित' हो सकते हैं क्योंकि हमारे केडीई का निर्माण वाजिब बैंडविड्थ के चिकने गॉसियों से किया गया था, और इस सुचारू और शोर-कम फ़ंक्शन का पहला व्युत्पन्न लिया गया था। (आमतौर पर पहले-व्युत्पन्न कुछ भी लेकिन उच्च SNR संकेतों में समस्याग्रस्त हो सकते हैं क्योंकि वे शोर बढ़ाते हैं)।

काली रेखाएँ बताती हैं कि किस सीमा पर हम उस छवि को 'खंड' करने में समझदार होंगे, जिससे हम पूरे शोर-शराबे से बच जाते हैं। यदि हम अपने मूल संकेतों पर लागू होते हैं, तो हम निम्नलिखित भूखंडों को प्राप्त करते हैं, काली रेखाओं के साथ हमारे संकेतों की ऊर्जा की शुरुआत का संकेत देते हैं:

यहाँ छवि विवरण दर्ज करें

δt=241 नमूने हैं।

मुझे उम्मीद है कि इससे मदद मिली।


वाह। बहुत बहुत धन्यवाद। मेरे लिए ये सभी नई तकनीकें हैं जिन पर मैं शोध करना शुरू करूंगा। क्या कोई तरीका है जो मैं आपके द्वारा इस्तेमाल किए गए matlab कोड पर एक नज़र डाल सकता है?
निक सिनस

इसलिए मेरे पास मतलाब में किए गए # 1 और # 2 चरण हैं, और मेरे परिणाम आपका मेल खाते हैं, लेकिन मुझे चरण # 3 के साथ समस्या हो रही है। आपने किन कार्यों का उपयोग किया?
निक सिनस

@NickS। पूछें, .. और आप प्राप्त करेंगे, मुझे एक ईमेल शूट करें और मैं आपके द्वारा उपयोग किए गए कोड को भेज सकता हूं।
स्पेसी

@ मोहम्मद क्या आप समय की देरी का अनुमान लगाने के लिए अपना कोड पोस्ट कर सकते हैं। मैंने आपको इस मामले के संबंध में एक ईमेल भेजा है तो कृपया मदद करें

6

ऑटोकैरेलेशन के साथ ऐसा करने में कुछ समस्याएं हैं

  1. विशाल डीसी ऑफसेट (पहले से तय)
  2. टाइम विंडो: मतलाब के एक्सकॉर () में अनिवार्य रूप से "जीरो पैड" के लिए कष्टप्रद सम्मेलन है, दोनों सिरों पर सिग्नल के रूप में आप समय अंतराल को स्लाइड करते हैं। यानी डेटा विंडो समय अंतराल का एक कार्य है। यह किसी भी स्थिर संकेत (साइन तरंगों सहित) के लिए एक त्रिकोणीय आकार बनाएगा। बेहतर विकल्प एक सहसंबंध खिड़की चुनना है ताकि खिड़की का आकार और अधिकतम समय अंतराल आपके कुल डेटा विंडो में फिट हो, या गैर-गद्देदार नमूनों की संख्या से क्रॉस सहसंबंध को सामान्य करने के लिए।
  3. दोनों संकेत मुझे विशेष रूप से सहसंबद्ध नहीं लगते हैं। आकार कुछ हद तक समान है लेकिन चोटियों और डुबकी का विशिष्ट अंतर काफी अलग है, इसलिए मुझे संदेह है कि यहां तक ​​कि एक उचित ऑटो-सहसंबंध भी बहुत अधिक अंतर्दृष्टि प्राप्त करेगा।

प्रारंभिक बिंदु खोजने के लिए थ्रेशोल्ड डिटेक्टर का उपयोग करने के लिए एक बहुत सरल तरीका होगा और बस देरी के रूप में इन बिंदुओं के बीच के अंतर का उपयोग करना होगा।


4

जैसा कि pichenettes ने संकेत दिया है, इस मामले में आउटपुट के मध्य में एक चोटी 0 lag इंगित करती है। मध्य बिंदु से चोटी की ऑफसेट आपका समय अंतराल है।

संपादित करें: यह मुझे चिंता है कि सहसंबंध लगभग एक पूर्ण त्रिकोण है। यह मुझे इंगित करता है कि क्रॉस-सहसंबंध कोई शक्ति सामान्यीकरण नहीं कर रहा है। यह बड़े लैग्स के मुकाबले छोटे लैग्स को एक अनुचित पूर्वाग्रह देता है। मैं आपके xcorr कॉल को "cc = xcorr (X1, x2, 'निष्पक्ष')" "में बदल दूंगा।"

ऐसा नहीं है, आप पर ध्यान दें, एक सही समाधान क्योंकि बड़े-अंतराल परिणाम अब कम अंतराल के परिणामों की तुलना में अधिक अस्थिर हैं क्योंकि वे कम डेटा पर आधारित हैं। छोरों पर एक बड़ी चोटी एक ही कारण के लिए फर्जी हो सकती है कि आप 100% सिर प्राप्त कर सकते हैं और केवल कुछ सिक्कों के टॉस पर कोई पूंछ नहीं है, जबकि यह कई टॉस्क पर होने की संभावना नहीं है।


मतलब कि सिग्नल में देरी नहीं हुई?
निक सिनस

मुझे यकीन नहीं है- चोटी कहाँ पर है? मैं देख सकता हूं कि यह मध्य के पास है, लेकिन यह स्पष्ट नहीं है कि यह वास्तव में मध्य में है। इसके अलावा, एक शक्ति सामान्यीकरण मुद्दा है जिसे मैं अपने उत्तर के एक संपादन में संबोधित करूंगा।
जिम क्ले

'निष्पक्ष' पैरामीटर निश्चित रूप से बेहतर दिखता है। मैं क्या उम्मीद करूंगा। मैं इसे देखता रहूंगा। धन्यवाद।
निक सिनस

@JimClay शायद निक एस, अपने संकेतों के लिफाफे को सहसंबद्ध कर रहा है और वास्तविक संकेतों को नहीं, (निक यह सच है?)। यह (मोटे तौर पर) इस त्रिकोणीय आकार मैं उपज होगा।
Spacey

2
@NickS। मोहम्मद की टिप्पणी से मुझे आभास हुआ और महसूस हुआ कि आपके पास एक विशाल डीसी ऑफ़सेट है जो आपके परिणामों को गड़बड़ कर रहा है। अपने दोनों संकेतों से माध्य को घटाएं और फिर उन पर xcorr चलाएं। मैं पहले "निष्पक्ष" विकल्प के बिना इसे आज़माऊंगा।
जिम क्ले

4

जैसा कि अन्य लोगों ने बताया है, और ऐसा लगता है कि आपने अपने अंतिम संपादित प्रश्न के आधार पर महसूस किया है, ऐसा प्रतीत नहीं होता है कि क्रॉस-सहसंबंध आपको दिखाए गए डेटासेट के लिए समय की देरी का एक अच्छा अनुमान देने जा रहा है। सहसंबंध दो समय श्रृंखला के बीच आकार में समानता को मापता है और समय की एक सीमा के लिए एक दूसरे पर फिसलने से और प्रत्येक अंतराल पर दो श्रृंखलाओं के बीच एक आंतरिक उत्पाद की गणना करता है। जब दो श्रृंखलाएं गुणात्मक रूप से समान होती हैं, तो परिणाम एक बड़ा परिमाण होगा, या वे एक दूसरे के साथ "सहसंबद्ध" हैं। यह उसी तरह है जैसे दो वैक्टर का एक आंतरिक उत्पाद सबसे बड़ा है जब दो वैक्टर एक ही दिशा में इंगित किए जाते हैं।

आपके द्वारा दिखाए गए डेटा के साथ समस्या यह है कि (कम से कम स्निपेट्स के लिए हम देख सकते हैं) आकार में बहुत समानता नहीं लगती है। इसमें कोई देरी नहीं है कि आप संकेतों में से एक पर लागू कर सकते हैं ताकि यह दूसरे की तरह लग सके, जो कि आप उनके क्रॉस-सहसंबंध की गणना करके कर रहे हैं।

ऐसे उदाहरण हैं जहां क्रॉस-सहसंबंध उपयोगी है, हालांकि। यह कहें कि आपका दूसरा संकेत वास्तव में मूल का एक समय-स्थानांतरित संस्करण था, यहां तक ​​कि कुछ अतिरिक्त शोर के साथ:

a = csvread('scope1col.csv');
a = a - mean(a);               % to remove DC offset
b = a(200:end) + sqrt(0.05)*randn(1801,1);
figure; subplot(211); plot(a); subplot(212); plot(b)

यहाँ छवि विवरण दर्ज करें

अब यह तुरंत स्पष्ट नहीं है कि दोनों सिग्नल एक समय देरी से संबंधित हैं। हालांकि, अगर हम क्रॉस-सहसंबंध लेते हैं, तो हमें यह मिलता है:

[c,lags] = xcorr(a,b);
igure; plot(lags,c); grid on; xlabel('Lag'); ylabel('Cross-correlation');

यहाँ छवि विवरण दर्ज करें

जो 200 नमूनों के सही अंतराल पर एक चोटी दिखाता है। सहसंबंध समय देरी का निर्धारण करने के लिए सहसंबंध एक उपयोगी उपकरण हो सकता है, जब डेटासेट पर लागू होता है जिसमें समानता का सही प्रकार होता है।


मैं और क्या कर सकता हूँ के लिए कोई विचार? शायद क्रॉस सहसंबंध के अलावा कोई अन्य तकनीक या शायद किसी प्रकार का फ़िल्टर? धन्यवाद।
निक सिनस

@NickS। मैंने इसे देखा भी है और वे एक दूसरे की प्रतियों में देरी नहीं करते हैं। कहा जा रहा है, क्या आप ऊर्जा की देरी का अनुमान लगाना चाहते हैं ? मुझे लगता है कि इस मामले में अधिक समझदारी होगी, वीएस संकेतों की देरी । यदि आप हमें अंतर्निहित चैनल / प्रयोग के बारे में अधिक बताते हैं तो हम आपको संभावित रास्तों के बारे में अधिक बता सकते हैं।
स्पेसी

@ मोहम्मद थैंक्स अंतर्निहित चैनल स्टील है। ऊर्जा की देरी का अनुमान लगाने का कोई विचार?
निक सिनस

@ मोहम्मद आपको लगता है कि संकेतों की विकृति किसी प्रकार की पुनर्संयोजन हो सकती है जिसे फ़िल्टरिंग से साफ किया जा सकता है?
निक सिनस

@NickS। वहाँ कुछ reverb- सफाई के गुर हो सकते हैं (मुझे पता नहीं है कि उन लोगों को कैसे पूरा किया जाएगा), लेकिन मैंने एक साथ कुछ सरल किया है जो कि एक ऊर्जा आकलनकर्ता होगा यदि आप एक नज़र रखना चाहते हैं।
स्पेसी

0

मुहम्मद के सुझाव के आधार पर, मैंने मैटलैब स्क्रिप्ट बनाने की कोशिश की। हालाँकि, मैं यह कटौती करने में सक्षम नहीं हूं कि क्या वह परिवर्तन के आधार पर गौसियन वितरण का निर्माण करता है और फिर केडीई अनुमान लेता है या वह गौसियन धारणा के साथ केडीई अनुमान लगाता है।

यह भी पता लगाना मुश्किल है कि वह किस तरह से केडीई ऑफसेट समय डोमेन पर अनुवाद करता है। यहाँ मेरा प्रयास है। कोई भी उपयोगकर्ता जो स्क्रिप्ट का उपयोग करने में रुचि रखता है और यदि संभव हो तो बेहतर संस्करण को अपडेट करने के लिए स्वतंत्र है।

%% Initialising data

Ws1 = data1;
Ws2 = data2;
mWs1 = nanmean(Ws1);
mWs2 = nanmean(Ws2);
sdWs1 = nanstd(Ws1);
sdWs2 = nanstd(Ws2);

%% Computing the signal envelopes
Ws1d = Ws1 - mWs1;
Ws2d = Ws2 - mWs2;
h1 = abs(hilbert(Ws1d));
h2 = abs(hilbert(Ws2d));
figure();
subplot(211)
plot([Ws1d, h1])
subplot(212)
plot([Ws2d, h2])

%% Denoise the signal with edge preserving nonlinear medial filtering
w = 25;
mf1 = medfilt1(h1, w);
mf2 = medfilt1(h2, w);
figure();
subplot(211)
plot(mf1)
subplot(212)
plot(mf2)

<%% Remove time: construct the gaussian kernel density estimation functions>
% Using the kde from Matlab central directly on the filtered data
data1 = mf1;
[bw1, den1, xmesh1, cdf1] = kde(data1, 2^14);
der1 = diff(den1);
data2 = mf2;
[bw2, den2, xmesh2, cdf2] = kde(data2, 2^14);
der2 = diff(den2);
figure();
plot([der1, der2]);
legend('Sig1', 'Sig2')

% the other method as explained in Muhammad's post
for i = 1:length(mf1)
gf1(:,i) = mf1(i) + sdWs1*randn(1000,1);
gf2(:,i) = mf2(i) + sdWs2*randn(1000,1);
end
[bwM1, denM1, xmeshM1, cdfM1] = kde(gf1(:,1), 2.^11);
dd1 = diff(denM1);
[bwM2, denM2, xmeshM2, cdfM2] = kde(gf2(:,1), 2.^11);
dd2 = diff(denM2);
figure();
plot([dd1, dd2]);
legend('Sig1', 'Sig2')
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.