विषयसूची:

QuickFFT: Arduino के लिए हाई स्पीड FFT: 3 चरण
QuickFFT: Arduino के लिए हाई स्पीड FFT: 3 चरण

वीडियो: QuickFFT: Arduino के लिए हाई स्पीड FFT: 3 चरण

वीडियो: QuickFFT: Arduino के लिए हाई स्पीड FFT: 3 चरण
वीडियो: ApproxFFT: Fastest FFT Function for Arduino 2024, जून
Anonim
QuickFFT: Arduino के लिए हाई स्पीड FFT
QuickFFT: Arduino के लिए हाई स्पीड FFT

विशिष्ट Arduino में सीमित RAM और प्रसंस्करण शक्ति है, और FFT एक कम्प्यूटेशनल रूप से गहन प्रक्रिया है। कई वास्तविक समय के अनुप्रयोगों के लिए, केवल आवश्यकता अधिकतम आयाम के साथ आवृत्ति प्राप्त करना है या आवृत्ति चोटियों का पता लगाने के लिए आवश्यक है।

अपने एक निर्देश में, मैंने FFT के लिए एक कोड तैयार किया जो यहाँ पर पाया जा सकता है: EasyFFT

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

चरण 1: काम करना

काम में हो
काम में हो
काम में हो
काम में हो
काम में हो
काम में हो
काम में हो
काम में हो

सामान्य FFT फ़ंक्शन को कम सटीकता के साथ गति में सुधार करने के लिए संशोधित किया गया है। जैसा कि छवि में दिखाया गया है, एक परीक्षण संकेत को साइन या कोसाइन तरंगों से गुणा करने की आवश्यकता होती है। ये मान 0 से 1 के बीच हो सकते हैं, इसलिए फ्लोटिंग गुणन करना आवश्यक है। Arduino में, पूर्णांक संचालन की तुलना में फ़्लोटिंग गुणन धीमा है।

इस फ़ंक्शन में, ज्या/कोज्या तरंग को एक वर्ग तरंग द्वारा प्रतिस्थापित किया जाता है। जैसा कि हमें एक परीक्षण संकेत को एक वर्ग तरंग से गुणा करना है जिसका मान 0, 1 या -1 हो सकता है। उसके कारण, हम फ्लोटिंग गुणन को केवल पूर्णांक जोड़ या घटाव में बदल सकते हैं। Arduino के लिए पूर्णांक जोड़ या घटाव लगभग 5 गुना तेज है। यह लगभग 5 गुना तेजी से हल करता है।

इस संशोधन के कारण अब फ़्रीक्वेंसी बिन मानों को एक पूर्णांक (जो पहले फ्लोट किया गया था) के रूप में संग्रहीत किया जा सकता है और हमें कम मेमोरी खपत का एक और लाभ मिलता है। Arduino नैनो में, int 2 बाइट्स मेमोरी की खपत करता है जबकि फ्लोट 4 बाइट्स मेमोरी की खपत करता है। नए कोड में इस लाभ के कारण, हम लगभग 256 नमूनों (पहले 128 नमूने) के लिए FFT करने में सक्षम हैं।

सामान्य एफएफटी में हमें तेजी से समाधान करने के लिए साइन वैल्यू को स्टोर करने की आवश्यकता होती है। नए फ़ंक्शन में, जैसा कि हमें साइन/कोसाइन मानों की आवश्यकता नहीं है, हम इसे समाप्त कर सकते हैं और कुछ मेमोरी बचा सकते हैं।

कार्यान्वयन:

इस फ़ंक्शन को लागू करना सीधे आगे है। हम केवल कोड के अंत में फ़ंक्शन को कॉपी कर सकते हैं। इस फ़ंक्शन को नीचे दिए गए आदेश का उपयोग करके निष्पादित किया जा सकता है:

फ्लोट f = Q_FFT (डेटा, 256, 100); फ़ंक्शन Q_FFT में, डेटा: यह शब्द एक सरणी है जिसमें सिग्नल मान हैं, अनुशंसित नमूना आकार 2, 4, 8, 32, 64, 128, 256, 512, … आगे हैं। यदि नमूना आकार इन मानों से संबंधित नहीं है तो इसे मूल्यों के निकटतम निचले हिस्से में क्लिप कर दिया जाएगा। उदाहरण के लिए, यदि नमूना आकार 75 है, तो FFT से 64 नमूनों की संख्या के लिए किया जाएगा। नमूना आकार की अधिकतम संख्या Arduino पर उपलब्ध RAM द्वारा सीमित है।

दूसरा पद एक सरणी में नमूनों की संख्या निर्दिष्ट करता है और अंतिम शब्द Hz में नमूना आवृत्ति है।

चरण 2: कोड

यह खंड EasyFFT कोड में किए गए संशोधन की व्याख्या करता है जिसे कोड में संशोधन करते समय ध्यान में रखा जाना चाहिए, 1. जैसा कि पहले बताया गया है, यहां एफएफटी करने के लिए पूर्णांकों का उपयोग किया जाता है। Arduino में Int एक 16-बिट संख्या है और इसमें -32768 से 32768 तक के मान हो सकते हैं। जब भी इस int का मान इस सीमा से अधिक हो जाता है तो यह समस्या का कारण बनता है। हर स्तर की गणना के बाद इस समस्या को खत्म करने के लिए। यदि कोई मान १५००० से अधिक है तो पूर्ण सरणियों को १०० से विभाजित किया जाएगा। यह int को अतिप्रवाह से रोकेगा।

2. आयाम गणना: आयाम की गणना करने के लिए, वास्तविक और काल्पनिक भाग को चुकता करने की आवश्यकता होती है और योग के वर्गमूल की आवश्यकता होती है। वर्गमूल और फलन का वर्गमूल समय लेने वाला है। प्रक्रिया को तेज करने के लिए, यह कोड केवल वास्तविक और काल्पनिक भागों के कुछ परिमाणों को पूरा करेगा। यह निश्चित रूप से कम सटीक है और कुछ मामलों में गलत निष्कर्ष पर ले जा सकता है। आप परिमाण गणना के लिए सामान्य विधि पर लौटने का विकल्प चुन सकते हैं लेकिन इसमें अधिक समय लगेगा और आपको इन नंबरों को संग्रहीत करने के लिए कुछ व्यवस्था करने की भी आवश्यकता है।

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

4. फ़ंक्शन में निम्न पंक्ति है:

अहस्ताक्षरित int Pow2[13]={1, 2, 4, 8, 16, 32, 64, 128, 256, 512, 1024, 2048};

उपरोक्त चर को वैश्विक चर के रूप में घोषित करना (इसे कोड की शुरुआत में चिपकाना) प्रत्येक निष्पादन पर कहीं न कहीं 1 मिलीसेकंड का समय बचाएगा।

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

फ्लोट एफ = क्यू_एफएफटी (डेटा, 256, 100);

6. पीक डिटेक्शन: एक बार अधिकतम आयाम के साथ आवृत्ति मिल जाने के बाद यह फ़ंक्शन सटीक परिणामों की गणना करने के लिए इसके ठीक पहले और बाद में आवृत्ति के आयाम का उपयोग करता है। इस गणना में प्रयुक्त आयाम भी मापांक का योग है (वर्गों के योग का वर्गमूल नहीं)

यदि Fn अधिकतम आयाम वाली आवृत्ति है तो आवृत्ति की गणना निम्न सूत्र से की जा सकती है।

वास्तविक F= (A n-1 *Fn-1 + An-1 *Fn-1 + An-1 *Fn-1) / (An-1+An+An+1)

जहाँ A, n आवृत्ति का आयाम है और Fn-1 आवृत्ति मान है।

चरण 3: परिणाम:

परिणाम
परिणाम
परिणाम
परिणाम

EasyFFT के साथ उपरोक्त छवि तुलना में हल करने का समय दिखाया गया है। इसकी गति तुलना के साथ दिखाई गई।

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

मुझे आशा है कि आपको यह कोड आपके प्रोजेक्ट के लिए उपयोगी लगा होगा। किसी भी प्रश्न या सुझाव के मामले में कृपया टिप्पणी करें।

सिफारिश की: