कैसे और भी FFT लंबाई के लिए आवृत्ति अक्ष बनाने के लिए?


12

क्या मैं नकारात्मक आवृत्ति से सकारात्मक आवृत्ति (हर्ट्ज) में जाने वाली आवृत्ति अक्ष बनाने के बारे में सहायता प्राप्त कर सकता हूं, जो कि एफएफटी परिणाम में एक्स-अक्ष होगा, लेकिन एफएफटी, या विषम लंबाई एफएफटी या तो दी गई है। मुझे MATLAB में कुछ परेशानी हो रही है। (आप नमूना आवृत्ति f_s जानते हैं)।


1
यह आपको इकाई चक्र के चारों ओर समान रूप से फैले आवृत्तियों के बारे में सोचने में मदद कर सकता है। 4-बिंदु FFT में आवृत्ति डिब्बे हैं [0 / 4fs, 1 / 4fs, 2 / 4fs, 3 / 4fs], उदाहरण के लिए, जिसे आमतौर पर [0, fs / 4, fs / 2, -fs "लिखा जाता है। 4]। एक 3-बिंदु FFT में आवृत्ति डिब्बे हैं [0 / 3fs, 1 / 3fs, 2 / 3fs], या [0, fs / 3, -fs / 3] के रूप में लिखा जा सकता है। विषम आकारों के लिए यह समान दूरी पर
न्यक्विस्ट

@endolith इस सादृश्य ने मुझे बहुत मदद की, बहुत बहुत धन्यवाद!
मार्क लिमोइन

जवाबों:


5

एक दृष्टिकोण बस अनशिक्षित DFT आउटपुट के लिए फ़्रीक्वेंसी वेक्टर की गणना करना है (यानी आपको क्या करना है fft()बिना MATLAB के फ़ंक्शन से सीधे मिलेगा fftshift()), फिर अक्ष के नकारात्मक पक्ष पर स्थानों के अनुरूप होने वाली आवृत्तियों को फिर से बनाएं। उदाहरण:

% assume input signal "x", sampling frequency "fs"
% calculate FFT
X = fft(x,Nfft);
% calculate frequency spacing
df = fs / Nfft;
% calculate unshifted frequency vector
f = (0:(Nfft-1))*df;
% move all frequencies that are greater than fs/2 to the negative side of the axis
f(f >= fs/2) = f(f >= fs/2) - fs;
% now, X and f are aligned with one another; if you want frequencies in strictly
% increasing order, fftshift() them
X_normal_order = fftshift(X);
f_normal_order = fftshift(f);

Learnvst द्वारा प्रदान किया गया उत्तर भी काम करना चाहिए; यह इसके बारे में सोचने का एक और तरीका है जिसमें डी / एफटी आकार के लिए किसी विशेष आवरण की आवश्यकता नहीं है।


नमस्ते जेसन, क्या यह सुनिश्चित है कि यह कोड काम कर रहा है, क्योंकि अगर मैं इसे fs = 1000 और Nfft = 256 के साथ आज़माता हूं, तो मुझे जो f_normal_order मिलता है वह एक सकारात्मक संख्या के साथ शुरू होता है, नकारात्मक हो जाता है, और फिर फिर से सकारात्मक होता है। इसके अलावा लंबाई मिलान नहीं कर रहे हैं।
theGrapeBeyond

क्षमा करें, कोड में एक जोड़े को टाइप किया गया। यह अब काम करना चाहिए।
जेसन आर

9

आप एक सकारात्मक आवृत्ति स्पेक्ट्रम को काफी सरल बना सकते हैं (जहां fsनमूना दर है और NFFTfft डिब्बे की संख्या है)। एफएफटी एल्गोरिथ्म के मैटलैब कार्यान्वयन में, पहला तत्व हमेशा डीसी घटक होता है, इसलिए क्यों सरणी शून्य से शुरू होती है। This NFFT के विषम और सम मूल्य के लिए सही है।

%//Calculate frequency axis
df = fs/NFFT;
fAxis = 0:df:(fs-df);

यदि आपको आवृत्ति स्पेक्ट्रम को लपेटने की आवश्यकता है, तो आपको यह ध्यान रखना होगा कि क्या आपके पास एक विषम संख्या वाला NFFT है। वहाँ हमेशा एक डीसी घटक होने की जरूरत है , इसलिए। ।

df = fs/NFFT;
fAxis = (0:df:(fs-df)) - (fs-mod(NFFT,2)*df)/2;

ध्यान दें कि सकारात्मक आवृत्ति अक्ष की गणना ऊपर के समान कैसे होती है, लेकिन एफएफटी-शिफ्टेड शब्द बदल जाता है यहां तक ​​कि या विषम एफएफटी लंबाई भी।

ये कोड स्निपेट SO पर पोस्ट किए गए एक लंबे उत्तर से लिया गया था (जो आपको दिलचस्प लग सकता है) यहां पाया गया: /programming/9694297/matlab-fft-xaxis-limits-messel-up-and-fftshift/ 9699983 # 9699983


ठीक है, तो क्या मैं विषम NFFT के लिए भी इसका उपयोग कर सकता हूं?
theGrapeBeyond

आह क्षमा करें। -Ve से + ve आवृत्ति पर जाने पर मुझे थोड़ी जटिलता दिखाई देती है। मैंने उत्तर को थोड़ा बदल दिया है।
सीखें
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.