2013-03-05 11 views
5

अगर मैं एक तरंग x ऐसे"विस्तारित" IFFT

x = [math.sin(W*t + Ph) for t in range(16)] 

के रूप में मनमाने ढंग से W और Ph साथ है, और मुझे

f = numpy.fft.rfft(x) 

मैं मूल प्राप्त कर सकते हैं के साथ अपने (रियल) FFT f गणना x

numpy.fft.irfft(f) 

अब, अगर मुझे पुनर्प्राप्त तरंगों की सीमा को बाएं और दाईं ओर कई नमूने बढ़ाने की आवश्यकता है तो क्या होगा? अर्थात। एक तरंग y जैसे len(y) == 48, y[16:32] == x और y[0:16], y[32:48] मूल तरंग के आवधिक विस्तार हैं।

दूसरे शब्दों में, FFT मान लिया गया है उसके इनपुट एक अनंत समारोह f(t)t = 0, 1, ... N-1 से अधिक नमूना, कैसे मैं t<0 और t>=N के लिए f(t) के मूल्यों ठीक हो सकता है है तो क्या होगा?

नोट: मैं एक उदाहरण के रूप एक आदर्श साइन वेव इस्तेमाल किया, लेकिन व्यवहार x में कुछ भी हो सकता है: इस तरह के x = range(16) या x = np.random.rand(16), या एक यादृच्छिक .wav फ़ाइल से लिया किसी भी लम्बाई का एक खंड के रूप में मनमाने ढंग से संकेत है।

+1

आप इस प्रश्न को http://dsp.stackexchange.com/ में भी पूछ सकते हैं, बस मामले में। – heltonbiker

+1

दो मंचों पर एक प्रश्न न पूछें। अगर आपको एहसास हुआ कि आपने गलत जगह पर पूछा है, तो कहीं और हटाएं और पूछें, या इसे मॉडरेटर से आगे बढ़ने के लिए कहें। http://meta.stackexchange.com/questions/64068/is-cross-posting-a-question-on-multiple-stack-exchange-sites-ermated-if-the-qu –

उत्तर

3

अब, अगर मुझे पुनर्प्राप्त तरंगों की सीमा को बाएं और दाएं कोने के कई नमूने बढ़ाने की आवश्यकता है तो क्या होगा? अर्थात। एक वेवफ़ॉर्म वाई जैसे कि लेन (वाई) == 48, वाई [16:32] == x और y [0:16], y [32:48] मूल तरंग के आवधिक एक्सटेंशन हैं।

आवधिक विस्तार भी कर रहे हैं सिर्फ एक्स क्योंकि यह आवधिक विस्तार है।

दूसरे शब्दों में, अगर FFT मान लिया गया है उसके इनपुट एक अनंत समारोह च (टी) टी से अधिक नमूना है = 0, 1, ... एन -1, मैं च के मूल्यों कैसे ठीक हो सकता है (टी) टी < 0 और टी> = एन के लिए?

"एन सूत्री FFT मान लिया गया है" कि आपके संकेत एन की एक अवधि है ऐसा इसलिए है क्योंकि सभी हार्मोनिक आधार कार्य अपने ब्लॉक में विघटित किया जाता है रास्ते में समय-समय पर कर रहे हैं के साथ समय-समय पर है कि पिछले एन और succeding एन नमूने मुख्य एन नमूने की सिर्फ एक प्रति हैं।

यदि आप W के लिए किसी भी मूल्य की अनुमति देते हैं तो आपका इनपुट साइनसॉइड एन की आवधिकता के साथ आवधिक नहीं होगा। लेकिन यह एफएफटी फ़ंक्शन को कई आवधिक साइनसियोड के योग में विघटित करने से नहीं रोकता है। और एन की आवधिकता के साथ आवधिक साइनसॉइड की मात्रा में एन

स्पष्ट रूप से, आपको समस्या पर पुनर्विचार करना होगा।

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

इस तरह की रैखिक भविष्यवाणी वास्तव में साइनसॉइड नमूने की भविष्यवाणी करने में सक्षम है। इसलिए, यदि आपका इनपुट मनमानी डब्ल्यू और पी के लिए पाप (डब्ल्यू * टी + पी) है तो आपको केवल दो ऑर्डर के साथ रैखिक भविष्यवाणी की आवश्यकता होगी। अधिक जटिल सिग्नल के लिए मैं सुझाव देता हूं कि 10 या 16.

+0

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

3

निम्नलिखित उदाहरण आप कैसे इसके बारे में जाने के लिए की एक अच्छा विचार देना चाहिए:

>>> x1 = np.random.rand(4) 
>>> x2 = np.concatenate((x1, x1)) 
>>> x3 = np.concatenate((x1, x1, x1)) 
>>> np.fft.rfft(x1) 
array([ 2.30410617+0.j  , -0.89574460-0.26838271j, -0.26468792+0.j  ]) 
>>> np.fft.rfft(x2) 
array([ 4.60821233+0.j  , 0.00000000+0.j  , 
     -1.79148921-0.53676542j, 0.00000000+0.j  , -0.52937585+0.j  ]) 
>>> np.fft.rfft(x3) 
array([ 6.91231850+0.j  , 0.00000000+0.j  , 
     0.00000000+0.j  , -2.68723381-0.80514813j, 
     0.00000000+0.j  , 0.00000000+0.j  , -0.79406377+0.j  ]) 
बेशक

तीन अवधियों प्राप्त करने के लिए सबसे आसान तरीका है समय डोमेन व्युत्क्रम FFT के 3 प्रतियां श्रेणीबद्ध करने के लिए है:

np.concatenate((np.fft.irfft(f),) * 3) 

लेकिन अगर आप चाहते हैं या आवृत्ति डोमेन ऐसा करने के लिए है, तो आप निम्न कर सकते हैं:

>>> a = np.arange(4) 
>>> f = np.fft.rfft(a) 
>>> n = 3 
>>> ext_f = np.zeros(((len(f) - 1) * n + 1,), dtype=f.dtype) 
>>> ext_f[::n] = f * n 
>>> np.fft.irfft(ext_f) 
array([ 0., 1., 2., 3., 0., 1., 2., 3., 0., 1., 2., 3.]) 
+0

धन्यवाद। क्या यह समाधान अभी भी काम करेगा यदि मूल तरंग चरण चरणबद्ध नहीं है? कहें, 'x = [math.sin (डब्ल्यू * i + Ph) मैं रेंज में (16)]' मनमाने ढंग से 'डब्ल्यू' और 'पीएच' के साथ। समय-डोमेन concatenation निश्चित रूप से नहीं होगा। –

+0

'x = range (16) 'या' x = np.random.rand (16)' जैसे मनमाने ढंग से तरंगों के बारे में क्या? –

+0

@ मार्टिनब्लैच मुझे लगता है कि sellibitze का जवाब इस टिप्पणी में आपके नए प्रश्न को शामिल करता है। आवधिक कार्यों के लिए एफएफटी बहुत अच्छे हैं, लेकिन यदि आप इसे '[0, 1, 2, 3]' फ़ीड करना चाहते हैं और '[-4, -3, -2, -1, 0, 1, 2, 3, 4, 5, 6, 7] 'तो आपको कहीं और देखना होगा। और सबसे पहले आपको जो करना है वह अपने प्रश्न को एक स्पष्ट तरीके से परिभाषित करना है। एफएफटी मूल डेटा को जोड़कर आवधिक विस्तार करता है, जो इसके बारे में जाने का एक बहुत ही उचित तरीका है। यदि वह नहीं है जो आप चाहते हैं, तो आप इसे वास्तव में कैसे करना चाहते हैं? – Jaime

1

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

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