एक लहर की आवृत्ति और अवधि का निर्धारण


11

मैं रेफ्रिजरेटर से तापमान डेटा एकत्र कर रहा हूं। डेटा एक लहर की तरह दिखता है। मैं लहर की अवधि और आवृत्ति को निर्धारित करना चाहूंगा (ताकि मैं माप सकता हूं कि क्या रेफ्रिजरेटर में कोई प्रभाव पड़ता है)।

मैं आर का उपयोग कर रहा हूं, और मुझे लगता है कि मुझे डेटा पर एफएफटी का उपयोग करने की आवश्यकता है, लेकिन मुझे यकीन नहीं है कि वहां से कहां जाना है। मैं आर और सिग्नल विश्लेषण के लिए बहुत नया हूं, इसलिए किसी भी मदद की बहुत सराहना की जाएगी!

यहां वह लहर है जिसका मैं निर्माण कर रहा हूं:

मेरी लहर

यहाँ मेरा आर कोड अब तक है:

require(graphics)
library(DBI)
library(RSQLite)

drv <- dbDriver("SQLite")
conn <- dbConnect(drv, dbname = "s.sqlite3")

query <- function(con, query) {
  rs <- dbSendQuery(con, query)
  data <- fetch(rs, n = -1)
  dbClearResult(rs)
  data
}

box <- query(conn, "
SELECT id,
       humidity / 10.0 as humidity,
       temp / 10.0 as temp,
       ambient_temp / 10.0 as ambient_temp,
       ambient_humidity / 10.0 as ambient_humidity,
       created_at
FROM measurements ORDER BY id DESC LIMIT 3600
")

box$x <- as.POSIXct(box$created_at, tz = "UTC")

box$x_n <- box$temp - mean(box$temp)
png(filename = "normalized.png", height = 750, width = 1000, bg = "white")
plot(box$x, box$x_n, type="l")

# Pad the de-meaned signal so the length is 10 * 3600
N_fft  <- 3600 * 10
padded <- c(box$x_n, seq(0, 0, length= (N_fft - length(box$x_n))))
X_f    <- fft(padded)
PSD    <- 10 * log10(abs(X_f) ** 2)

png(filename = "PSD.png", height = 750, width = 1000, bg = "white")
plot(PSD, type="line")

zoom <- PSD[1:300]

png(filename = "zoom.png", height = 750, width = 1000, bg = "white")
plot(zoom, type="l")

# Find the index with the highest point on the left half
index <- which(PSD == max(PSD[1:length(PSD) / 2]))

# Mark it in green on the zoomed in graph
abline(v = index, col="green")

f_s     <- 0.5 # sample rate in Hz
wave_hz <- index * (f_s / N_fft)
print(1 / (wave_hz * 60))

मैंने यहाँ SQLite डेटाबेस के साथ R कोड पोस्ट किया है

यहाँ सामान्यीकृत ग्राफ का एक प्लॉट है (निकाले गए माध्य के साथ):

सामान्यीकृत ग्राफ

अब तक सब ठीक है। यहाँ वर्णक्रमीय घनत्व प्लॉट है:

वर्णक्रमीय घनत्व

फिर हम प्लॉट के बाईं ओर ज़ूम करते हैं और हरे रंग की रेखा के साथ उच्चतम सूचकांक (जो कि 70 है) को चिह्नित करते हैं:

स्पेक्ट्रल प्लॉट पर ज़ूम इन करें

अंत में हम तरंग की आवृत्ति की गणना करते हैं। यह लहर बहुत धीमी है, इसलिए हम इसे प्रति मिनट मिनट में बदल देते हैं, और उस मूल्य को प्रिंट करते हैं जो 17.14286 है।

यदि कोई और प्रयास करना चाहता है तो यहां मेरा डेटा टैब सीमांकित प्रारूप में है

सहायता के लिए धन्यवाद! यह समस्या कठिन थी (मेरे लिए) लेकिन मेरे पास एक महान समय था!


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

आह क्षमा करें। डेटा में डिग्री C में तापमान होता है, मैंने ग्राफ़ के लिए डिग्री F में बदल दिया। हालांकि यह सही डेटा है (यह "अस्थायी" कॉलम है)।
आरोन पैटरसन

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

+1 पोस्टिंग, कोड, डेटा, प्लॉट्स, और जीथब के लिए एक लिंक के लिए।
निबोट

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

जवाबों:


7

दिलचस्प परियोजना आप वहाँ पर जा रहे हैं! :-)

एक सिग्नल विश्लेषण POV से, यह वास्तव में एक सरल प्रश्न है - और हाँ, आप सही हैं कि आप इस आवृत्ति अनुमान समस्या के लिए FFT का उपयोग करेंगे।

मैं आर से परिचित नहीं हूं, लेकिन आप जो अनिवार्य रूप से करना चाहते हैं वह आपके तापमान संकेत का एफएफटी है। चूंकि आपका संकेत वास्तविक है, इसलिए आपको अपने एफएफटी के आउटपुट के रूप में एक जटिल परिणाम मिलेगा। अब आप अपने जटिल एफएफटी परिणाम के पूर्ण परिमाण को ले सकते हैं, (क्योंकि हम चरण की परवाह नहीं करते हैं)। अर्थात । यह आपकी शक्ति वर्णक्रमीय घनत्व है।real2+imag2

फिर, बहुत ही सरलता से, अधिकतम जहाँ आपके PSD बैठते हैं, खोजें। उस अधिकतम का अनुपयोगी आपकी आवृत्ति के अनुरूप होगा।

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

संपादित करें:

आइए हम आपके संकेत को ध्यान में रखते हैं। आई-मीन के बाद, यह इस तरह दिखता है:

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

आप डी-मतलब करना चाहते हैं क्योंकि डीसी पूर्वाग्रह तकनीकी रूप से 0 हर्ट्ज की आवृत्ति है, और आप इसे ब्याज की अन्य आवृत्तियों को डूबने नहीं देना चाहते हैं। हमें इस de-meaned सिग्नल कॉल करें ।x[n]

अब, जब आप एफएफटी लेते हैं, तो आपको कुछ विवरणों पर ध्यान देना चाहिए। मैं सिग्नल की लंबाई की FFT लंबाई का 10 गुना उपयोग करता हूं, इसलिए हम कह सकते हैं कि किसी भी FFT का आकार मूल सिग्नल के आकार से अधिक होने पर आपके FFT परिणाम को प्रक्षेपित करने का प्रभाव पड़ता है। आवृत्ति डोमेन में। यद्यपि यह सूचना सूचना POV से आपके लिए कोई जानकारी नहीं जोड़ता है, लेकिन यह आपको बेहतर विचार-विमर्श करने में मदद करता है, जहाँ आपका वास्तविक शिखर निहित है, विशेषकर ऐसे मामलों में जहाँ यह दो आवृत्ति द्वारों के बीच स्थित है। सही बेहतर फ़्रीक्वेंसी रिज़ॉल्यूशन प्राप्त करने के लिए , आप अधिक डेटा प्राप्त करना चाहते हैं। (यानी, सेंसर को लंबे समय तक चलने दें)।Nfft=103600=36000.

पाठ फ़ाइल से आगे बढ़ते हुए, मैं देखता हूं कि आपका सेंसर हर 2 सेकंड में तापमान रीडिंग ले रहा है। इसका मतलब है कि आपकी नमूना दर , याfs=0.5Hz

इस प्रकार, हम का एक FFT लेते हैं , और उस परिणाम को । यह परिणाम जटिल होगा, और वास्तव में, यह संयुग्म सममित है, लेकिन यहां महत्वपूर्ण नहीं है। (यह सिर्फ आपके उद्देश्यों के लिए है, इसका आधा हिस्सा निरर्थक है)। अब अगर हम लेते हैं , तो यह पावर वर्णक्रमीय घनत्व (लॉग स्केल में) है। परिणाम ऐसा दिखता है:x[n]X(f)10log10(|X(f)|2)

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

आप देख सकते हैं कि यह सममित कैसे है। यदि आप अंतिम छमाही को अनदेखा करते हैं, और बस पहले आधे को देखें और आप में ज़ूम करें, तो आप इसे देख सकते हैं:

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

तो आप सूचकांक 70 पर एक चोटी है! लेकिन वास्तविक आवृत्ति शब्दों में सूचकांक 70 क्या है? यहाँ वह जगह है जहाँ आप अपने आवृत्ति संकल्प चाहते हैं। गणना करने के लिए, हम बस । इसका सीधा सा अर्थ है कि प्रत्येक सूचकांक एक आवृत्ति का प्रतिनिधित्व करता है जो इस संख्या का गुणक है। इंडेक्स 0 । सूचकांक 1 । सूचकांक 70 ।0*1.3889-005=0एचजेड1*1.3889-005=1.3889-005एचजेड70*1.3889-005=9.7222-004एचजेडFsNfft=1.3889e005Hz01.3889e005=0Hz11.3889e005=1.3889e005Hz701.3889e005=9.7222e004Hz

हम लगभग कर चुके हैं। अब जब आपके पास यह आंकड़ा है, तो हम इसे और अधिक स्वादिष्ट बनाने के लिए बदल सकते हैं। यह आंकड़ा केवल यह कह रहा है कि आपका संकेत हर सेकंड 9.7222e-004 चक्र पूरा करता है। तो हम पूछ सकते हैं, एक चक्र की गणना करने में कितने मिनट लगते हैं? इस प्रकार, मिनट प्रति चक्र।1(9.7222e004)60=17.14


@AaronPatterson मैंने पोस्ट को संपादित किया है, कृपया देखें। इसके अलावा, आप अपने चित्रों को सीधे अपने मूल पोस्ट में जोड़ सकते हैं। :-)। कृपया आपको प्राप्त होने वाले PSD परिणाम की एक छवि जोड़ें।
स्पेसी

1
एफएफटी परिणाम डिब्बे के बीच आवृत्ति होने पर बिल्कुल सही नहीं है।
हॉटपावर

@ hotpaw2 यही कारण है कि मैंने ओपी को चेतावनी दी कि मैं सामान्य दृष्टिकोण दे रहा हूं, और मुझे कथानक देखने की आवश्यकता क्यों है। सभी समान, मैंने अतिरिक्त कैविटीज़ जोड़ने के लिए संपादन किया है।
स्पेसी

1
@AaronPatterson कोई समस्या नहीं, मदद करने के लिए खुशी है। जहाँ तक पुस्तकों की बात है, रिचर्ड ल्योंस "अंडरस्टैंडिंग डीएसपी" को देखें - जो कि आरंभ करने के लिए एक फास्टैस्टिक पुस्तक है।
स्पेसी

1
@Frank यह सिर्फ एक घातीय है। उदाहरण के लिए । 1.3x105
स्पेसी

4

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


3

कुछ भी जटिल करने की आवश्यकता नहीं है: बस तरंग की चोटियों के बीच की अवधि को मापें। यह काल है। आवृत्ति केवल 1 अवधि से विभाजित है।

2 घंटे में लगभग 8 चक्रों के साथ, आवृत्ति 4 चक्र प्रति घंटे या लगभग 1 मेगाहर्ट्ज है।


3
मेरे द्वारा इसे योजनाबद्ध तरीके से इसे कैसे किया जा सकता है?
एरोन पैटरसन
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.