Artefacts dans la FFT

10

J'ai récemment réalisé que les FFT n'étaient pas parfaites. Ce qui signifie que si je prends un signal et que je prends ensuite sa FFT, puis que je fais une FFT inverse, la sortie résultante n'est pas exactement la même que l'entrée. Voici une image pour vous montrer ce que je veux dire:La FFT ne fonctionne pas toujours

Je pense que l'image est assez explicite. Le signal IFFT est juste une transformation inverse du "spectre FFT" et le tracé "Différence" est la différence entre le signal IFFT et le signal d'origine ( ).IFFT - Original

De toute évidence, il existe des artefacts, bien qu'ils soient vraiment petits. Je voudrais savoir pourquoi ils se produisent en premier lieu. Est-ce à cause de la fenêtre finie de la transformée de Fourier? Ou à cause de quelque chose dans l'algorithme FFT?

10161015

Kitchi
la source
4
Toutes les mathématiques à précision limitée contiennent ces erreurs, pas seulement les FFT.
endolith

Réponses:

16

Les différences que vous voyez sont dues à des erreurs numériques au format virgule flottante. Toutes les opérations nécessaires pour effectuer une FFT et une FFT inverse ne peuvent être effectuées qu'avec une précision finie et vous avez montré le résultat de cette précision finie dans votre graphique inférieur droit.

Matt L.
la source
Y aurait-il une situation où cette erreur pourrait exploser au-delà de la précision en virgule flottante?
Kitchi
6
1016253
@Kitchi: oui, il existe de nombreuses situations où les erreurs numériques peuvent être un problème majeur, même au format à virgule flottante. L'inversion de matrice serait l'un des nombreux exemples. Tout cela a à voir avec le numéro de condition .
Matt L.
1
@MattL. - Magnifique! Merci pour la référence.
Kitchi
7

En général, un nombre ne peut pas être représenté exactement sous forme numérique. Une erreur est introduite. Si vous êtes dans Matlab, vous pouvez écrire eps à la commande, cela vous donne un nombre.

EPS, sans argument, est la distance de 1,0 au nombre suivant de double précision supérieur, c'est-à-dire EPS = 2 ^ (- 52).

L'erreur que vous voyez dans votre tracé est dans la plage renvoyée par eps (c'est-à-dire 2 ^ (- 52)).

Même si vous attendez des valeurs réelles dans votre sortie de votre IFFT, vous pouvez voir que votre partie imaginaire n'est pas exactement égale à zéro. Même chose.

niaren
la source