web-dev-qa-db-fra.com

Pourquoi la FFT produit-elle des nombres complexes au lieu de nombres réels?

Toutes les implémentations FFT que nous avons rencontrées aboutissent à des valeurs complexes (avec des parties réelles et imaginaires), même si l'entrée de l'algorithme était un ensemble discret de nombres réels (entiers).

N'est-il pas possible de représenter le domaine fréquentiel uniquement en nombres réels?

71
steve landiss

La FFT est fondamentalement un changement de base. La base dans laquelle la FFT modifie votre signal d'origine est plutôt un ensemble d'ondes sinusoïdales. Pour pouvoir décrire toutes les entrées possibles, cette base doit pouvoir représenter la phase ainsi que l’amplitude; la phase est représentée par des nombres complexes.

Par exemple, supposons que vous transformiez un signal FFT en une seule onde sinusoïdale. En fonction de la phase, vous obtiendrez peut-être un résultat FFT entièrement réel. Mais si vous décalez la phase de votre entrée de quelques degrés, comment la sortie FFT peut-elle représenter cette entrée?

edit: Ceci est une explication un peu lâche, mais j'essaie juste de motiver l'intuition.

76
zmccord

La FFT vous fournit l'amplitude et phase. L'amplitude est codée en tant que magnitude du nombre complexe (sqrt (x ^ 2 + y ^ 2)) tandis que la phase est codée en tant qu'angle (atan2 (y, x)). Pour obtenir un résultat strictement réel de la FFT, le signal entrant doit présenter une symétrie uniforme (c.-à-d. X [n] = conj (x [N-n])).

Si vous ne vous souciez que de l'intensité, la magnitude du nombre complexe est suffisante pour l'analyse.

45
antijon

Oui, il est possible de représenter les résultats du domaine fréquentiel FFT d'une entrée strictement réelle en utilisant uniquement des nombres réels.

Ces nombres complexes dans le résultat de la FFT ne sont que 2 nombres réels, qui sont tous deux nécessaires pour vous donner les coordonnées 2D d'un vecteur de résultat ayant à la fois une longueur et un angle de direction (ou une magnitude et une phase). Et chaque composante de fréquence dans le résultat FFT peut avoir une amplitude et une phase uniques (par rapport à un point de l’ouverture FFT).

Un seul nombre réel ne peut représenter à la fois la magnitude et la phase. Si vous supprimez les informations de phase, cela pourrait facilement déformer massivement le signal si vous essayez de le recréer à l'aide d'un iFFT (et le signal n'est pas symétrique). Un résultat FFT complet nécessite donc 2 nombres réels par case FFT. Ces deux nombres réels sont regroupés dans certaines FFT dans un type de données complexe par convention commune, mais le résultat de la FFT pourrait facilement (et certaines FFT le font) simplement produire 2 vecteurs réels (un pour les coordonnées cosinus et un pour les coordonnées sinusoïdales).

Il existe également des routines FFT qui produisent directement la magnitude et la phase, mais elles fonctionnent plus lentement que les FFT qui produisent un résultat vectoriel complexe (ou deux réels). Il existe également des routines FFT qui ne calculent que la magnitude et jettent simplement les informations de phase, mais elles ne fonctionnent généralement pas plus rapidement que de vous permettre de le faire vous-même après une FFT plus générale. Peut-être sauveront-ils quelques lignes de code au codeur au prix de ne pas pouvoir être inversé. Mais beaucoup de bibliothèques ne se donnent pas la peine d’inclure ces formes de FFT plus lentes et moins générales, et laissent simplement le codeur convertir ou ignorer ce dont elles ont besoin ou pas.

De plus, beaucoup considèrent que les mathématiques impliquées sont un lot plus élégant en utilisant une arithmétique complexe.

(Ajouté :) Et, comme autre option, vous pouvez considérer les deux composants de chaque groupe de résultats FFT, au lieu de composants réels et imaginaires, en tant que composants pairs et impairs, tous les deux réels.

35
hotpaw2

Si votre coefficient FFT pour une fréquence donnée f est x + i y, Vous pouvez considérer x comme le coefficient d'un cosinus à cette fréquence, alors que y est le coefficient du sinus. Si vous ajoutez ces deux ondes pour une fréquence particulière, vous obtiendrez une onde déphasée à cette fréquence; la magnitude de cette onde est sqrt(x*x + y*y), égale à la magnitude du coefficient complexe.

La transformation discrète en cosinus (DCT) est un parent de la transformée de Fourier qui donne tous les coefficients réels. Une DCT en deux dimensions est utilisée par de nombreux algorithmes de compression image/vidéo.

18
comingstorm
  1. La transformée de Fourier discrète est fondamentalement une transformation d'un vecteur de nombres complexes dans le "domaine temporel" en un vecteur de nombres complexes dans le "domaine fréquentiel" (j'utilise des guillemets, car si vous appliquez les bons facteurs de mise à l'échelle, la DFT est propre inverse). Si vos entrées sont réelles, vous pouvez alors effectuer simultanément deux opérations DFT: Prenez les vecteurs d’entrée x et y et calculez F ( x + i y ). J'oublie comment vous séparez la DFT après coup, mais je soupçonne qu'il s'agit de symétrie et de conjugués complexes.

  2. La sorte transformée en cosinus discrète vous permet de représenter le "domaine fréquentiel" avec les réels, et est courante dans les algorithmes de compression avec perte (JPEG, MP3). Ce qui est surprenant (pour moi), c’est que cela fonctionne même s’il semble supprimer les informations de phase, mais cela semble également le rendre moins utile pour la plupart des traitements de signal un DCT).

J'ai probablement eu des détails faux;)

9
tc.