Perché la trasformata di Fourier di un singolo ciclo sinusoidale non è una singola barra?


12

Ho provato diversi codici di trasformata di Fourier là fuori su singole onde sinusoidali e tutti producono uno spettro distribuito con una risonanza alla frequenza del segnale quando dovrebbero teoricamente visualizzare una singola barra.

La frequenza di campionamento ha scarso effetto (qui 10kHz), tuttavia il numero di cicli fa:

Un ciclo:

inserisci qui la descrizione dell'immagine

100 cicli:

inserisci qui la descrizione dell'immagine

100000 cicli:

inserisci qui la descrizione dell'immagine

Sembra che la trasformata di Fourier converge solo per un numero infinito di cicli, perché? Una finestra temporale di esattamente un ciclo non dovrebbe portare gli stessi risultati di quella di N cicli?

Applicazione: Questo è sia per curiosità sia anche perché voglio ottenere quanto la risposta al gradino di un sistema del primo ordine sarà entusiasmante per la risonanza di un assemblaggio meccanico. Pertanto ho bisogno di una trasformazione di Fourier accurata della risposta ... di cui non mi fido più. Cosa potrei fare per migliorare la precisione allora, sulla base del caso "sinusoidale"?

inserisci qui la descrizione dell'immagine

PS: questi screenshot particolari si basano sul codice qui .


6
Oltre alla risposta accettata, nota che non c'è motivo di credere che la trasformata di Fourier a tempo discreto (che stai calcolando usando il DFT) sarebbe un impulso per un segnale di ingresso che è un periodo di una sinusoide. La trasformata di Fourier a tempo continuo di una sinusoide è un impulso, sì, ma quella sinusoide ha una durata infinita. Quando si limita il segnale nel tempo, ciò equivale alla moltiplicazione per una funzione di finestra rettangolare. Il risultato nel dominio della frequenza è la convoluzione dell'impulso e la trasformata di Fourier della finestra, che è essenzialmente ciò che stai osservando.
Jason R,

Grazie per l'osservazione. Quindi, come si spiega che se cambio il numero NFFT alla lunghezza del vettore, il risultato è una singola barra?
Mister Mystère,

1
Buona domanda. Ciò si verifica a causa di un presupposto intrinseco nel DFT. Si presume che il segnale a lunghezza finita fornito all'ingresso del DFT si estenda periodicamente in entrambe le direzioni con durata infinita. Pertanto, quando si ha un numero intero di cicli all'interno dell '"apertura" del DFT, si finisce con la trasformazione di una sinusoide di durata infinita: un singolo impulso. Ciò corrisponde al caso di una perdita spettrale esattamente pari a zero e raramente si verifica nella pratica.
Jason R,

Risposte:


30

Questo è un manufatto per finestre.

Il codice collegato genera un segnale di 10.000 campioni con zero in modo che la lunghezza sia una potenza di due.

%% Author :- Embedded Laboratory

%%This Project shows how to apply FFT on a signal and its physical 
% significance.

fSampling = 10000;          %Sampling Frequency
tSampling = 1/fSampling;    %Sampling Time
L = 10000;                  %Length of Signal
t = (0:L-1)*tSampling;      %Time Vector
F = 100;                    %Frequency of Signal

%% Signal Without Noise
xsig = sin(2*pi*F*t);
...

%%Frequency Transform of above Signal
subplot(2,1,2)
NFFT = 2^nextpow2(L);
Xsig = fft(xsig,NFFT)/L;
...

Si noti che nel codice sopra, FFT è preso con la dimensione FFT NFFTche è la potenza successiva di 2 più grande della lunghezza del segnale (in questo caso, 16.384.) Dalla documentazione di Mathworksfft() :

Y = fft(X,n)restituisce il punto DFT n-point. fft(X)è equivalente a fft(X, n)dove nè la dimensione della Xprima dimensione nonsingleton. Se la lunghezza di Xè inferiore a n, Xviene riempita con zeri finali alla lunghezza n. Se la lunghezza di Xè maggiore di n, la sequenza Xviene troncata. Quando Xè una matrice, la lunghezza delle colonne viene regolata allo stesso modo.

Ciò significa che in realtà non stai prendendo una FFT di una 'onda sinusoidale pura' - stai prendendo la FFT di un'onda sinusoidale con un segnale piatto dopo di essa.

Ciò equivale a prendere la FFT di un'onda sinusoidale moltiplicata per una funzione di finestra quadrata. Lo spettro FFT è quindi la convoluzione dello spettro di frequenza dell'onda sinusoidale (una funzione di impulso) con lo spettro di frequenza dell'onda quadra (sinc (f).)

Se si modifica in L = 16,384modo che non vi sia alcuna spaziatura zero del segnale, si osserverà una perfectFFT.

Ulteriori parole chiave di ricerca: "Perdita spettrale", "Funzione finestra", "Finestra Hamming".


Modifica: ho ripulito del materiale che ho scritto su questo argomento all'università, che va sostanzialmente più in dettaglio. L'ho pubblicato sul mio blog .


Era proprio di fronte alla mia faccia per tutto questo tempo. Ben fatto signore, ho appena cambiato il numero NFFT con la lunghezza del vettore e lo ha fatto.
Mister Mystère,

1
@ MisterMystère: vedi modifica per il link al materiale pertinente che ho scritto all'università. Una spiegazione molto più approfondita, comprese le immagini.
Li-aung Yip,

(Anche se ho dimenticato di digitare nuovamente le formule matematiche - risolto ora.)
Li-aung Yip

Solo un promemoria che ci sono pochi vantaggi nel padding di nextpow2 usando gli algoritmi FFT di Matlab, che credo siano fftw (la trasformata di Fourier più veloce in Occidente)
Scott Seidman,
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.