จะสร้างแกนความถี่สำหรับความยาว FFT ที่เท่ากันและคี่ได้อย่างไร


12

ฉันสามารถขอความช่วยเหลือเกี่ยวกับวิธีทำให้แกนความถี่เปลี่ยนจากความถี่ลบเป็นความถี่บวก (เป็นเฮิรตซ์) ซึ่งจะเป็นแกน x ในผลลัพธ์ FFT แต่ให้ FFT ยาวหรือคี่ความยาวคี่ ฉันมีปัญหาในการทำใน MATLAB (สมมติว่าคุณรู้จักความถี่การสุ่มตัวอย่าง f_s)


1
มันอาจช่วยให้คุณคิดเกี่ยวกับความถี่ที่เว้นระยะรอบวงหน่วย FFT 4 จุดมีความถี่ถังขยะที่ [0 / 4fs, 1 / 4fs, 2 / 4fs, 3 / 4fs] ตัวอย่างเช่นซึ่งเขียนโดยทั่วไปมากกว่า [0, fs / 4, fs / 2, -fs / 4] FFT 3 จุดมีความถี่ถังขยะที่ [0 / 3fs, 1 / 3fs, 2 / 3fs] หรือสามารถเขียนเป็น [0, fs / 3, -fs / 3] สำหรับขนาดที่ผิดปกติช่องว่างที่เท่ากันนี้จะข้ามความถี่ Nyquist แต่จะรวม 0 เสมอ
endolith

@endolith อุปมานี้ช่วยฉันอย่างมากขอบคุณมาก!
Mark

คำตอบ:


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 ควรใช้ได้เช่นกัน นี่เป็นอีกวิธีหนึ่งในการคิดเกี่ยวกับเรื่องนี้ซึ่งไม่จำเป็นต้องมีปลอกพิเศษสำหรับขนาด DFT ที่สม่ำเสมอ / คู่


สวัสดี JasonR แน่ใจหรือไม่ว่ารหัสนี้ใช้งานได้เพราะถ้าฉันลองกับ fs = 1,000 และ Nfft = 256 f_normal_order ที่ฉันเริ่มต้นด้วยจำนวนบวกกลายเป็นลบแล้วก็บวกอีกครั้ง ความยาวไม่ตรงกัน
TheGrapeBeyond

ขออภัยแก้ไขความผิดพลาดบางอย่างในรหัส มันควรจะทำงานตอนนี้
Jason R

9

คุณสามารถสร้างสเปกตรัมความถี่ในเชิงบวกได้ค่อนข้างง่าย (ซึ่งfsเป็นอัตราการสุ่มตัวอย่างและNFFTจำนวนของถังขยะ fft) ในการดำเนินการตามขั้นตอนวิธี Matlab ของ FFT องค์ประกอบแรกมักเป็นส่วนประกอบ DC เสมอดังนั้นทำไมอาร์เรย์จึงเริ่มจากศูนย์ สิ่งนี้เป็นจริงสำหรับค่าคี่และคู่ของ NFFT

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

หากคุณต้องการห่อคลื่นความถี่คุณต้องคำนึงว่าคุณมี NFFT ที่เป็นเลขคี่หรือไม่ จะต้องมีส่วนประกอบ DCเสมอ .

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

ขอให้สังเกตว่าการคำนวณของแกนความถี่บวกนั้นเหมือนกันกับข้างต้น แต่คำที่เลื่อน FFT เปลี่ยนไปเพื่อรองรับความยาว FFT ที่เท่ากันหรือคี่

ตัวอย่างโค้ดเหล่านี้นำมาจากคำตอบยาว ๆ ที่โพสต์บน SO (ซึ่งคุณอาจพบว่าน่าสนใจ) พบได้ที่นี่: /programming/9694297/matlab-fft-xaxis-limits-messing-up-and-fftshift/ 9699983 # 9699983


โอเคฉันสามารถใช้สิ่งนี้กับ NFFT คี่ได้เช่นกัน?
TheGrapeBeyond

ขอโทษด้วย ฉันเห็นความยุ่งยากเล็กน้อยเมื่อเปลี่ยนจาก -ve เป็น + ve frequency ฉันเปลี่ยนคำตอบเล็กน้อย
Learnvst
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.