Manufatti in FFT


10

Di recente mi sono reso conto che gli FFT non sono perfetti. Significa che se prendo un segnale e poi prendo il suo FFT, e quindi eseguo un FFT inverso, l'output risultante non è esattamente uguale all'input. Ecco un'immagine per mostrarti cosa intendo:FFT non funziona sempre

Penso che l'immagine sia abbastanza autoesplicativa. Il segnale IFFT è solo una trasformazione inversa dello "spettro FFT" e il diagramma "Differenza" è la differenza tra il segnale IFFT e il segnale originale ( ).IFFT - Originale

Chiaramente ci sono alcuni artefatti, anche se sono davvero piccoli. Vorrei sapere perché si verificano in primo luogo. È a causa della finestra finita della trasformata di Fourier? O a causa di qualcosa nell'algoritmo FFT?

Nota: Questa trama ha 32 punti, ma ho controllato con 100, 1000, 1024, 256 e 64 punti, e c'è sempre questo residuo nella differenza di una grandezza simile (o o 10 - 15 ).10-1610-15


4
Tutta la matematica a precisione limitata ha questi errori, non solo le FFT.
endolito

Risposte:


16

Le differenze che vedi sono dovute a errori numerici nel formato a virgola mobile. Tutte le operazioni necessarie per eseguire una FFT e una FFT inversa possono essere eseguite solo con precisione finita e hai mostrato il risultato di questa precisione finita nel diagramma in basso a destra.


Ci sarebbe una situazione in cui questo errore potrebbe saltare oltre la precisione in virgola mobile?
Kitchi,

6
10-162-53

@Kitchi: sì, ci sono molte situazioni in cui gli errori numerici possono essere un grosso problema, anche in formato a virgola mobile. L'inversione della matrice sarebbe uno dei tanti esempi. Tutto ha a che fare con il numero della condizione .
Matt L.,

1
@MattL. - Meraviglioso! Grazie per il riferimento.
Kitchi,

7

In generale un numero non può essere rappresentato esattamente in forma digitale. Viene introdotto un errore. Se sei in Matlab puoi scrivere eps al comando, ti dà un numero.

EPS, senza argomenti, è la distanza da 1,0 al successivo numero di precisione maggiore maggiore, ovvero EPS = 2 ^ (- 52).

L'errore che vedi nel grafico è nell'intervallo restituito da eps (ovvero 2 ^ (- 52)).

Anche se ti aspetti valori reali nel tuo output dal tuo IFFT, potresti vedere che la tua parte immaginaria non è esattamente uguale a zero. Stessa cosa.

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.