2011-09-28 9 views
26

मैं वर्तमान में कुछ चौकोर परिवर्तन एल्गोरिदम लिखने की कोशिश कर रहा हूं।असतत फूरियर

public class DFT { 
    public static Complex[] Transform(Complex[] input) { 
     int N = input.Length; 

     Complex[] output = new Complex[N]; 

     double arg = -2.0 * Math.PI/(double)N; 
     for (int n = 0; n < N; n++) { 
      output[n] = new Complex(); 
      for (int k = 0; k < N; k++) 
       output[n] += input[k] * Complex.Polar(1, arg * (double)n * (double)k); 
     } 
     return output; 
    } 
} 

तो मैं निम्नलिखित कोड के साथ इस एल्गोरिथ्म का परीक्षण किया:: मैं गणितीय परिभाषा में वर्णित के रूप में एक सरल एफ टी एल्गोरिथ्म के साथ शुरू किया

private int samplingFrequency = 120; 
    private int numberValues = 240; 

    private void doCalc(object sender, EventArgs e) { 
     Complex[] input = new Complex[numberValues]; 
     Complex[] output = new Complex[numberValues]; 

     double t = 0; 
     double y = 0; 
     for (int i = 0; i < numberValues; i++) { 
      t = (double)i/(double)samplingFrequency; 
      y = Math.Sin(2 * Math.PI * t); 
      input[i] = new Complex(y, 0); 
     } 

     output = DFT.Transform(input); 

     printFunc(input); 
     printAbs(output); 
    } 

परिवर्तन ठीक काम करता है, लेकिन केवल numberValues ​​यदि एक से अधिक है नमूनाकरण की संख्या फ़्रिक्वेंसी (इस मामले में: 120, 240, 360, ...)। 240 मूल्यों के लिए मेरे परिणाम Thats:

http://s1.directupload.net/images/110928/n3m8hqg6.jpg

परिवर्तन ठीक काम किया।

मैं 280 मूल्यों की गणना करने मैं इस परिणाम मिलता है कोशिश कर रहा हूँ, तो: अगर मैं अपने परिकलित मानों की संख्या में परिवर्तन

http://s7.directupload.net/images/110928/qizoiqbt.jpg

क्यों मैं एक गलत परिणाम मिल रहा है? मुझे यकीन नहीं है कि मेरी समस्या यहां मेरे कोड या डीएफटी की गणितीय परिभाषा की गलतफहमी है। किसी भी तरह से, क्या कोई मेरी समस्या से मेरी मदद कर सकता है? धन्यवाद।

+0

क्या आप मुझे बता सकते हैं कि आपके ट्रांसफॉर्म फ़ंक्शन के लिए इनपुट एक जटिल सरणी क्यों है?निश्चित रूप से यदि आप मानक ध्वनि तरंग (समय-डोमेन) से परिवर्तित हो रहे हैं, तो यह एक डबल डबल सरणी होगी? –

+2

ठीक है, मुझे लगता है - काल्पनिक हिस्सा 0 पर सेट है, इसलिए यह अनिवार्य रूप से बराबर है कि यह केवल एक डबल था। आपके कोड में, 'Complex.Polar' को 'Complex.FromPolarCordordates' होना चाहिए। –

+2

भूखंडों के लिए आप क्या उपयोग करते हैं? – GorillaApe

उत्तर

28

जो आप अनुभव कर रहे हैं उसे Spectral Leakage कहा जाता है।

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

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

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

4

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

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

संबंधित मुद्दे