fft चरण स्पेक्ट्रम से चकित!


9

एक बहुत ही सरल MATLAB प्रयोग:

f = 200;  
fs = 1000;  
t = 0: 1/fs : 1;
x = cos(2*pi*f*t);  
plot(angle(fftshift(fft(x))));  

और यहाँ उत्पादन है: यहाँ छवि विवरण दर्ज करें

अब, उपरोक्त कोड स्निपेट में मामूली बदलाव किया गया; समय की अवधि को केवल 1 नमूने द्वारा कम करना, निम्नानुसार है:

f = 200;  
fs = 1000;  
t = 0: 1/fs : 1 - 1/fs;
x = cos(2*pi*f*t);  
plot(angle(fftshift(fft(x)))); 

और चरण स्पेक्ट्रम पूरी तरह से पागल हो जाता है:

यहाँ छवि विवरण दर्ज करें

प्रशन:

  1. पहले प्लॉट में, मैं बिन 700 पर एक शून्य चरण देखने की उम्मीद कर रहा था जो इस उदाहरण में 200 की सकारात्मक आवृत्ति से मेल खाती है। यह मामला प्रतीत नहीं होता है। दूसरे, मैं प्लॉट में ग्राफ के रेखीय भागों को नहीं समझता। मैं चरण घटकों की सराहना करता हूं जो तथाकथित संख्यात्मक शोर के कारण संभावित रूप से मौजूद हो सकते हैं, लेकिन फिर चरण में यह शोर इतना 'रैखिक' कैसे हो सकता है?

  2. दूसरे प्लॉट में, सिर्फ एक सैंपल को हटाने से फेज प्लॉट पर इतना कठोर प्रभाव क्यों पड़ेगा?

  3. क्या मैं यहां कुछ गलत कर रहा हूं?

जवाबों:


18

आप कुछ भी गलत नहीं कर रहे हैं, लेकिन आप यह भी ध्यान से नहीं सोच रहे हैं कि आपको क्या देखने की उम्मीद करनी चाहिए, यही कारण है कि आप परिणाम पर आश्चर्यचकित हैं। प्रश्न 1 के लिए, आपका अनुमान करीब है, लेकिन आपके पास वास्तव में पीछे की ओर चीजें हैं; यह संख्यात्मक शोर है जो आपके दूसरे को परेशान कर रहा है, न कि आपके पहले वाले को।

चित्र मदद कर सकते हैं। यहाँ पहले परीक्षण के लिए परिमाण और चरण के भूखंड हैं:

x = Cos[2.0 \[Pi] 200 Range[0, 1, 1/1000]];
fx = Fourier[x];
ListLinePlot[Abs[fx], PlotRange -> All]
ListLinePlot[Arg[fx], PlotRange -> All]

यहाँ छवि विवरण दर्ज करें

यहाँ छवि विवरण दर्ज करें

और दूसरा एक:

x = Cos[2.0 \[Pi] 200 Range[0, 1 - 1/1000, 1/1000]];
fx = Fourier[x];
ListLinePlot[Abs[fx], PlotRange -> All]
ListLinePlot[Arg[fx], PlotRange -> All]

यहाँ छवि विवरण दर्ज करें

यहाँ छवि विवरण दर्ज करें

तो यहाँ क्या हो रहा है? दूसरे को समझाना सबसे आसान है। पहला, दूसरे के FFT में परिमाण स्पेक्ट्रम में दिखाई देने वाली दो चोटियों को छोड़कर हर जगह शून्य आयाम है; यह FFT की परिभाषा के बाद से 1,000 डेटापॉइंट का उपयोग करके फॉर्म की आवृत्तियों को लौटाता है/1000 के लिये 0999, और इसलिए आपका संकेत एक आवृत्ति बिन पर बिल्कुल गिरता है । नतीजतन, अन्य 998 बिंदुओं पर आपका संकेत पूरी तरह से फ़्लोटिंग पॉइंट त्रुटियों के कारण मशीन के शोर के कारण है, और इसलिए आपका चरण स्पेक्ट्रम बकवास है, क्योंकि यह सचमुच छद्म आयामी संख्याओं का चरण है।

हालांकि, पहले एक के लिए, एफएफटी की परिभाषा फॉर्म की आवृत्तियों को शामिल करती है /1001 के लिये 01000, जबकि आपकी सिग्नल फ्रीक्वेंसी है 200/1000, जो रूप का नहीं है /1001। नतीजतन, आपके सिग्नल को वर्णक्रमीय रिसाव से चौड़ा किया जाता है , और लगभग हर जगह नॉनज़रो होगा। मैं चरण प्लॉट के भौतिक रूप पर टिप्पणी नहीं करूंगा, लेकिन मैं कहूंगा कि यह एक बंद विश्लेषणात्मक रूप को स्वीकार करता है।

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

ADDENDUM: यहां मैथेमेटिका के कुछ चित्र दिए गए हैं, जो कि पूर्ववर्ती पैराग्राफ में मेरे द्वारा बताए गए सिद्धांत का वर्णन करते हैं:

hue = Compile[{{z, _Complex}}, {(1.0 Arg[-z] + \[Pi])/(2 \[Pi]), 
Exp[1 - Max[Abs[z], 1]], Min[Abs[z], 1]}, 
CompilationTarget -> "C", RuntimeAttributes -> {Listable}];
L = 500;
data = Table[Boole[x <= 11 && y <= 11], {x, L}, {y, L}];
Image[hue@
RotateRight[
10 RotateRight[Fourier[RotateRight[data, {-5, -5}]], {L/2, L/2}]], 
ColorSpace -> Hue, Magnification -> 1]
Image[hue@
RotateRight[
10 RotateRight[Fourier[RotateRight[data, {-4, -4}]], {L/2, L/2}]], 
ColorSpace -> Hue, Magnification -> 1]
Image[hue@
RotateRight[
10 RotateRight[Fourier[RotateRight[data, {0, 0}]], {L/2, L/2}]], 
ColorSpace -> Hue, Magnification -> 1]

यहाँ छवि विवरण दर्ज करें

यहाँ छवि विवरण दर्ज करें

यहाँ छवि विवरण दर्ज करें

यहाँ छवि विवरण दर्ज करें

सभी तीन छवियां एक ही इनपुट सिग्नल के 2 डी फूरियर ट्रांसफॉर्म हैं (ए 1 1×1 1 की लंबाई के साथ शून्य के साथ 1 के गद्देदार का वर्ग 500×500), लेकिन इनपुट को 5, 4, और 0, और 200 डेटा पॉइंट्स द्वारा चक्रीय रूप से घुमाया गया है। परिमाण स्पेक्ट्रा (पिक्सेल चमक द्वारा एन्कोडेड) समान हैं, लेकिन चरण स्पेक्ट्रा पूरी तरह से अलग हैं! चरण एन्कोडिंग किया जाता है ताकि लाल करने के लिए 1 नक्शे,मैं हरे रंग के नक्शे, -1 सियान के नक्शे, और -मैंबैंगनी के नक्शे। इसका मतलब यह है कि जब मैं कहता हूं कि चरण स्पेक्ट्रा गैर-शिफ्ट अपरिवर्तनीय है, और इस प्रकार मानव दृश्य समझ के लिए उत्तरदायी नहीं है। उदाहरण के लिए, 200 डेटापॉइंट्स की चक्रीय पारी के साथ, यह बताना पूरी तरह से असंभव है कि चरण में क्या हो रहा है, क्योंकि यह सिर्फ स्थिर जैसा दिखता है, लेकिन इनपुट सिग्नल अन्य इनपुट मामलों की तुलना में अधिक जटिल नहीं है।


0

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


-1

गॉसियन वेव्स साइट चरण और उसके यादृच्छिक-व्यवहार के बारे में भाग का विवरण देती है: डंपस्टरडॉफ़स ने कहा कि फ्लोटिंग-पॉइंट त्रुटि की बात

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