क्या केवल डेटा स्केल करके आयाम (और संभवतः FFT गुणवत्ता) बढ़ाना मान्य है?


10

मैं मार्क Borgerding द्वारा "KISS FFT" का एक संस्करण का उपयोग कर रहा हूँ। यह 16-बिट फिक्स्ड-पॉइंट इनपुट मानों की एक सरणी को स्वीकार करता है और 32-बिट फ्लोट परिणाम सरणी पैदा करता है।

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

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

(ध्यान दें कि इस दृष्टिकोण का मतलब है कि डेटा के लिए बहुत अधिक "coarsness" / ग्रैन्युलैरिटी है, और, विशेष रूप से, निम्न-स्तर का शोर जो सामान्य रूप से मौजूद होगा। मैं नहीं सोच रहा हूं कि क्या यह इंजेक्शन लगाने के लिए बुद्धिमान होगा। इनपुट में शून्य मानों को बदलने के लिए कुछ निम्न-स्तरीय शोर।)


"मैं लगभग सोच रहा हूं कि क्या इनपुट में शून्य मानों को बदलने के लिए कुछ निम्न-स्तरीय शोर को इंजेक्ट करना बुद्धिमान होगा।" = en.wikipedia.org/wiki/Dither
endolith

जवाबों:


7

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

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

तो क्या आप डेटा को स्केल करके इसके आसपास पहुंच सकते हैं? कभी-कभी (बहुत कम तकनीकें होती हैं जो हर समय काम करती हैं!)। यदि आपका इनपुट सिग्नल संख्यात्मक प्रारूप के फुल-स्केल से नीचे के मान पर आधारित है (16-बिट हस्ताक्षरित पूर्णांक -32768 से +32767 तक चलता है), तो आप इनपुट सिग्नल को अधिक पूरी तरह से उपलब्ध रेंज का उपयोग करने के लिए स्केल कर सकते हैं। यह। यह राउंडऑफ त्रुटि के प्रभावों को कम करने में मदद कर सकता है, क्योंकि ब्याज के संकेत की तुलना में किसी भी राउंडऑफ त्रुटि का परिमाण छोटा हो जाता है। तो, इस मामले में जहां आपके सभी आउटपुट आंतरिक रूप से एल्गोरिथ्म के लिए शून्य में गोल हो रहे हैं, यह मदद कर सकता है।

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


मैं स्केलिंग के लिए एक गतिशील तकनीक का उपयोग कर रहा हूं जो बहुत अच्छी तरह से काम करता है। और, जैसा कि किस्मत में होगा, चरम ग्राहकों को शोर के रूप में माना जाता है और वैसे भी क्लिप किया जाता है, इसलिए कभी-कभी क्लिपिंग एक मुद्दा नहीं होना चाहिए। क्या आपको लगता है कि इनपुट के पैमाने कारक द्वारा विभाजित करके आउटपुट को "अवरोही" करना वैध है?
डैनियल आर हिक्स

1

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


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

समझ लिया। क्या आप जानते हैं कि एफएफटी आंतरिक तय या अस्थायी बिंदु है? यदि यह तय हो गया है कि आपको क्लिपिंग, अतिप्रवाह और अंडरफ्लो के बारे में चिंता करने की आवश्यकता है
हिलमार

दस्तावेज़ीकरण और कमेंटरी इसकी अनुपस्थिति में असाधारण है, लेकिन मुझे कोड में बहुत सारी चींटियाँ दिखाई देती हैं और कुछ फ़्लोट्स और डबल्स कीमती हैं। यह 16-बिट से 32-बिट या फ्लोट में स्विच करने के लिए क्रूड #ifdef फ्रेमवर्क को शामिल करता प्रतीत होता है, लेकिन फ्रेमवर्क स्पष्ट रूप से लंबे समय से अक्षम है।
डेनियल आर हिक्स

एक iPhone (ARM + NEON CPU) C. में एक पूर्णांक FFT की तुलना में तेजी से (तेजी से फ्रेमवर्क के माध्यम से) एफएफटी कर सकता है
hotpaw2
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.