मैं दो संकेतों को कैसे संरेखित / सिंक्रनाइज़ कर सकता हूं?


21

मैं कुछ शोध कर रहा हूं, लेकिन विश्लेषण चरण में फंस गया हूं (मुझे अपने आँकड़े व्याख्यान पर अधिक ध्यान देना चाहिए)।

मैंने दो समकालिक संकेत एकत्र किए हैं: प्रवाह की मात्रा और छाती के विस्तार में परिवर्तन के लिए एकीकृत दर। मैं संकेतों की तुलना करना चाहता हूं और अंततः छाती के विस्तार के संकेत से मात्रा प्राप्त करने की उम्मीद करता हूं। लेकिन पहले मुझे अपने डेटा को संरेखित / सिंक्रनाइज़ करना होगा।

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

मैंने दो संकेतों ( https://docs.google.com/spreadsheet/ccc?key=0As4oZTKp4RZ3dFRKaktYWEhZLXlFFFVNNmllbbVXNHc ) का उदाहरण संलग्न किया है , कृपया मुझे बताएं कि आगे कुछ भी हो सकता है जो मैं प्रदान कर सकता हूं।


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

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

1
मुझे लगता है, आप केवल एक निश्चित देरी का अनुमान लगाना चाहते हैं। आप यहां उल्लिखित क्रॉस-सहसंबंध का उपयोग कर सकते हैं: आंकड़े
thias

1
आप यह सवाल dsp.SE पर पूछना चाहते हैं, जहाँ वे संकेतों के सिंक्रनाइज़ेशन के बारे में भी सोचते हैं।
दिलीप सरवटे

1
@ थियास सही है, लेकिन ऐसा प्रतीत होता है कि पहले एक श्रृंखला को फिर से शुरू किया जाना चाहिए ताकि उनके बीच सामान्य अंतराल हो।
whuber

जवाबों:


24

सवाल पूछता है कि कैसे राशि का पता लगाएं जिसके द्वारा एक समय श्रृंखला ("विस्तार") एक और ("वॉल्यूम") को बंद कर देती है जब श्रृंखला को नियमित लेकिन अलग-अलग अंतराल पर नमूना लिया जाता है।

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


समझाने के लिए , हम प्रश्न में दिए गए डेटा का उपयोग कर सकते हैं, छद्मकोड के Rलिए नियोजित कर सकते हैं । आइए बुनियादी कार्यक्षमता, क्रॉस-सहसंबंध और पुनर्निर्माण के साथ शुरू करें:

cor.cross <- function(x0, y0, i=0) {
  #
  # Sample autocorrelation at (integral) lag `i`:
  # Positive `i` compares future values of `x` to present values of `y`';
  # negative `i` compares past values of `x` to present values of `y`.
  #
  if (i < 0) {x<-y0; y<-x0; i<- -i}
  else {x<-x0; y<-y0}
  n <- length(x)
  cor(x[(i+1):n], y[1:(n-i)], use="complete.obs")
}

यह एक क्रूड एल्गोरिदम है: एक एफएफटी-आधारित गणना तेजी से होगी। लेकिन इन आंकड़ों के लिए (लगभग 4000 मान शामिल हैं) यह काफी अच्छा है।

resample <- function(x,t) {
  #
  # Resample time series `x`, assumed to have unit time intervals, at time `t`.
  # Uses quadratic interpolation.
  #
  n <- length(x)
  if (n < 3) stop("First argument to resample is too short; need 3 elements.")
  i <- median(c(2, floor(t+1/2), n-1)) # Clamp `i` to the range 2..n-1
  u <- t-i
  x[i-1]*u*(u-1)/2 - x[i]*(u+1)*(u-1) + x[i+1]*u*(u+1)/2
}

मैंने डेटा को अल्पविराम से अलग CSV फ़ाइल के रूप में डाउनलोड किया और उसके हेडर को छीन लिया। (हेडर ने R के लिए कुछ समस्याएं पैदा कीं जिनका मैंने निदान करने की परवाह नहीं की।)

data <- read.table("f:/temp/a.csv", header=FALSE, sep=",", 
                    col.names=c("Sample","Time32Hz","Expansion","Time100Hz","Volume"))

एनबी यह समाधान मानता है कि डेटा की प्रत्येक श्रृंखला अस्थायी क्रम में है जिसमें कोई भी अंतराल नहीं है। यह समय के लिए परदे के पीछे के रूप में मूल्यों में अनुक्रमित का उपयोग करने की अनुमति देता है और उन अनुक्रमितों को समय-समय पर परिवर्तित करने के लिए अस्थायी नमूने आवृत्तियों द्वारा स्केल करता है।

यह पता चला है कि इन उपकरणों में से एक या दोनों समय के साथ थोड़ा बह जाते हैं। आगे बढ़ने से पहले इस तरह के रुझानों को दूर करना अच्छा है। इसके अलावा, क्योंकि अंत में वॉल्यूम सिग्नल की एक टैपिंग है, हमें इसे क्लिप करना चाहिए।

n.clip <- 350      # Number of terminal volume values to eliminate
n <- length(data$Volume) - n.clip
indexes <- 1:n
v <- residuals(lm(data$Volume[indexes] ~ indexes))
expansion <- residuals(lm(data$Expansion[indexes] ~ indexes)

मैं परिणाम से सबसे सटीक प्राप्त करने के लिए कम- सीरीज़ श्रृंखला को फिर से तैयार करता हूं ।

e.frequency <- 32  # Herz
v.frequency <- 100 # Herz
e <- sapply(1:length(v), function(t) resample(expansion, e.frequency*t/v.frequency))

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

lag.max <- 5       # Seconds
lag.min <- -2      # Seconds (use 0 if expansion must lag volume)
time.range <- (lag.min*v.frequency):(lag.max*v.frequency)
data.cor <- sapply(time.range, function(i) cor.cross(e, v, i))
i <- time.range[which.max(data.cor)]
print(paste("Expansion lags volume by", i / v.frequency, "seconds."))

आउटपुट हमें बताता है कि विस्तार 1.85 सेकंड तक वॉल्यूम बढ़ाता है। (यदि पिछले 3.5 सेकंड के डेटा को क्लिप नहीं किया गया था, तो आउटपुट 1.84 सेकंड होगा।)

यह एक अच्छा विचार है कि सब कुछ कई तरीकों से जांचा जाए, अधिमानतः नेत्रहीन। सबसे पहले, क्रॉस-सहसंबंध समारोह :

plot(time.range * (1/v.frequency), data.cor, type="l", lwd=2,
     xlab="Lag (seconds)", ylab="Correlation")
points(i * (1/v.frequency), max(data.cor), col="Red", cex=2.5)

क्रॉस-सहसंबंध की साजिश

अगला, समय में दो श्रृंखलाओं को पंजीकृत करें और उन्हें एक ही अक्ष पर एक साथ प्लॉट करें

normalize <- function(x) {
  #
  # Normalize vector `x` to the range 0..1.
  #
  x.max <- max(x); x.min <- min(x); dx <- x.max - x.min
  if (dx==0) dx <- 1
  (x-x.min) / dx
}
times <- (1:(n-i))* (1/v.frequency)
plot(times, normalize(e)[(i+1):n], type="l", lwd=2, 
     xlab="Time of volume measurement, seconds", ylab="Normalized values (volume is red)")
lines(times, normalize(v)[1:(n-i)], col="Red", lwd=2)

पंजीकृत भूखंड

यह बहुत अच्छा लग रहा है! हम एक बिखराव के साथ पंजीकरण गुणवत्ता की बेहतर समझ प्राप्त कर सकते हैं , हालांकि। मैं प्रगति दिखाने के लिए समय-समय पर रंग बदलता रहता हूं।

colors <- hsv(1:(n-i)/(n-i+1), .8, .8)
plot(e[(i+1):n], v[1:(n-i)], col=colors, cex = 0.7,
     xlab="Expansion (lagged)", ylab="Volume")

स्कैटर प्लॉट

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


1
पवित्र नरक, तुम अद्भुत हो। क्रॉस-सहसंबंध वही है जो मैं कल्पना कर रहा था (मुझे पता था कि इसके लिए एक नाम होना चाहिए था) लेकिन आपका उत्तर / स्पष्टीकरण ऊपर और परे चला गया। बहुत बहुत धन्यवाद!
person157

मेरे पास अब पूर्ण विवरण के लिए समय नहीं है, लेकिन "न्यूमेरिकल रेसिपीज़" किताबों में एक बढ़िया खाता दिखाई देता है। उदाहरण के लिए, सी में न्यूमेरिकल व्यंजनों में अध्याय 13.2, "सहसंबंध और निरंकुशता एफएफटी का उपयोग करके देखें" । आप R के acfफंक्शन में भी देख सकते हैं ।
whuber

'आर' के लिए नया, कृपया दयालु बनें: संयुक्त प्लॉट में इस्तेमाल किया गया 'सामान्यीकृत' फ़ंक्शन (दूसरा अंतिम प्लॉट) मेरे लिए काम नहीं करेगा, क्या इस फ़ंक्शन का कोई अपडेट है क्योंकि यह उत्तर पोस्ट किया गया था?
CmKndy

1
@CmKndy मैं तब भी नया था R, जब मैंने इस उत्तर को पोस्ट किया था और उस फ़ंक्शन के लिए परिभाषा देना भूल गया था। यहाँ मूल है:normalize <- function(x) { x.max <- max(x); x.min <- min(x); dx <- x.max - x.min; if (dx==0) dx <- 1; (x-x.min) / dx }
whuber

बिल्कुल सही, शुक्रिया @whuber यदि आप इस तरह से एक उत्तर पोस्ट कर सकते हैं जब आप आर के लिए नए थे, तो मैं जितना सोचा था उससे भी नया हूं;)
CmKndy
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.