2010-11-19 8 views
6

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

बहुत पहले से धन्यवाद।

+0

एफएफटी आपको अपने सिग्नल के साइनसॉइडल घटकों की आवृत्ति देगा। यदि आप वास्तविक सिग्नल (किसी भी आकार) की आवृत्ति को मापना चाहते हैं तो आपको एफएफटी के बारे में भूलना होगा और शून्य क्रॉसिंग, या पीक पीक सर्च इत्यादि के लिए नमूना स्कैनिंग का उपयोग करना होगा ... आपके सिग्नल के आकार और ऑफसेट पर थोड़ा सा निर्भर करता है। एफएफटी पर बीटीडब्ल्यू आपको 2 पिक्स मिलते हैं, यदि इनपुट सिग्नल वास्तविक डोमेन पर है तो पहले व्यक्ति का दर्पण है) तो एफएफटी – Spektre

उत्तर

-6

आवृत्ति = गति/तरंग दैर्ध्य।

तरंगदैर्ध्य दो चोटियों के बीच की दूरी है।

+0

के दूसरे भाग को * आवृत्ति * डोमेन में दो चोटों को अनदेखा करें। –

+0

स्टीव: बिल्कुल नहीं। यदि आपका डेटा वास्तव में एक अधिकतम अधिकतम के साथ आवधिक है, तो चोटियों के बीच की दूरी आपको बिल्कुल 1/एफ देगी। हालांकि, आमतौर पर आप अर्ध-आवधिक डेटा से निपट रहे हैं, जिसके लिए आवधिक डेटा पर लागू मानक गणितीय विश्लेषण काम नहीं करता है। –

+0

मेरी पिछली टिप्पणी में मेरा क्या मतलब था कि लेखक ने आवृत्ति डोमेन में दो चोटियों को प्राप्त किया है। यह उत्तर समय डोमेन में होने के लिए दो चोटियों को गलत तरीके से व्याख्या कर रहा है। –

8

मान लीजिए x[n] = cos(2*pi*f0*n/fs) जहां f0 हर्ट्ज, n=0:N-1 में अपने sinusoid की आवृत्ति है, और fs प्रति सेकंड के नमूनों में x का नमूना दर है।

X = fft(x) दें। x और X दोनों की लंबाई N है। मान लीजिए X में n0 और N-n0 पर दो चोटियां हैं।

फिर साइनसॉइड आवृत्तिf0 = fs*n0/N हर्ट्ज है।

उदाहरण: fs = प्रति सेकंड 8000 नमूने, N = 16000 नमूने। इसलिए, x दो सेकंड लंबा रहता है।

मान लीजिए X = fft(x) 2000 और 14000 (= 16000-2000) पर चोटी है। इसलिए, f0 = 8000 * 2000/16000 = 1000 हर्ट्ज।

+0

यह सही है। ध्यान दें कि अक्सर एफएफटी एल्गोरिदम द्वारा दिए गए डेटा को एफएफटी डिज़ाइन (तितली नेटवर्क) के कारण गलत तरीके से गलत किया जाता है। मूल्यों की व्याख्या करने से पहले इसे पहले स्थानांतरित किया जाना है। – ypnos

4

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

Frequency_of_Peak = Data_Sample_Rate * Bin_number_of_Peak/Length_of_FFT ; 

उपरोक्त समीकरण के भीतर अपनी उचित इकाइयों बाहर काम करने के प्रति सेकंड (चक्रों की इकाइयों प्राप्त करने के लिए, प्रति पखवाड़ा, kiloparsec प्रति, आदि)

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

6

यहाँ तुम क्या शायद के लिए देख रहे है: जब आप एक संकेत की आवृत्ति की गणना के बारे में बात

, तो आप शायद इतना घटक साइन लहरों में दिलचस्पी नहीं है। यह वही है जो एफएफटी आपको देता है। उदाहरण के लिए, यदि आप पाप (2 * पीआई * 10x) + पाप (2 * पीआई * 15x) + पाप (2 * पीआई * 20x) + पाप (2 * पीआई * 25x), तो आप शायद "आवृत्ति" का पता लगाना चाहते हैं "5 के रूप में (इस फ़ंक्शन के आलेख पर नज़र डालें)। हालांकि, इस सिग्नल का एफएफटी आवृत्ति 5 के लिए की परिमाण का पता लगाएगा।

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

  1. विंडो, एक चिकनी विंडो का उपयोग कर (कोज्या करना होगा खिड़की कम से कम दोगुनी होनी चाहिए जितनी बड़ी अवधि आप पहचानना चाहते हैं। 3 गुना बड़ा परिणाम बेहतर परिणाम देगा)। (यदि आप उलझन में हैं तो http://zone.ni.com/devzone/cda/tut/p/id/4844 देखें)।

  2. तथापि FFT (ले लो, यकीन है कि FFT आकार दो बार विंडो के रूप में के रूप में बड़ा है, दूसरी छमाही शून्यों के साथ गद्देदार किया जा रहा है बनाते हैं। FFT आकार केवल विंडो के आकार है, तो आप को प्रभावी ढंग से उठाएंगे परिपत्र ऑटो सहसंबंध है, जो न तुम क्या चाहते है। देखना https://en.wikipedia.org/wiki/Discrete_Fourier_transform#Circular_convolution_theorem_and_cross-correlation_theorem)

  3. उनके वर्ग मूल्य (वास्तविक^2 + imag^2) के साथ FFT के सभी गुणांक बदलें। यह प्रभावी ढंग से autocorrelation ले रहा है।

  4. लो IFFT

  5. IFFT में सबसे बड़ा शिखर का पता लगाएं। यह तरंगों की सबसे मजबूत आवधिकता है। आप वास्तव में थोड़ा अधिक चालाक हो सकते हैं जिसमें आप चुनते हैं, लेकिन अधिकांश उद्देश्यों के लिए यह पर्याप्त होना चाहिए। आवृत्ति खोजने के लिए, आप बस f = 1/टी लेते हैं।

+0

यहां स्पष्ट उत्तर के लिए धन्यवाद, इस विषय पर बहुत सारी जानकारी देखी गई और यह मेरे लिए कुछ और चीजों को मंजूरी दे दी। – Adamski

5

आप उदाहरण के लिए एक आवृत्ति के साथ एक संकेत है (:

y = sin(2 pi f t) 

के साथ:

  • y समय संकेत
  • केंद्रीय आवृत्ति
  • टी समय

फिर आपको दो चोटी मिलेंगी, एक एफ के अनुरूप आवृत्ति पर, और एक के साथ आवृत्ति पर एक।

तो, आवृत्ति प्राप्त करने के लिए, नकारात्मक आवृत्ति भाग को त्याग सकते हैं। यह सकारात्मक आवृत्ति भाग के बाद स्थित है। इसके अलावा, सरणी में पहला तत्व एक डीसी-ऑफसेट है, इसलिए आवृत्ति 0 है। (सावधान रहें कि यह ऑफ़सेट आमतौर पर 0 से अधिक है, इसलिए अन्य आवृत्ति घटकों को इसके द्वारा बौना हो सकता है।)

कोड में : (मैं इसे अजगर में लिखा है, लेकिन यह सी # में समान रूप से सरल होना चाहिए):

import numpy as np 
from pylab import * 
x = np.random.rand(100) # create 100 random numbers of which we want the fourier transform 
x = x - mean(x) # make sure the average is zero, so we don't get a huge DC offset. 
dt = 0.1 #[s] 1/the sampling rate 
fftx = np.fft.fft(x) # the frequency transformed part 
# now discard anything that we do not need.. 
fftx = fftx[range(int(len(fftx)/2))] 
# now create the frequency axis: it runs from 0 to the sampling rate /2 
freq_fftx = np.linspace(0,2/dt,len(fftx)) 
# and plot a power spectrum 
plot(freq_fftx,abs(fftx)**2) 
show() 

अब आवृत्ति सबसे बड़ा शिखर पर स्थित है।

+0

डीसी ऑफ़सेट को कम करने के लिए माध्य को कम करने के लिए +1। मेरी राय में, यह स्पष्ट होगा यदि आपने नमूना आवृत्ति के लिए नमूना आवृत्ति का उपयोग किया था, नमूना अवधि नहीं। –

+1

अच्छा! लेकिन उत्तर में एक टाइपो है: साजिश रेखा साजिश होनी चाहिए (freq_fftx, abs (fftx) ** 2) –

+0

धन्यवाद! ठीक कर दिया। – Dirklinux

1

मान लीजिए कि आप आवृत्तियों को देखने के लिए एक अलग फूरियर ट्रांसफॉर्म का उपयोग करते हैं, तो आपको सामान्यीकृत आवृत्तियों को वापस भौतिक वाले (यानी हर्ट्ज) में कैसे समझना है, इस बारे में सावधान रहना होगा।

कैसे एक संकेत की शक्ति स्पेक्ट्रम की गणना करने के पर FFTW tutorial के अनुसार:

#include <rfftw.h> 
... 
{ 
    fftw_real in[N], out[N], power_spectrum[N/2+1]; 
    rfftw_plan p; 
    int k; 
    ... 
    p = rfftw_create_plan(N, FFTW_REAL_TO_COMPLEX, FFTW_ESTIMATE); 
    ... 
    rfftw_one(p, in, out); 
    power_spectrum[0] = out[0]*out[0]; /* DC component */ 
    for (k = 1; k < (N+1)/2; ++k) /* (k < N/2 rounded up) */ 
      power_spectrum[k] = out[k]*out[k] + out[N-k]*out[N-k]; 
    if (N % 2 == 0) /* N is even */ 
      power_spectrum[N/2] = out[N/2]*out[N/2]; /* Nyquist freq. */ 
    ... 
    rfftw_destroy_plan(p); 
} 

नोट यह डेटा लंबाई भी है कि नहीं कर रहे हैं संभालती है। ध्यान दें कि विशेष रूप से यदि डेटा की लंबाई दी जाती है, तो एफएफटीडब्ल्यू आपको "बिन" प्रदान करेगा जो Nyquist आवृत्ति (नमूना दर 2 से विभाजित) के अनुरूप है। अन्यथा, आपको यह नहीं मिलता है (यानी अंतिम बिन निक्विस्ट के ठीक नीचे है)।

एक MATLAB example समान है, लेकिन वे उदाहरण के लिए 1000 की लंबाई (सम संख्या) चयन कर रहे हैं:

N = length(x); 
xdft = fft(x); 
xdft = xdft(1:N/2+1); 
psdx = (1/(Fs*N)).*abs(xdft).^2; 
psdx(2:end-1) = 2*psdx(2:end-1); 
freq = 0:Fs/length(x):Fs/2; 

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

संबंधित मुद्दे