Come realizzare un asse di frequenza per una lunghezza FFT pari e dispari?


12

Posso ottenere assistenza su come fare in modo che l'asse della frequenza passi dalla frequenza negativa alla frequenza positiva (in Hertz), che sarà l'asse x in un risultato FFT, ma dato un FFT di lunghezza pari o FFT di lunghezza dispari. Sto riscontrando dei problemi nel farlo in MATLAB. (Supponiamo di conoscere la frequenza di campionamento f_s).


1
Può aiutarti a pensare alle frequenze spaziate equamente attorno al cerchio unitario. Un FFT a 4 punti ha bin di frequenza a [0 / 4fs, 1 / 4fs, 2 / 4fs, 3 / 4fs], per esempio, che è più comunemente scritto come [0, fs / 4, fs / 2, -fs / 4]. Un FFT a 3 punti ha bin di frequenza a [0 / 3fs, 1 / 3fs, 2 / 3fs] o può essere scritto come [0, fs / 3, -fs / 3]. Per dimensioni dispari questa spaziatura uguale salta sulla frequenza di Nyquist, ma include sempre 0.
endolith

@endolith Questa analogia mi ha aiutato immensamente, grazie mille!
Mark LeMoine,

Risposte:


5

Un approccio consiste semplicemente nel calcolare il vettore di frequenza per l'uscita DFT non spostata (ovvero ciò che otterresti direttamente dalla fft()funzione MATLAB , senza fare un fftshift()), quindi rimappare le frequenze che corrispondono alle posizioni sul lato negativo dell'asse. Esempio:

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

Anche la risposta fornita da learnvst dovrebbe funzionare; questo è solo un altro modo di pensarci che non richiede alcun involucro speciale per dimensioni DFT pari / dispari.


Ciao JasonR, è sicuro che questo codice funzioni, poiché se lo provo con fs = 1000 e Nfft = 256, il f_normal_order che ottengo inizia con un numero positivo, diventa negativo e poi di nuovo positivo. Anche le lunghezze non corrispondono.
TheGrapeBeyond,

Spiacenti, risolto un paio di errori di battitura nel codice. Dovrebbe funzionare ora.
Jason R,

9

È possibile creare uno spettro di frequenza positivo in modo abbastanza semplice (dov'è fsla frequenza di campionamento ed NFFTè il numero di bin fft). Nell'implementazione Matlab dell'algoritmo FFT, il primo elemento è sempre il componente DC, quindi l'array inizia da zero. Questo vale per i valori pari e dispari di NFFT.

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

Se è necessario avvolgere lo spettro di frequenza, è necessario considerare se si dispone di un NFFT con numeri dispari. C'è sempre bisogno di un componente DC , quindi. .

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

Notare come il calcolo dell'asse di frequenza positivo sia identico a quanto sopra, ma il termine spostato FFT cambia per adattarsi alle lunghezze FFT pari o dispari.

Questi frammenti di codice sono stati presi da una lunga risposta pubblicata su SO (che potresti trovare interessante) trovata qui: /programming/9694297/matlab-fft-xaxis-limits-messing-up-and-fftshift/ 9699983 # 9699983


Okay, quindi posso usare anche questo per NFFT dispari?
TheGrapeBeyond

Mi dispiace. Vedo la leggera complicazione quando si passa da -ve a + ve frequenza. Ho leggermente modificato la risposta.
impara il
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.