मैं एफएफटी में प्रत्येक मूल्य की आवृत्तियों को कैसे प्राप्त कर सकता हूं?


148

मेरे पास एक एफएफटी परिणाम है। ये दो doubleसरणियों में संग्रहीत हैं : एक वास्तविक भाग सरणी और एक काल्पनिक भाग सरणी। मैं इन आवृत्तियों में प्रत्येक तत्व के अनुरूप होने वाली आवृत्तियों को कैसे निर्धारित करूं?

दूसरे शब्दों में, मैं एक ऐसा सरणी बनाना चाहूंगा जो मेरे FFT के प्रत्येक वास्तविक और काल्पनिक घटक के लिए आवृत्तियों को संग्रहीत करता है।


मैं इसे C # .net में करता हूं। क्या आप मेरी मदद कर सकते हैं?
रंगो

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

धन्यवाद! मैं प्रत्येक फ्रेम के शिखर आवृत्तियों को प्राप्त करना चाहता हूं (फ्रेम की लंबाई विंडो की लंबाई और शिफ्ट की लंबाई पर निर्भर करती है)
रंगो

जवाबों:


350

एफएफटी में पहला बिन डीसी (0 हर्ट्ज) है, दूसरा बिन है Fs / N, जहां Fsनमूना दर है और Nएफएफटी का आकार है। अगला बिन है 2 * Fs / N। इसे सामान्य शब्दों में व्यक्त करने के लिए, nth bin है n * Fs / N

इसलिए यदि आपकी नमूना दर, Fs44.1 kHz और आपके FFT आकार Nकहलाती है, 1024 है, तो FFT आउटपुट डिब्बे इस प्रकार हैं:

  0:   0 * 44100 / 1024 =     0.0 Hz
  1:   1 * 44100 / 1024 =    43.1 Hz
  2:   2 * 44100 / 1024 =    86.1 Hz
  3:   3 * 44100 / 1024 =   129.2 Hz
  4: ...
  5: ...
     ...
511: 511 * 44100 / 1024 = 22006.9 Hz

ध्यान दें कि कोई वास्तविक इनपुट संकेत के लिए (काल्पनिक भागों सब शून्य) FFT की दूसरी छमाही (से डिब्बे N / 2 + 1को N - 1) कोई उपयोगी अतिरिक्त जानकारी (वे पहले से जटिल संयुग्म समरूपता है शामिल N / 2 - 1डिब्बे)। अंतिम उपयोगी बिन (व्यावहारिक N / 2 - 1व्यवहार के लिए ) पर है , जो उपरोक्त उदाहरण में 22006.9 हर्ट्ज से मेल खाता है। बिन N / 2Nyquist आवृत्ति पर ऊर्जा का प्रतिनिधित्व करता है, अर्थात Fs / 2(इस उदाहरण में = = 22050 हर्ट्ज), लेकिन यह सामान्य रूप से किसी भी व्यावहारिक उपयोग की नहीं है, क्योंकि एंटी-अलियासिंग फिल्टर आमतौर पर किसी भी संकेत को ऊपर और ऊपर से देखेंगे Fs / 2


8
नोट - उत्तर थोड़ा गलत है - 512 वीं बाल्टी में 22050 के लिए स्तर है, न्युकिस्ट सीमा। 0 से N / 2 के डिब्बे में उपयोगी मूल्य होते हैं।
david van brink

4
संपादन और स्पष्टीकरण के लिए धन्यवाद ... मुझे लगता है कि यह वह जगह है जहां मैं व्यावहारिकता की कुछ कमी को प्रकट करता हूं। Me: लेकिन मास्टर, FFT के काम nyquist तक! आप: Padawan, आपको वास्तव में फ़िल्टर करना चाहिए।
david van brink

5
काश कि मैं जवाब दे पाता। यह प्रश्न मूल प्रश्न से भी बेहतर है!
स्काईलियन

14
@PaRR - इस अद्भुत जवाब के लिए मैं आपको धन्यवाद देना चाहता हूं जिसने मुझे वर्षों तक सेवा दी है। इससे पहले कि मैं एक StackOverflow खाता था, और मैं एक बार साइन अप करने के बाद मैं आपको धन्यवाद देने के बारे में भूल गया, मैं इस उत्तर पर जाऊंगा। मैं हाल ही में एफएफटी सामान पर एक नज़र डाल रहा था और मुझे आपका उत्तर याद था और अभी-अभी आया था। एक बार जब मैं यहाँ आया, तो मुझे आपका धन्यवाद याद आया ... इसलिए धन्यवाद! जब भी एफएफटी के क्षैतिज अक्ष पर प्रत्येक बिंदु की व्याख्या करने पर किसी के साथ मेरी बहस होती है, तो मैं उन्हें इस लिंक पर इंगित करता हूं।
रायरेंग

6
@rayryeng: बहुत बहुत धन्यवाद - मुझे लगता है कि मैं सबसे अच्छा पावती है जो मैंने कभी भी SO पर यहाँ सवालों के जवाब देने के ~ 5 साल में लिया है!
पॉल आर

55

यहाँ मेरे उत्तर पर एक नज़र डालें ।

टिप्पणी का उत्तर दें:

FFT वास्तव में समान रूप से दूरी वाली आवृत्तियों की सीमा पर साइन और कोसाइन फ़ंक्शंस (आधार फ़ंक्शंस) के साथ इनपुट सिग्नल के क्रॉस-सहसंबंध की गणना करता है । किसी दिए गए FFT आउटपुट के लिए, मेरे द्वारा पोस्ट किए गए उत्तर के अनुसार एक समान आवृत्ति (F) है। आउटपुट नमूने का वास्तविक हिस्सा इनपुट सिग्नल का क्रॉस-सहसंबंध है cos(2*pi*F*t)और काल्पनिक भाग इनपुट सिग्नल का क्रॉस-सह-संबंध है sin(2*pi*F*t)। इनपुट सिग्नल के कारण sinऔर cosफंक्शन का संबंध इनपुट सिग्नल और बेस फ़ंक्शंस के बीच फेज़ डिफरेंस का है।

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


वास्तविक और काल्पनिक हिस्सा एफएफटी का परिणाम है जिसका उपयोग किया गया है? कृपया मेरे लिए समझाएं। धन्यवाद
Rango

5
यह जवाब अधिक प्यार का हकदार है।
उज्ज्वल-तारा

1
क्या ऐसा हो सकता है कि जटिल आउटपुट के परिमाण को दोगुना करना पड़े? (अगर मैं अपनी व्याख्या को निचले आधे तक सीमित कर दूं)
वुल्फ

18

मैंने निम्नलिखित का उपयोग किया है:

public static double Index2Freq(int i, double samples, int nFFT) {
  return (double) i * (samples / nFFT / 2.);
}

public static int Freq2Index(double freq, double samples, int nFFT) {
  return (int) (freq / (samples / nFFT / 2.0));
}

इनपुट हैं:

  • i: बिन तक पहुँचने के लिए
  • samples: हर्ट्ज में नमूनाकरण दर (अर्थात 8000 हर्ट्ज, 44100 हर्ट्ज, आदि)
  • nFFT: एफएफटी वेक्टर का आकार

7
लोग वास्तव में नहीं पता कर सकते क्या आप के साथ प्रतिनिधित्व करते हैं samplesया nFFT। तो कृपया इसे और अधिक स्पष्ट करें।
मोस्टर

14
स्वीकृत उत्तर कहता है कि यह होना चाहिए i * samples / nFFT2वहाँ अतिरिक्त क्यों है ? क्या मैं कुछ भूल रहा हूँ?
यति

13

एफएफटी आउटपुट गुणांक (आकार एन के जटिल इनपुट के लिए) 0 से एन तक हैं - 1 को [एलओडब्ल्यू, एमआईडी, एचआई, एचआई, एमआईडी, एलओडब्ल्यू] आवृत्ति के रूप में वर्गीकृत किया गया है।

मुझे लगता है कि कश्मीर में तत्व वास्तविक डेटा, FFT [Nk] = FFT [k] के जटिल संयुग्म के लिए Nk पर तत्व के समान आवृत्ति है।

कम आवृत्ति से उच्च आवृत्ति तक स्कैनिंग का क्रम है

0,

 1,
 N-1,

 2,
 N-2

 ...

 [N/2] - 1,
 N - ([N/2] - 1) = [N/2]+1,

 [N/2]

सूचकांक I = 0 से [N / 2] तक आवृत्ति के [N / 2] +1 समूह हैं, जिनमें से प्रत्येक में frequency = i * SamplingFrequency / N

तो बिन FFT [k] पर आवृत्ति है:

if k <= [N/2] then k * SamplingFrequency / N
if k >= [N/2] then (N-k) * SamplingFrequency / N

5

आपके k वें FFT परिणाम की आवृत्ति 2 * pi * k / N है।


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