एफएफटी आउटपुट को समझना


87

मुझे DFT / FFT अभिकलन के आउटपुट को समझने में कुछ मदद चाहिए।

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

कृपया, "कोई EE क्लास लें" का कोई जवाब नहीं। मैं वास्तव में यह करने की योजना बना रहा हूं कि अगर मेरा नियोक्ता मुझे भुगतान करेगा। :)

तो यहाँ मेरी समस्या है:

मैंने 32 हर्ट्ज पर सिग्नल कैप्चर किया है। यहां 32 बिंदुओं का 1 सेकंड नमूना है, जिसे मैंने एक्सेल में चार्ट किया है।

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

फिर मुझे कोलंबिया विश्वविद्यालय से जावा में लिखा गया कुछ एफएफटी कोड मिला ( " जावा में विश्वसनीय और तेज़ एफएफटी पर एक पोस्ट में सुझावों का पालन करने के बाद ")।

इस कार्यक्रम का आउटपुट निम्नानुसार है। मेरा मानना ​​है कि यह एक इन-प्लेस एफएफटी चल रहा है, इसलिए यह इनपुट और आउटपुट दोनों के लिए एक ही बफर का फिर से उपयोग करता है।

Before: 

Re: [0.887  1.645  2.005  1.069  1.069  0.69  1.046  1.847  0.808  0.617  0.792  1.384  1.782  0.925  0.751  0.858  0.915  1.006  0.985  0.97  1.075  1.183  1.408  1.575  1.556  1.282  1.06  1.061  1.283  1.701  1.101  0.702  ]

Im: [0.0  0.0  0.0  0.0  0.0  0.0  0.0  0.0  0.0  0.0  0.0  0.0  0.0  0.0  0.0  0.0  0.0  0.0  0.0  0.0  0.0  0.0  0.0  0.0  0.0  0.0  0.0  0.0  0.0  0.0  0.0  0.0  ]

After: 

Re: [37.054  1.774  -1.075  1.451  -0.653  -0.253  -1.686  -3.602  0.226  0.374  -0.194  -0.312  -1.432  0.429  0.709  -0.085  0.0090  -0.085  0.709  0.429  -1.432  -0.312  -0.194  0.374  0.226  -3.602  -1.686  -0.253  -0.653  1.451  -1.075  1.774  ]

Im: [0.0  1.474  -0.238  -2.026  -0.22  -0.24  -5.009  -1.398  0.416  -1.251  -0.708  -0.713  0.851  1.882  0.379  0.021  0.0  -0.021  -0.379  -1.882  -0.851  0.713  0.708  1.251  -0.416  1.398  5.009  0.24  0.22  2.026  0.238  -1.474  ]

इसलिए, इस बिंदु पर, मैं उत्पादन के प्रमुख या पूंछ नहीं बना सकता। मैं डीएफटी अवधारणाओं को समझता हूं, जैसे कि वास्तविक भाग घटक कोसाइन तरंगों के आयाम और काल्पनिक भाग घटक साइन तरंगों के आयाम हैं। मैं महान पुस्तक " द साइंटिस्ट एंड इंजीनियर गाइड टू डिजिटल सिग्नल प्रोसेसिंग " से भी इस आरेख का अनुसरण कर सकता हूं : यहाँ छवि विवरण दर्ज करें

तो मेरे विशिष्ट प्रश्न हैं:

  1. एफएफटी के आउटपुट से, मैं "सबसे अधिक होने वाली आवृत्तियों" को कैसे खोज सकता हूं? यह मेरे एक्सेलेरोमीटर डेटा के मेरे विश्लेषण का हिस्सा है। क्या मुझे वास्तविक (कोसाइन) या काल्पनिक (साइन) सरणियाँ पढ़नी चाहिए?

  2. मेरे पास समय क्षेत्र में 32-बिंदु इनपुट है। FFT का आउटपुट वास्तविक के लिए 16-तत्व का सरणी और काल्पनिक के लिए 16-तत्व का सरणी नहीं होना चाहिए? कार्यक्रम मुझे वास्तविक और काल्पनिक सरणी क्यों देता है, दोनों आकार 32 के हैं?

  3. पिछले प्रश्न से संबंधित, मैं आउटपुट सरणियों में अनुक्रमणिका को पार्स कैसे करूं? 32 हर्ट्ज पर नमूने लिए गए 32 नमूनों के मेरे इनपुट को देखते हुए, मेरी समझ यह है कि एक 16-तत्व सरणी आउटपुट का सूचकांक समान रूप से 1/2 नमूना दर (32 हर्ट्ज) तक फैला होना चाहिए, इसलिए क्या मैं यह समझने में सही हूं कि प्रत्येक तत्व सरणी का प्रतिनिधित्व करता है (32 हर्ट्ज * 1/2) / 16 = 1 हर्ट्ज?

  4. एफएफटी आउटपुट में नकारात्मक मूल्य क्यों हैं? मैंने सोचा था कि मान एक साइनसोइड के आयाम का प्रतिनिधित्व करते हैं। उदाहरण के लिए, वास्तविक [3] = -1.075 के आउटपुट का मतलब आवृत्ति के कोसाइन तरंग के लिए -1.075 का आयाम होना चाहिए। क्या यह सही है? एक आयाम नकारात्मक कैसे हो सकता है?


एक्सेलेरोमीटर रीडिंग से आप क्या गणना करना चाहेंगे: वेग, दूरी? एक्सेलेरोमीटर रीडिंग का शोर गाऊसी वितरण का अनुसरण करता है और मैं यह नहीं देख सकता कि एक साइन लहर को फिट करने का तरीका क्या होगा।
अली

2
जावा टैग को हटा दिया जाना चाहिए क्योंकि यह एक विशिष्ट भाषा की तुलना में अधिक सामान्य है
user3791372

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

@MarkJeronimus: क्या आप जावा में एक कुशल FFT कार्यान्वयन की सिफारिश कर सकते हैं? अगर मुझे सही से याद है, तो मैं कोलंबिया यूनिवर्सिटी कोड के साथ जाने का कारण एफएफटीडब्ल्यू लाइब्रेरी था, जो एंड्रॉइड स्मार्टफोन पर चलने के लिए बहुत जटिल था।
stackoverflowuser2010

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

जवाबों:


85
  1. आपको न तो एक जटिल संख्या के वास्तविक या कल्पनाशील भाग की तलाश करनी चाहिए (कि आपका वास्तविक और काल्पनिक सरणी क्या है)। इसके बजाय आप आवृत्ति के परिमाण को देखना चाहते हैं जिसे sqrt (वास्तविक * वास्तविक + कल्पना * कल्पना) के रूप में परिभाषित किया गया है। यह संख्या हमेशा सकारात्मक रहेगी। अब आपको जो भी खोजना है वह अधिकतम मूल्य के लिए है (अपने सरणी में पहली प्रविष्टि को अनदेखा करें। यह आपकी डीसी ऑफसेट है और कोई आवृत्ति पर निर्भर नहीं है)।

  2. आपको 32 वास्तविक और 32 काल्पनिक आउटपुट मिलते हैं क्योंकि आप एक जटिल से जटिल एफएफटी का उपयोग कर रहे हैं। याद रखें कि आपने अपने 32 नमूनों को 64 काल्पनिक मूल्यों (या 32 जटिल मूल्यों) में बदलकर शून्य काल्पनिक भागों के साथ बदल दिया है। यह एक सिमिट्रिक एफएफटी आउटपुट में परिणाम देता है जहां आवृत्ति परिणाम दो बार होता है। एक बार 0 से एन / 2 आउटपुट में उपयोग करने के लिए तैयार है, और एक बार एन / 2 से एन में आउटपुट में दिखाया गया है। आपके मामले में यह केवल एन / 2 एन से आउटपुट को अनदेखा करना आसान है। आपको उनकी आवश्यकता नहीं है, वे हैं आप अपने एफएफटी की गणना कैसे करते हैं, इस पर सिर्फ एक कलाकृति।

  3. एफटी-बिन समीकरण की आवृत्ति (बिन_िड * फ्रीक / 2) / (एन / 2) है जहां फ्रीक आपकी नमूना-आवृत्ति (उर्फ 32 हर्ट्ज, और एन आपके एफएफटी का आकार है) है। आपके मामले में यह 1 हर्ट्ज प्रति बिन तक सरल है। एन / 2 से एन के डिब्बे नकारात्मक आवृत्तियों (अजीब अवधारणा, मुझे पता है) का प्रतिनिधित्व करते हैं। आपके मामले में उनके पास कोई महत्वपूर्ण जानकारी नहीं है क्योंकि वे पहले N / 2 आवृत्तियों का एक दर्पण हैं।

  4. आपके प्रत्येक बिन के वास्तविक और काल्पनिक भाग एक जटिल संख्या बनाते हैं। यह ठीक है अगर वास्तविक और काल्पनिक भाग नकारात्मक हैं जबकि आवृत्ति का परिमाण स्वयं सकारात्मक है (प्रश्न 1 का मेरा उत्तर देखें)। मेरा सुझाव है कि आप जटिल संख्याओं पर पढ़ें। यह बताते हुए कि वे कैसे काम करते हैं (और वे क्यों उपयोगी हैं) एकल स्टैकओवरफ़्लो-प्रश्न में व्याख्या करना संभव है।

नोट: आप यह भी पढ़ सकते हैं कि आटोक्लेरलेशन क्या है, और इसका उपयोग सिग्नल की मूलभूत आवृत्ति को खोजने के लिए कैसे किया जाता है। मुझे लगता है कि यह वही है जो आप वास्तव में चाहते हैं।


1
धन्यवाद। 1 के बारे में: मैंने यह मैटलैब पेज देखा, जिसमें एक आवृत्ति स्पेक्ट्रम ( mathworks.com/help/techdoc/ref/ffff.html ) दिखाया गया है । उस पृष्ठ पर "सिंगल साइडेड एम्प्लिट्यूड स्पेक्ट्रम ऑफ वाई (टी)" के शीर्षक के साथ एक प्लॉट है। जैसा कि आपने सुझाव दिया है कि आवृत्ति का परिमाण साजिश रच रहा है, sqrt (वास्तविक ^ 2 + img ^ 2)? 3 के बारे में: मुझे अभी भी 2Hz प्रति बिन परिणाम नहीं मिला है। मेरे मामले में, एन = 32 और फ्रीक = 32, सही? तो वहाँ N / 2 = 32/2 = 16 डिब्बे हैं, और उच्चतम आवृत्ति (Nyquist) freq / 2 = 32/2 = 16 हर्ट्ज है, जिसके परिणामस्वरूप 16 हर्ट्ज प्रति 16 डिब्बे हैं, 1 हर्ट्ज प्रति बिन?
stackoverflowuser2010

1
हां, भूखंड स्पेक्ट्रम की भयावहता को दर्शाता है - | Y (f) | निरपेक्ष मूल्य सलाखों का मतलब परिमाण है। बिन चौड़ाई = नमूना दर / एफएफटी आकार। आपकी नमूना दर 32 hz है, आपका FFT आकार 32 है। हाँ, आप बिन चौड़ाई के बारे में सही हैं!
मैट मोंटेग जूल

बिन आवृत्ति तय की।
आंद्रे चलेला

1
अच्छा जवाब, धन्यवाद! क्षमा करें कि मुझे पार्टी में थोड़ी देर हो गई है, लेकिन शायद आप मुझे जवाब दे सकते हैं कि किस इकाई की आवृत्ति (जैसा कि बिंदु 1 में आपके द्वारा उल्लेख किया गया है) सामान्य रूप से है? मेरे मामले में, एक्सेलेरोमीटर से मानों के संकेत पर (एम / एस ^ 2 है)। मैं इसका पता नहीं लगा सकता।
मार्कस वुस्टनबर्ग

चित्त आकर्षण करनेवाला! मेरे संगीत-विज़ुअलाइज़ेशन फ़्रीक्वेंसी-बार सभी बाएं-से-दाएं प्रतिबिंबित हो रहे थे; उत्तर # 2 यह बताते हैं !! पागल!!
रयान एस

11

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


मैं सराहना करता हूं कि इस उत्तर के बाद से काफी समय बीत चुका है .. हालाँकि, क्या आप इस बारे में विस्तार से बता पाएंगे कि आप किस तरह के आर्टिफैक्ट्स का मतलब निकालते हैं?
मैथ्यूज

1
@MattHusz: इन कलाकृतियों की उत्पत्ति के लिए सामान्य शब्द "वर्णक्रमीय रिसाव" है - मैंने अब उत्तर के लिए एक लिंक जोड़ा है जो यह बताता है। सबसे अच्छा तरीका है कि मैं इस प्रभाव का वर्णन कर सकता हूं कि अंतर्निहित स्पेक्ट्रम की खिड़की के कारण आपका स्पेक्ट्रम "स्मियर" हो जाएगा।
पॉल आर

6

1) उच्चतम सरणी के साथ वास्तविक सरणी में सूचकांकों की तलाश करें, पहले एक के अलावा (यह डीसी घटक है)। आपको संभवतः सार्थक परिणामों के रास्ते में बहुत कुछ प्राप्त करने के लिए 32 हर्ट्ज से अधिक नमूना दर, और एक बड़े विंडो आकार की आवश्यकता होगी।

2) दोनों सरणियों का दूसरा भाग पहली छमाही का दर्पण है। उदाहरण के लिए, ध्यान दें कि वास्तविक सरणी (1.774) का अंतिम तत्व दूसरे तत्व (1.774) के समान है, और काल्पनिक सरणी का अंतिम तत्व (1.474) दूसरे तत्व का नकारात्मक है।

3) अधिकतम आवृत्ति जिसे आप 32 हर्ट्ज के नमूना दर पर उठा सकते हैं, 16 हर्ट्ज ( Nyquist सीमा ) है, इसलिए प्रत्येक चरण 2 हर्ट्ज है। जैसा कि पहले उल्लेख किया गया है, याद रखें कि पहला तत्व 0 हर्ट्ज (यानी, डीसी ऑफसेट) है।

4) निश्चित रूप से, एक नकारात्मक आयाम पूर्ण समझ में आता है। इसका मतलब यह है कि सिग्नल "फ़्लिप" है - एक मानक एफएफटी एक कोसाइन पर आधारित है, जिसका सामान्य रूप से मूल्य = 1 पर t = 0 है, इसलिए एक संकेत जिसका मूल्य = -1 था समय = 0 पर एक नकारात्मक आयाम होगा ।


उत्तर के लिए धन्यवाद। (१) क्या आपका मतलब है कि मैं काल्पनिक (साइन) सरणी को अनदेखा कर सकता हूं, और यदि हां, तो क्यों? निश्चित रूप से साइन घटक महत्वपूर्ण होना चाहिए? (२) यह प्रतिबिम्ब क्यों होता है? क्या यह केवल एफएफटी एल्गोरिदम का परिणाम है? क्या ज्यादातर लोग मिरर किए गए आधे को अनदेखा करते हैं? (३) आपने २ हर्ट्ज के चरणों की गणना कैसे की? मैं 16 हर्ट्ज की Nyquist सीमा को समझता हूं, इसलिए यदि 16 (गैर-मिरर) सरणी तत्व हैं, तो प्रत्येक तत्व 16 हर्ट्ज / 16 = 1 हर्ट्ज होना चाहिए? (४) प्रधान आवृत्तियों को खोजने के लिए, क्या मैं सिर्फ आउटपुट सरणियों में आयाम मानों का निरपेक्ष मान लेता हूं?
stackoverflowuser2010

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

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

(3), चरण = 2 हर्ट्ज का मान अब तक मेरे लिए निहित है। हमारे पास 16 डिब्बे हैं, जिनका प्रतिनिधित्व lenght = 16 द्वारा किया गया है। हमें 0Hz से 16Hz तक सभी आवृत्तियों का वर्णन करने की आवश्यकता है। मुझे लगता है कि हर बिन उस सीमा के एक टुकड़े का वर्णन करता है, है ना?
krafter

@ इसके बाद मुझे लगता है कि यह आधा हो गया है क्योंकि आप किसी एकल मान से आवृत्ति नहीं निकाल सकते हैं (जैसा कि कोई पुनरावृत्ति नहीं है)।
JVE999

5

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

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