Jak zrobić oś częstotliwości dla parzystej i nieparzystej długości FFT?

12

Czy mogę uzyskać pomoc dotyczącą tego, jak sprawić, by oś częstotliwości przechodziła od częstotliwości ujemnej do częstotliwości dodatniej (w hercach), która będzie osią x w wyniku FFT, ale biorąc pod uwagę FFT o parzystej długości lub FFT o nieparzystej długości. Mam problemy z zrobieniem go w MATLAB. (Załóżmy, że znasz częstotliwość próbkowania f_s).

TheGrapeBeyond
źródło
1
Pomoże ci pomyśleć o równomiernie rozmieszczonych częstotliwościach wokół okręgu jednostki. 4-punktowy FFT ma przedziały częstotliwości w [0 / 4fs, 1 / 4fs, 2 / 4fs, 3 / 4fs], na przykład, który jest częściej zapisywany jako [0, fs / 4, fs / 2, -fs / 4]. 3-punktowy FFT ma przedziały częstotliwości w [0 / 3fs, 1 / 3fs, 2 / 3fs], lub może być zapisany jako [0, fs / 3, -fs / 3]. W przypadku nieparzystych rozmiarów równe odstępy pomijają częstotliwość Nyquista, ale zawsze obejmują 0.
endolith
@endolith Ta analogia bardzo mi pomogła, dziękuję bardzo!
Mark LeMoine,

Odpowiedzi:

5

Jednym z podejść jest po prostu obliczenie wektora częstotliwości dla nieprzesuniętego wyjścia DFT (tj. Tego, co można uzyskać bezpośrednio z fft()funkcji MATLAB , bez robienia fftshift()), a następnie ponownie przypisać częstotliwości, które odpowiadają lokalizacjom po ujemnej stronie osi. Przykład:

% 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);

Odpowiedź udzielona przez learnvst powinna również działać; to tylko inny sposób myślenia o tym, który nie wymaga specjalnej obudowy dla parzystych / nieparzystych rozmiarów DFT.

Jason R.
źródło
Witaj JasonR, czy na pewno ten kod działa, ponieważ jeśli spróbuję z fs = 1000 i Nfft = 256, f_normal_order, który otrzymuję, zaczyna się od liczby dodatniej, staje się ujemny, a następnie ponownie dodatni. Również długości nie pasują.
TheGrapeBeyond
Przepraszamy, naprawiłem kilka literówek w kodzie. Powinno już działać.
Jason R
9

Możesz stworzyć dodatnie spektrum częstotliwości po prostu (gdzie fsjest częstotliwość próbkowania i NFFTliczba przedziałów FFT). W implementacji Matlaba algorytmu FFT pierwszym elementem jest zawsze składnik DC, dlatego tablica zaczyna się od zera. Dotyczy to nieparzystych i parzystych wartości NFFT.

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

Jeśli chcesz zawinąć widmo częstotliwości, musisz wziąć pod uwagę, czy masz nieparzystą NFFT. Zawsze musi istnieć komponent DC , więc. .

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

Zauważ, że obliczenie dodatniej osi częstotliwości jest identyczne jak powyżej, ale przesunięty o FFT składnik zmienia się, aby dostosować parzyste lub nieparzyste długości FFT.

Te fragmenty kodu zostały zaczerpnięte z długiej odpowiedzi opublikowanej na stronie SO (która może być dla Ciebie interesująca) znalezionej tutaj: /programming/9694297/matlab-fft-xaxis-limits-messing-up-and-fftshift/ 9699983 # 9699983

learnvst
źródło
Okej, więc czy mogę użyć tego również do nieparzystych NFFT?
TheGrapeBeyond
O przepraszam. Widzę niewielką komplikację przy przechodzeniu z częstotliwości od -ve do + ve. Nieznacznie zmieniłem odpowiedź.
learnvst