Eşit ve tek FFT uzunluğu için frekans ekseni nasıl yapılır?


12

Negatif frekanstan pozitif frekansa (Hertz cinsinden) frekans ekseninin nasıl yapılacağı konusunda yardım alabilir miyim, bu bir FFT sonucundaki x ekseni olacaktır, ancak çift uzunluklu FFT veya tek uzunluklu FFT verildi. MATLAB'da bazı sıkıntılar yaşıyorum. (Örnekleme frekansını f_s bildiğinizi varsayalım).


1
Birim çemberin etrafında eşit aralıklarla yerleştirilmiş frekansları düşünmenize yardımcı olabilir. 4 noktalı bir FFT'nin, [0 / 4fs, 1 / 4fs, 2 / 4fs, 3 / 4fs] 'de, daha yaygın olarak [0, fs / 4, fs / 2, -fs / 4]. 3 noktalı bir FFT, [0 / 3fs, 1 / 3fs, 2 / 3fs] 'de frekans bölmelerine sahiptir veya [0, fs / 3, -fs / 3] olarak yazılabilir. Tek boyutlar için bu eşit aralık Nyquist frekansı üzerinden atlar, ancak her zaman 0 içerir.
endolith

@endolith Bu analoji bana çok yardımcı oldu, çok teşekkür ederim!
Mark LeMoine

Yanıtlar:


5

Bir yaklaşım basitçe, kaydırılmamış DFT çıkışı için frekans vektörünü hesaplamaktır (yani fft(), bir an yapmadan doğrudan MATLAB işlevinden alacağınız şey fftshift()), ardından eksenin negatif tarafındaki konumlara karşılık gelen frekansları yeniden ifade etmektir. Misal:

% 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 tarafından verilen cevap da işe yaramalıdır; bu, çift / tek DFT boyutları için herhangi bir özel kasa gerektirmeyen başka bir düşünme şeklidir.


Merhaba JasonR, bu kod çalışır emin, çünkü fs = 1000 ve Nfft = 256 ile denemek, olsun f_normal_order pozitif bir sayı ile başlar negatif ve sonra tekrar pozitif olur. Ayrıca uzunluklar eşleşmiyor.
TheGrapeBeyond

Üzgünüz, koddaki birkaç yazım hatası düzeltildi. Şimdi çalışmalı.
Jason R

9

Olumlu bir frekans spektrumu oldukça basit bir şekilde yapabilirsiniz ( fsörnekleme oranı ve NFFTfft kutularının sayısı nerede ). FFT algoritmasının Matlab uygulamasında, ilk eleman her zaman DC bileşenidir, bu nedenle dizi neden sıfırdan başlar. Bu NFFT'nin tek ve çift değerleri için geçerlidir.

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

Frekans spektrumunu sarmanız gerekiyorsa, tek numaralı NFFT'niz olup olmadığını dikkate almanız gerekir. Her zaman bir DC bileşeni olması gerekir . .

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

Pozitif frekans ekseninin hesaplamasının yukarıyla nasıl aynı olduğuna dikkat edin, ancak FFT-kaydırılan terim, çift veya tek FFT uzunluklarını karşılamak için değişir.

Bu kod parçacıkları burada bulunan SO'da (ilginç bulabileceğiniz) uzun bir cevaptan alınmıştır: /programming/9694297/matlab-fft-xaxis-limits-messing-up-and-fftshift/ 9699983 # 9699983


Tamam, o zaman bunu tek NFFT için de kullanabilir miyim?
TheGrapeBeyond

Ah Üzgünüm. -Ve'den + ve frekansa giderken hafif bir komplikasyon görüyorum. Cevabı biraz değiştirdim.
learnvst
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.