DFT और FFT के बीच कुछ अंतर क्या हैं जो FFT को इतनी जल्दी बनाते हैं?


16

मैं एफएफटी को समझने की कोशिश कर रहा हूं, यहां मेरे पास अभी तक क्या है:

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

//simple pseudocode
var wave = [...];                //an array of floats representing amplitude of wave
var numSamples = wave.length;
var spectrum = [1,2,3,4,5,6...]  //all frequencies being tested for.  

function getMagnitudesOfSpectrum() {
   var magnitudesOut = [];
   var phasesOut = [];

   for(freq in spectrum) {
       var magnitudeSin = 0;
       var magnitudeCos = 0;

       for(sample in numSamples) {
          magnitudeSin += amplitudeSinAt(sample, freq) * wave[sample];
          magnitudeCos += amplitudeCosAt(sample, freq) * wave[sample];
       }

       magnitudesOut[freq] = (magnitudeSin + magnitudeCos)/numSamples;
       phasesOut[freq] = //based off magnitudeSin and magnitudeCos
   }

   return magnitudesOut and phasesOut;
}

बहुत जल्दी कई आवृत्तियों के लिए ऐसा करने के लिए, एफएफटी कई ट्रिक्स का उपयोग करते हैं।

एफएफटी को डीएफटी की तुलना में बहुत तेज करने के लिए उपयोग किए जाने वाले कुछ गुर क्या हैं?

PS मैंने वेब पर पूर्ण FFT एल्गोरिदम को देखने की कोशिश की है, लेकिन सभी तरकीबें बिना किसी स्पष्टीकरण के एक सुंदर टुकड़े में संघनित होती हैं। मुझे पूरी बात समझने से पहले सबसे पहले क्या चाहिए, इन अवधारणाओं में से प्रत्येक के रूप में कुछ कुशल परिवर्तनों का परिचय है।

धन्यवाद।


7
"डीएफटी" एक एल्गोरिथ्म का संदर्भ नहीं देता है: यह एक गणितीय ऑपरेशन को संदर्भित करता है। "एफएफटी" उस ऑपरेशन की गणना के लिए तरीकों की एक श्रेणी को संदर्भित करता है।

1
केवल यह बताना चाहता था कि sudoआपके कोड उदाहरण का उपयोग भ्रामक हो सकता है, क्योंकि यह कंप्यूटर की दुनिया में एक प्रसिद्ध कमांड है। आप शायद psuedocode का मतलब था।
rwfeather

1
@nwfeather शायद उनका मतलब 'स्यूडोकोड' था।
user207421

जवाबों:


20

एनपीटी डीएफटी का अनुभवहीन कार्यान्वयन मूल रूप से एन × एन मैट्रिक्स द्वारा गुणा है । यह O ( N 2 ) की जटिलता का परिणाम है ।एनएन×एनहे(एन2)

सबसे आम फास्ट फूरियर ट्रांसफॉर्म (FFT) एल्गोरिदम में से एक मूलांक -2 Cooley-Tukey Decimation-in-Time FFT एल्गोरिथ्म है। यह एक बुनियादी विभाजन और जीत का दृष्टिकोण है।

सबसे पहले परिभाषित "ज़ुल्फ़ कारक" : के रूप में जहांj

डब्ल्यूएन-जे2πएन
काल्पनिक इकाई है, फिर DFTX[k]जे-1एक्स[] की द्वारा दिया जाता है एक्स [ कश्मीर ] = एन - 1 Σ n = 0 एक्स [ एन ]एक्स[n] यदि N सम है (और N
X[k]=n=0N1x[n]WNkn.
N एक पूर्णांक के रूप में इस प्रकार है), योग तो दो रकम में विभाजित किया जा सकता एक्स[कश्मीर]= एन / 2 - 1 Σ n=0एक्स[2n]डब्ल्यू 2 कश्मीर एन एन + एन / 2 - 1 ΣN2
X[k]=n=0N/21x[2n]WN2kn+n=0N/21x[2n+1]WNk(2n+1)
जहां से भी नमूने के साथ पहली बार योग सौदों और की विषम नमूने के साथ दूसरे एक्स [ एन ] । परिभाषित एक्स [ एन ] एक्स [ 2 n ] और एक्स [ एन ] एक्स [ 2 n + 1 ] और तथ्य यह है कि का उपयोग करx[n]x[n]xe[n]x[2n]xo[n]x[2n+1]
  1. , औरWNk(2n+1)=WN2knWNk
  2. ,डब्ल्यूएन2n=डब्ल्यूएन/2n

इसे फिर से X [ k ] के रूप में लिखा जा सकता है जहांएक्स[कश्मीर]औरएक्स[कश्मीर]हैं एन

एक्स[]=Σn=0एन/2-1एक्स[n]डब्ल्यूएन/2n+डब्ल्यूएनΣn=0एन/2-1एक्स[n]डब्ल्यूएन/2n=एक्स[]+डब्ल्यूएनएक्स[]
एक्स[]एक्स[] बिंदु DFTक्रमशःx[n] केसम और विषम नमूनों का रूपांतरण करताहै। इसलिए हमने केवल एकएन-पॉइंट डीएफटी को दो छोटेएन में बदल दियाएन2एक्स[n]एन बिंदु डीएफटी। यह कम्प्यूटेशनल लागत को कम करता है क्योंकि 2(एनएन2 जबएन>2
2(एन2)2+एन<एन2
एन>2

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


क्या आप यह जानना चाहते हैं कि प्रत्येक चर किसके लिए है? मैं बहुत बल्कि इस के लिए नया हूँ, W, j, X(), Nऔरk अभी तक परिभाषाओं मेरे लिए नहीं है।
सिपाही रीड

डब्ल्यूn

19

http://nbviewer.jupyter.org/gist/leftaroundabout/83df89a7d3bdc24373ea470fb50be629

डीएफटी, आकार 16

एक आकार -16 भोले DFT में संचालन का आरेख

एफएफटी, आकार 16

एक आकार -16 रेडिक्स -2 एफएफटी में परिचालनों का आरेख

जटिलता में अंतर उस से बहुत स्पष्ट है, है ना?


यहां बताया गया है कि मैं एफएफटी को कैसे समझता हूं।

एफटी:एल2(आर)एल2(आर)

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

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

इसे एफएफटी के सबसे सस्ते होने के सबसे महत्वपूर्ण कारण के रूप में समझा जा सकता है:

उच्चतम स्तर से व्यक्तिगत दोलन चक्रों को देखने की कोशिश कर परेशान मत करो । इसके बजाय, केवल कुछ उच्च-स्तरीय जानकारी को रूपांतरित करें जो पहले से ही स्थानीय रूप से पहले से तैयार हो चुकी है।

हालांकि यह सब वहाँ नहीं है। FFT के बारे में महान बात यह है कि अभी भी आप सभी जानकारी एक पूर्ण DFT देना होगा । यानी एक प्रकाश-किरण की सटीक विद्युत चुम्बकीय तरंग का नमूना लेते समय आपको जो भी जानकारी मिलेगी। क्या यह एक फोटोडायोड सिग्नल को बदलकर पूरा किया जा सकता है? - क्या आप उससे सटीक प्रकाश-आवृत्ति माप सकते हैं?

खैर, जवाब है
Δν=1/Δटी

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

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

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


My यप, मेरा तर्क इस बिंदु पर थोड़ा गोलाकार है। चलो बस इसे पुनरावर्ती कहते हैं और हम ठीक हैं ...

He यह संबंध क्वांटम मैकेनिकल नहीं है , लेकिन हाइजेनबर्ग अनिश्चितता वास्तव में एक ही मूल कारण है।


2
मुद्दे का अच्छा चित्रण चित्रण। :-)
रॉबर्ट ब्रिस्टो-जॉनसन

2
क्या आप ऐसे डायग्राम से प्यार नहीं करते जो हर जगह दोहराए जाते हैं और वास्तव में कभी भी कहीं भी समझाया नहीं जाता है :)
user541686

1
मैं सिर्फ अपार का जवाब पढ़ने के बाद तस्वीर को समझ गया।
JDługosz

15

इस मामले में रॉबर्ट के अच्छे उत्तर को जोड़ने के लिए एक तस्वीर है, जो ऑपरेशन के "पुनः उपयोग" का प्रदर्शन कर रहा है, इस मामले में 8 बिंदु वाले डीएफटी के लिए। "ट्विडल फैक्टर्स" को अंकन का उपयोग करके चित्र में दर्शाया गया हैडब्ल्यूएनn जो के बराबर है जे2πnएन

दिखाए गए मार्ग पर ध्यान दें और नीचे दिए गए समीकरण आवृत्ति बिन X (1) के लिए परिणाम दिखाता है, जैसा कि रॉबर्ट के समीकरण द्वारा दिया गया है।

डैश वाली रेखाएँ ठोस रेखाओं से अलग नहीं हैं, केवल यह स्पष्ट करने के लिए कि योग कहाँ सम्मिलित हैं।

एफएफटी कार्यान्वयन


8

अनिवार्य रूप से, संक्षेप से सीधे भोले DFT की गणना में:

एक्स[]=Σn=0एन-1एक्स[n]जे2πnएन

वहां एन तालिका कारक के लिए लुकअप जे2πnएन, एन जटिल गुणन, और एन-1अतिरिक्त। और यह सिर्फ एक मूल्य के लिए हैएक्स[] और एक उदाहरण । फिर भोली डीएफटी उस सभी मध्यवर्ती डेटा को दूर फेंक देती है और फिर से इसके लिए सभी से गुजरती हैएक्स[+1]

  1. इसलिए एफएफटी कुछ मध्यवर्ती डेटा को धारण करता है।
  2. एफएफटी भी फैक्टरिंग फैक्टर का उपयोग थोड़ा सा करेगा ताकि डेटा के मध्यवर्ती संयोजन के लिए एक ही कारक का उपयोग किया जा सके।

4

मैं एक दृश्य व्यक्ति हूं। मैं एफएफटी को एक सारांश चाल के बजाय एक मैट्रिक्स चाल के रूप में कल्पना करना पसंद करता हूं।

उच्च स्तर पर समझाने के लिए:

एक भोली डीएफटी प्रत्येक आउटपुट नमूने की स्वतंत्र रूप से गणना करती है और प्रत्येक गणना (क्लासिक एन एल्गोरिथ्म) में प्रत्येक इनपुट नमूने का उपयोग करती है।

एक सामान्य एफएफटी डीएफटी परिभाषा में समरूपता और पैटर्न का उपयोग "परतों" (लॉग एन परतों) में गणना करने के लिए करता है, प्रत्येक परत एक एन लॉग एन एल्गोरिथ्म बनाने के लिए नमूना प्रति निरंतर-समय की आवश्यकता के साथ।

अधिक विवरण:

इन सिमिट्रीज़ को विज़ुअलाइज़ करने का एक तरीका यह है कि DFT को NxN मैट्रिक्स द्वारा गुणा किए गए 1 × N मैट्रिक्स इनपुट के रूप में देखें। आपके सभी जटिल घातांक के । चलो "मूलांक 2" मामले से शुरू करते हैं। हम मैट्रिक्स की सम और विषम पंक्तियों को विभाजित करने जा रहे हैं (सम और विषम इनपुट नमूनों के अनुसार) और उन्हें दो अलग-अलग मैट्रिक्स गुणन के रूप में मानते हैं जो एक ही अंतिम परिणाम प्राप्त करने के लिए एक साथ जोड़ते हैं।

अब इन मैट्रिसेस को देखें: पहले एक में बायाँ आधा दाहिने आधे के समान है। दूसरे में, दायां आधा बाएं आधा x right1 है। इसका मतलब यह है कि हमें वास्तव में इन आधा के बचे हुए आधे हिस्से का उपयोग गुणन के लिए करना है और 1 या by1 से गुणा करके दाएं आधे को सस्ते में बनाना है। इसके बाद, यह देखें कि दूसरा मैट्रिक्स पहले मैट्रिक्स से प्रत्येक कॉलम में समान कारकों से भिन्न होता है, इसलिए हम उस कारक को निकाल सकते हैं और इसे इनपुट में गुणा कर सकते हैं, इसलिए अब दोनों और विषम नमूने एक ही मैट्रिक्स का उपयोग करते हैं, लेकिन एक गुणक की आवश्यकता होती है प्रथम। और अंतिम चरण यह देख रहा है कि यह परिणामी N / 2 × N / 2 मैट्रिक्स N / 2 DFT मैट्रिक्स के समान है और हम इसे बार-बार तब तक कर सकते हैं जब तक कि हम 1 × 1 मैट्रिक्स तक नहीं पहुँच जाते हैं जहाँ DFT एक पहचान कार्य है।

मूलांक 2 से परे सामान्य करने के लिए, आप हर तीसरी पंक्ति को विभाजित करके और कॉलम के तीन भाग, या हर 4 वें आदि को देख सकते हैं।

प्राइम आकार के इनपुट की स्थिति में, शून्य-पैड, एफएफटी और ट्रंकट को ठीक से करने की एक विधि मौजूद है, लेकिन यह इस उत्तर के दायरे से परे है।

देखें: http://whoiskylefinn.com/MatrixFFT.html


प्राइम एफएफटी , विभिन्न एफएफटी । शून्य-पैड का उपयोग करना एकमात्र विकल्प नहीं है। क्षमा करें, मुझे बस शून्य-गद्दी अतिप्रयोगित लगती है। एक छोटा सा सवाल, मुझे समझ में नहीं आ रहा है कि "प्रति परत निरंतर-नमूना आवश्यकता के साथ प्रत्येक परत" से आपका क्या मतलब है, अगर आप समझा सकते हैं, तो यह बहुत बढ़िया होगा।
ईविल

1
क्षमा करें, मेरे कहने का अर्थ यह नहीं था कि शून्य पैडिंग का तरीका था, बस आगे पढ़ने के लिए इशारा करना चाहता था। और "परत" का अर्थ है एक पुनरावृत्ति, या एक एन डीएफटी से 2 एन / 2 डीएफटी में एक अनुवाद, प्रति नमूना समय के साथ निरंतर समय का अर्थ यह कदम ओ (एन) है।
काइलफिन

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

यह अपलोड किया जाना चाहिए, मदद करनी चाहिए: whoiskylefinn.com/MatrixFFT.html
kylefinn

1

डीएफटी एक बल बल एन ^ 2 मैट्रिक्स को गुणा करता है।

कम्प्यूटेशनल लागत को कम करने के लिए FFTs मैट्रिक्स के गुणों का शोषण (मैट्रिक्स को कई गुना घटाकर) करता है।

आइए हम पहले एक छोटे DFT को देखें:

डब्ल्यू = fft (आंख (4));

x = रैंड (4,1) + 1j * रैंड (4,1);

X_ref = fft (x);

एक्स = डब्ल्यू * एक्स;

मुखर (अधिकतम (पेट (X-X_ref)) <1e-7)

महान इसलिए हम FFTW लाइब्रेरी से एक छोटे 4x4 (जटिल) मैट्रिक्स गुणन को FFT फ़ंक्शन से मैट्रिक्स भरकर कॉल करने में सक्षम हैं। तो यह मैट्रिक्स कैसा दिखता है?

एन = 4,

Wn = exp (-1j * 2 * pi / एन),

च = ((0: एन 1) '* (0: एन 1))

च =

 0     0     0     0
 0     1     2     3
 0     2     4     6
 0     3     6     9

डब्ल्यू = Wn। ^ F

W =

१ १ १ १ १

1 -आई -1 आई

1 -1 1 -1

१ आई -१ -आई

प्रत्येक तत्व या तो +1, -1, + 1j या -1j है। जाहिर है, इसका मतलब है कि हम पूर्ण जटिल गुणाओं से बच सकते हैं। इसके अलावा, पहला स्तंभ समान है, जिसका अर्थ है कि हम x के पहले तत्व को एक ही कारक से गुणा कर रहे हैं।

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

नीचे दी गई पंक्तियाँ फ़्रिक्वेंसी (डीआईएफ) मूलांक 2 फॉरवर्ड एफएफटी में एक सरल डिकिमेशन है। हालांकि कदम बोझिल लग सकते हैं, आगे FFT, radix4 / स्प्लिट-रेडिक्स या डिमेशन-इन-टाइम का पुन: उपयोग करना सुविधाजनक है, जबकि FFTs वास्तविक दुनिया में कैसे लागू होता है, इसका उचित प्रतिनिधित्व किया जा रहा है। मुझे विश्वास है।

एन = 4;

x = रैंडन (एन, 1) + 1j * रैंडन (एन, 1);

T1 = exp (-1j * 2 * pi * ([शून्य (1, N / 2), 0: (N / 2-1)]) '/ N)।

M0 = क्रोन (आँख (2), fft (eye (2))),

M1 = क्रोन (fft (eye) (2)), eye (2)),

एक्स = bitrevorder (एक्स। '* एम 1 * निदान (T1) * एम 0),

X_ref = fft (एक्स)

ज़ोर (अधिकतम (पेट (एक्स (:) - X_ref (:))) <1e-6)

सीएफ वैन लोन की इस विषय पर एक शानदार पुस्तक है।


1

यदि आप बुद्धि के फायरहॉस से पीना चाहते हैं, तो मेरा सुझाव है:

डगलस एफ। इलियट, के। राममोहन राव द्वारा "फास्ट ट्रांसफ़ॉर्म - एल्गोरिदम, एनालिसिस, एप्लिकेशन"

इसमें एफएफटी, हार्टले, विनोग्राद और एप्लिकेशन शामिल हैं।

एक मजबूत बिंदु यह है कि दिखाया गया है कि एफएफटी बिट रिवर्सल ऑर्डर के साथ विरल मैट्रिक्स फैक्टर का एक सेट है।

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