MATLAB

2013-03-07 8 views
13

में सिग्नल डेटा से आवृत्ति निर्धारित करें मेरे पास एक सेंसर से डेटा है और मुझे इसकी आवृत्ति को खोजने की आवश्यकता है। ऐसा लगता है कि fft() जाने का तरीका प्रतीत होता है, लेकिन MATLAB दस्तावेज़ केवल दिखाता है कि आवृत्तियों का ग्राफ कैसे प्राप्त करें, मुझे नहीं पता कि वहां से क्या करना है।MATLAB

यहाँ मेरी डेटा की तरह दिखता है:

enter image description here

उत्तर

18

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

सब कुछ मैं एक पंक्ति में डाल में वर्णित किया जाएगा:

[maxValue,indexMax] = max(abs(fft(signal-mean(signal)))); 

जहां indexMax सूचकांक जहां अधिकतम fft मूल्य पाया जा सकता है है।

नोट: इंडेक्समैक्स से ब्याज की वास्तविक आवृत्ति तक पहुंचने के लिए, आपको एफएफटी की लंबाई एल (आपके सिग्नल की लंबाई के समान), और नमूना आवृत्ति एफएस जानना होगा। संकेत आवृत्ति तो हो जाएगा:

frequency = indexMax * Fs/L; 

वैकल्पिक रूप से, तेजी से और काफी अच्छी तरह से भी काम कर रहे संकेत के आधार पर, अपने संकेत के autocorrelation ले:

autocorrelation = xcorr(signal); 

और पहली अधिकतम के बाद होने वाली पाते हैं autocorrelation का केंद्र बिंदु। (स्वत: सहसंबंध मध्य में अधिकतम के साथ सममित होगा।) अधिकतम खोजकर, आपको पहली जगह मिलती है जहां स्थानांतरित सिग्नल स्वयं की तरह कम या कम दिखता है। अर्थात। आपको अपने सिग्नल की अवधि मिलती है। चूंकि इसकी अवधि के एकाधिक द्वारा स्थानांतरित सिग्नल हमेशा अपने जैसा दिखता है, आपको यह सुनिश्चित करने की ज़रूरत है कि आप जो अधिकतम पाते हैं वह वास्तव में सिग्नल की अवधि से मेल खाता है और इसके गुणकों में से एक नहीं है।

आपके सिग्नल में शोर के कारण, पूर्ण अधिकतम अवधि की अवधि के दौरान आपकी अधिकतम अवधि में पूर्ण अधिकतम हो सकता है। तो उस शोर के लिए खाते में, आप स्वत: सहसंबंध (स्वत: सहसंबंध (लंबाई (autocorrelation)/2 + 1) का पूर्ण अधिकतम ले लेंगे, और उसके बाद यह पता लगाएं कि ऑटोोकॉर्बेलेशन कहां से बड़ा है, कहें, पहले के लिए उस अधिकतम मूल्य का 9 5% सिग्नल के दूसरे भाग में समय। 95%, 99%, या कुछ अन्य नंबर इस बात पर निर्भर करेगा कि कितना शोर आपके सिग्नल को दूषित करता है।

अद्यतन: मुझे एहसास हुआ कि मैंने आपको अपने सिग्नल की "फ्रीक्वेंसी" का मतलब माना है अधिकांश ऊर्जा के साथ पिच या बेस हार्मोनिक या फ्रीक्वेंसी, हालांकि आप इसे देखना चाहते हैं। यदि आवृत्ति के अनुसार आप अपने सिग्नल की फ्रीक्वेंसी प्रस्तुति का मतलब रखते हैं, तो पहले अनुमान के लिए, आप बस एफएफटी के पेट को प्लॉट करना चाहते हैं ऊर्जा कहां है:

plot(abs(fft)); 

यदि आप समझना चाहते हैं कि एक पेट क्यों है, या एफएफटी के चरण का प्रतिनिधित्व न करके आप कौन सी प्रासंगिक जानकारी खो रहे हैं, तो आप डीएफटी ट्रांसफॉर्म के बारे में कुछ और पढ़ना चाहेंगे जो आपको समझ में आता है।

+0

संकेत मेरे पास है कि कुछ एक दबाव नापने का यंत्र का उपयोग कर मापा जाता दोलनों से है। मैं उन परिशोधन की आवृत्ति को खोजना चाहता हूं। आपके द्वारा पोस्ट की गई 'fft' विधि का उपयोग करके, मुझे आवृत्ति के लिए 0.0357 मिलते हैं, लेकिन साजिश को देखकर, प्रति सेकंड लगभग 10 चक्र होते हैं, इसलिए मुझे आवृत्ति के लिए लगभग 10 नहीं मिलना चाहिए? – edc1591

+0

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

+0

जो स्पाइक मैं प्राप्त कर रहा था वह शून्य पर था (indexMax = 1)। मैंने मतलब (सिग्नल) घटाकर कहा था और अब मुझे आवृत्ति के लिए 9.8 हर्ट्ज मिल रहा है, जो सही लगता है! मदद के लिए बहुत बहुत धन्यवाद!! – edc1591

0

मुझे लगता है कि यह

(indexMax-1) * Fs/L 

पेट के पहले तत्व (fft (x)) डायरेक्ट करेंट (डीसी) है, या पूर्वाग्रह, हो सकता है या संकेत, या X 0 के मतलब यह होना चाहिए। हम दूसरे तत्व (एक्स 1) से गिनते हैं। अगर मैं गलत हूं तो कृपया मुझे बताएं। धन्यवाद। enter image description here

clear all 
clc 
close all 
Fs = 1; 
T = 11 % Note this T is deliberately chosen , so that we have about 1.7 cycle of cosine singal 
t = 0:Fs:T; % T seconds 
L = length(t); % L is the length of sample sequence 
bias = 4 
signal = sin(t) + bias; 

[maxValue,indexMax] = max(abs(fft(signal-mean(signal)))); 

frequency_method1 = (indexMax-1) * Fs/(L-1); 
frequency_method2 = (indexMax-1) * Fs/L; 


number_of_cycles_method1 = frequency_method1*T 

number_of_cycles_method2 = frequency_method2*T 


subplot(2,1,1) 
plot(t,signal,'-or') ; grid on; 
legend('about 1.7 cycles of cosine signal') 
subplot(2,1,2) 
plot(abs(fft(signal-mean(signal))),'-xb'); grid on 
legend('abs of fft') 

number_of_cycles_method1 = 

    2 


number_of_cycles_method2 = 

    1.8333