एफएफटी या डीएफटी का उपयोग करके ऑडियो को कैसे फिर से खोलें


12

मैं पहले FFT प्रदर्शन करके आवाज ऑडियो का नमूना ले रहा हूं, उसके बाद केवल उस परिणाम के कुछ हिस्सों को ले जाऊंगा जिनकी मुझे आवश्यकता है, और फिर एक उलटा एफटीएफ प्रदर्शन कर रहा हूं। हालाँकि, यह केवल तभी ठीक से काम कर रहा है जब मैं उन आवृत्तियों का उपयोग कर रहा हूँ, जो दोनों की शक्ति हैं, 32768 से 8192 तक डाउन-सैंपलिंग कहते हैं। मैं 32k डेटा पर एक FFT प्रदर्शन करता हूं, डेटा के शीर्ष 3/4 को छोड़ देता हूं और फिर एक प्रदर्शन करता हूं शेष 1/4 पर एफएफटी उलटा।

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

मैं प्रारंभिक FFT और व्युत्क्रम FFT दोनों के अंत में FFT डेटा को ठीक से शून्य पैड के बारे में कैसे जाऊंगा? मान लीजिए मेरे पास 44.1khz पर एक नमूना है जिसे 16khz पर लाने की आवश्यकता है, मैं वर्तमान में कुछ इस तरह की कोशिश करता हूं, नमूना आकार में 1000 हो रहा है।

  1. पैड इनपुट डेटा अंत में 1024 में
  2. FFT प्रदर्शन करें
  3. सरणी में पहले 512 आइटम पढ़ें (मुझे केवल पहले 362 की आवश्यकता है, लेकिन ^ 2 की आवश्यकता है)
  4. उलटा FFT प्रदर्शन करें
  5. ऑडियो प्ले बफर में पहले 362 आइटम पढ़ें

इससे, मैं अंत में कचरा बाहर निकालता हूं। एक ही काम करना, लेकिन पहले से ही ^ 2 के नमूने के कारण चरण 1 और 3 पर पैड किए बिना, एक सही परिणाम देता है।

c#  audio 

9
FFT वास्तव में ऐसा करने का सही तरीका नहीं है। आप अधिकतम दक्षता के लिए एक पॉलीफ़ेज़ फ़िल्टरबैंक चाहते हैं, लेकिन अगर आप समस्या को हल करना चाहते हैं, तो पहले जीसीडी को अपस्ट्रीम करें, फिर लोपास करें, फिर डाउनस्प्ले करें।
ब्योर्न रोश

हाय ब्योर्न: "जीसीडी" क्या है?
स्पीडकॉडर 5

जवाबों:


16

पहला कदम यह सत्यापित करना है कि आपकी प्रारंभिक नमूना दर और आपकी लक्ष्य नमूना दर दोनों तर्कसंगत संख्याएँ हैं । चूंकि वे पूर्णांक हैं, वे स्वचालित रूप से तर्कसंगत संख्याएं हैं। यदि उनमें से एक तर्कसंगत संख्या नहीं थी, तब भी नमूना दर में बदलाव करना संभव होगा, लेकिन यह एक बहुत अलग प्रक्रिया है और अधिक कठिन है।

2232527227533272255

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

यह समझने के लिए कि यह कैसे काम करता है यह कल्पना करने में मदद करता है। आप एक ऑडियो सिग्नल के साथ शुरू करते हैं, जो आवृत्ति डोमेन में, नीचे दिए गए आंकड़े की तरह दिखता है। 44.1 kHz नमूना दर

जब आप अपने प्रसंस्करण के साथ कर रहे हैं तो आप नमूना दर को 16 kHz तक कम करना चाहते हैं, लेकिन आप जितना संभव हो उतना कम विरूपण चाहते हैं। दूसरे शब्दों में, आप बस -8 kHz से +8 kHz तक की तस्वीर और सब कुछ छोड़ देना चाहते हैं। जिसके परिणामस्वरूप चित्र नीचे दिया गया है। यहाँ छवि विवरण दर्ज करें

कृपया ध्यान दें कि नमूना दरें पैमाने पर नहीं हैं, वे केवल अवधारणाओं को चित्रित करने के लिए हैं।

255

जैसा कि आप संदेह कर सकते हैं, कुछ संभावित समस्याएं हैं। मैं हर एक के माध्यम से जाऊंगा और समझाऊंगा कि आप उन्हें कैसे दूर कर सकते हैं।

  1. यदि आपका डेटा डिसिलेशन फैक्टर का अच्छा मल्टीपल नहीं है तो आप क्या करते हैं? आप अपने डेटा के अंत को पर्याप्त शून्य के साथ पैडिंग करके इसे आसानी से दूर कर सकते हैं, ताकि इसे एक से अधिक दशमलव कारक बनाया जा सके। यह डेटा FFT'ed से पहले पेड है।

  2. ll1शून्य (कृपया ध्यान दें कि डेटा सैंपल की संख्या और पैडिंग सैंपल्स की संख्या को आवश्यक होना चाहिए, जो कि डेमोकेशन फैक्टर का एक पॉजिटिव मल्टीपल होगा- आप इस अड़चन को पूरा करने के लिए पैडिंग लेंथ बढ़ा सकते हैं), गद्देदार डेटा को FFT'ing करना, फ़्रीक्वेंसी डोमेन को गुणा करना डेटा और फ़िल्टर, और फिर उच्च आवृत्ति (> 8 किलोहर्ट्ज़) को एलाइज़ करने से उच्च आवृत्ति परिणाम छोड़ने से पहले कम आवृत्ति (<8 kHz) परिणाम होता है। दुर्भाग्य से, चूंकि फ़्रीक्वेंसी डोमेन में फ़िल्टर करना अपने आप में एक बड़ा विषय है, इसलिए मैं इस उत्तर में अधिक विस्तार में नहीं जा पाऊँगा। मैं कहूंगा, हालांकि, यदि आप फ़िल्टर करते हैं और एक से अधिक चंक में डेटा संसाधित कर रहे हैं, तो आपको फ़िल्टरिंग को निरंतर बनाने के लिए ओवरलैप-एंड-ऐड या ओवरलैप-एंड-सेव लागू करना होगा।

आशा है कि ये आपकी मदद करेगा।

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


बहुत अच्छा। आप मक्खी, जिम पर इस तरह के अच्छे आंकड़े कैसे बना रहे हैं?
स्पेसी

@ मोहम्मद मैं आमतौर पर पावरपॉइंट का उपयोग करता हूं। इस मामले में मैंने पावरपॉइंट के लिब्रे ऑफिस संस्करण का उपयोग किया, जो मुझे लगता है कि "इंप्रेस" कहलाता है।
जिम क्ले

नमस्कार, आपकी बात पर मेरा प्रश्न है (२)। इस चरण में आपका वास्तव में क्या मतलब है: "... और फिर उच्च आवृत्ति (> 8 kHz) को उतारा करने से उच्च आवृत्ति परिणाम छोड़ने से पहले कम आवृत्ति (<8 kHz) परिणाम होता है।" मैं उससे पहले के चरणों को समझता हूं। अपने फिल्टर के एफ-डोमेन के साथ अपने एफ-डोमेन डेटा को गुणा करने के बाद, फिर क्या? इसके अलावा, क्या यह विधि काम करती है यदि आप अपने डेटा को भी बेहतर बनाना चाहते हैं? धन्यवाद।
theGrapeBeyond

@ TheGrapeBeyond जब आप समय डोमेन में उपनाम करते हैं तो आप सभी Nyquist क्षेत्रों को एक साथ जोड़ते हैं। सभी Nyquist क्षेत्रों के पहले तत्वों को एक साथ जोड़ा जाता है और पहले Nyquist क्षेत्र का नया पहला तत्व बन जाता है। सभी Nyquist क्षेत्रों का दूसरा तत्व एक साथ जुड़ जाता है और पहले Nyquist ज़ोन का नया दूसरा तत्व बन जाता है, आदि
जिम क्ले

हम्म, मुझे यकीन नहीं है कि मैं समझता हूं कि आप एफएफटी-आधारित रीसम्पलिंग कैसे कर रहे हैं, क्योंकि जब मैं यहां कोशिश करता हूं तो मुझे बहुत अजीब परिणाम मिलते हैं। मैं इस पर एक सवाल करूंगा।
theGrapeBeyond

3

जबकि उपरोक्त उत्तर वास्तव में पूर्ण है:

यहाँ इसका सार है:

  1. एक संकेत को नीचे करने के लिए इसे पूरी संख्या होना चाहिए। किसी सिग्नल के डाउन सैंपलिंग से पहले, आपको सिग्नल को फ़िल्टर करना होगा।
  2. आप पहले-से-नमूना / संकेत को प्रक्षेपित करके परिमेय संख्या को घटा सकते हैं।
  3. अपसमलिंग केवल शून्य को सम्मिलित कर रहा है और फिर सिग्नल को फ़िल्टर कर रहा है।
  4. तो 3/4 नमूना दर प्राप्त करने के लिए। हर सिग्नल सैंपल के बीच 4 शून्य लगाकर सिग्नल को अपडाउन करना। एक फ़िल्टर लागू करें। फिर सिग्नल को फ़िल्टर करें और हर 4 सिग्नल नमूनों में से 3 को हटा दें।

इस पर विवरण:

http://www.ws.binghamton.edu/fowler/fowler%20personal%20page/EE523_files/Ch_14_1%20Subband%20Intro%20&%20Multirate%20(PPT).pdf

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


1

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

1 - लंबाई एन के वांछित वेक्टर संकेत लें।

2 - प्रदर्शन एन बिंदु FFT।

3 - एफएफटी वेक्टर के मध्य में 160 * एन शून्य के साथ एफएफटी को शून्य पैड।

4 - प्रदर्शन IFFT

5 - 441 नमूनों में से एक का चयन करें जो अन्य 440 को छोड़ रहा है।

आपको लंबाई एन * 160/441 के एक वेक्टर के साथ छोड़ दिया जाएगा, जो कि आपका पुन: संकेतित संकेत होगा।

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

आशा है ये मदद करेगा।

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