92 votes

Comprendre la sortie FFT

J'ai besoin d'aide pour comprendre le résultat du calcul de la TFD/FFT.

Je suis un ingénieur logiciel expérimenté et j'ai besoin d'interpréter certains relevés d'accéléromètres de smartphones, par exemple pour trouver les principales fréquences. Malheureusement, j'ai raté la plupart de mes cours d'EE à l'université il y a quinze ans, mais je me suis documenté sur la TFD et la FFT ces derniers jours (sans grand résultat, apparemment).

S'il vous plaît, pas de réponses du type "allez suivre un cours d'éducation physique". J'ai l'intention de le faire si mon employeur me paie :)

Voici donc mon problème :

J'ai capturé un signal à 32 Hz. Voici un échantillon d'une seconde de 32 points, que j'ai représenté sous forme de graphique dans Excel.

enter image description here

J'ai ensuite obtenu quelques Code FFT écrit en Java à l'université de Columbia (après avoir suivi les suggestions d'un billet sur " FFT fiable et rapide en Java ").

La sortie de ce programme est la suivante. Je pense qu'il exécute une FFT in-place, donc il réutilise le même tampon pour l'entrée et la sortie.

Before: 

Re: [0.887  1.645  2.005  1.069  1.069  0.69  1.046  1.847  0.808  0.617  0.792  1.384  1.782  0.925  0.751  0.858  0.915  1.006  0.985  0.97  1.075  1.183  1.408  1.575  1.556  1.282  1.06  1.061  1.283  1.701  1.101  0.702  ]

Im: [0.0  0.0  0.0  0.0  0.0  0.0  0.0  0.0  0.0  0.0  0.0  0.0  0.0  0.0  0.0  0.0  0.0  0.0  0.0  0.0  0.0  0.0  0.0  0.0  0.0  0.0  0.0  0.0  0.0  0.0  0.0  0.0  ]

After: 

Re: [37.054  1.774  -1.075  1.451  -0.653  -0.253  -1.686  -3.602  0.226  0.374  -0.194  -0.312  -1.432  0.429  0.709  -0.085  0.0090  -0.085  0.709  0.429  -1.432  -0.312  -0.194  0.374  0.226  -3.602  -1.686  -0.253  -0.653  1.451  -1.075  1.774  ]

Im: [0.0  1.474  -0.238  -2.026  -0.22  -0.24  -5.009  -1.398  0.416  -1.251  -0.708  -0.713  0.851  1.882  0.379  0.021  0.0  -0.021  -0.379  -1.882  -0.851  0.713  0.708  1.251  -0.416  1.398  5.009  0.24  0.22  2.026  0.238  -1.474  ]

Donc, à ce stade, je n'arrive pas à comprendre le résultat. Je comprends les concepts de la TFD, comme le fait que la partie réelle correspond aux amplitudes des ondes cosinusoïdales et la partie imaginaire aux amplitudes des ondes sinusoïdales. Je peux également suivre ce diagramme tiré de l'excellent ouvrage " Le guide du scientifique et de l'ingénieur pour le traitement des signaux numériques " : enter image description here

Mes questions spécifiques sont donc les suivantes :

  1. À partir de la sortie de la FFT, comment puis-je trouver les "fréquences les plus fréquentes" ? Cela fait partie de mon analyse des données de mon accéléromètre. Dois-je lire les tableaux réels (cosinus) ou imaginaires (sinus) ?

  2. J'ai une entrée de 32 points dans le domaine temporel. La sortie de la FFT ne devrait-elle pas être un tableau de 16 éléments pour les réels et un tableau de 16 éléments pour les imaginaires ? Pourquoi le programme me donne-t-il des sorties de tableaux réels et imaginaires de taille 32 ?

  3. En rapport avec la question précédente, comment puis-je analyser les index dans les tableaux de sortie ? Étant donné mon entrée de 32 échantillons échantillonnés à 32 Hz, je crois comprendre qu'un tableau de sortie de 16 éléments devrait avoir son index uniformément étalé jusqu'à la moitié de la fréquence d'échantillonnage (de 32 Hz), donc ai-je raison de comprendre que chaque élément du tableau représente (32 Hz * 1/2) / 16 = 1 Hz ?

  4. Pourquoi la sortie de la FFT a-t-elle des valeurs négatives ? Je pensais que les valeurs représentaient les amplitudes d'une sinusoïde. Par exemple, la sortie de Real[ 3 ] = -1.075 devrait signifier une amplitude de -1.075 pour une onde cosinusoïdale de fréquence 3. Est-ce exact ? Comment une amplitude peut-elle être négative ?

0 votes

Que voulez-vous calculer à partir des relevés de l'accéléromètre : vitesse, distance ? Le bruit des lectures de l'accéléromètre suit une distribution gaussienne et je ne vois pas comment l'ajustement d'une onde sinusoïdale pourrait y remédier.

2 votes

La balise java devrait être supprimée car elle est plus générique que celle d'un langage spécifique

0 votes

Si l'on regarde la source de l'université de Columbia, elle n'est pas du tout efficace. C'est une simple implémentation non optimisée de Cooley-Tucky avec des tables de consultation papillon, et l'inversion des bits est faite manuellement au lieu d'utiliser les fonctions existantes de la bibliothèque.

87voto

Nils Pipenbrinck Points 41006
  1. Vous ne devez ni chercher la partie réelle ni la partie imaginaire d'un nombre complexe (que ce qui est votre tableau réel et imaginaire). Vous devez plutôt chercher la magnitude de la fréquence qui est définie comme sqrt (real * real + imag * imag). Ce nombre sera toujours positif. Il ne vous reste plus qu'à rechercher la valeur maximale (ignorez la première entrée de votre tableau. Il s'agit de votre décalage en courant continu et il ne contient aucune information dépendant de la fréquence).

  2. Vous obtenez 32 sorties réelles et 32 sorties imaginaires car vous utilisez une FFT complexe à complexe. Rappelez-vous que vous avez converti vos 32 échantillons en 64 valeurs (ou 32 valeurs complexes) en les étendant avec des parties imaginaires nulles. Cela donne une sortie FFT symétrique où le résultat de la fréquence apparaît deux fois. Une fois prêt à être utilisé dans les sorties 0 à N/2, et une fois reflété dans les sorties N/2 à N. Dans votre cas, il est plus facile d'ignorer les sorties N/2 à N. Vous n'en avez pas besoin, elles sont juste un artefact sur la façon dont vous calculez votre FFT.

  3. L'équation entre la fréquence et le fichier fft est (bin_id * freq/2) / (N/2) où freq est la fréquence d'échantillonnage (c'est-à-dire 32 Hz, et N est la taille de votre FFT). Dans votre cas, cela se simplifie à 1 Hz par bin. Les cases N/2 à N représentent les fréquences négatives (concept étrange, je sais). Dans votre cas, ils ne contiennent pas d'informations significatives car ils sont juste un miroir des premières fréquences N/2.

  4. Les parties réelles et imaginaires de chaque case forment un nombre complexe. Il n'y a pas de problème si les parties réelles et imaginaires sont négatives alors que la magnitude de la fréquence elle-même est positive (voir ma réponse à la question 1). Je vous suggère de vous documenter sur les nombres complexes. Expliquer comment ils fonctionnent (et pourquoi ils sont utiles) dépasse ce qu'il est possible d'expliquer dans une seule question de stackoverflow.

Note : Vous pouvez également vous renseigner sur l'autocorrélation et sur la façon dont elle est utilisée pour trouver la fréquence fondamentale d'un signal. J'ai l'impression que c'est ce que vous voulez vraiment.

1 votes

Merci. Concernant le point 1 : j'ai vu cette page Matlab qui montre un spectre de fréquence ( mathworks.com/help/techdoc/ref/fft.html ). Sur cette page se trouve un graphique intitulé "Single-Sided Amplitude Spectrum of y(t)". Est-ce que ce graphique représente l'amplitude de la fréquence comme vous l'avez suggéré, sqrt(real^2 + img^2) ? Concernant le point 3 : je n'ai toujours pas obtenu le résultat de 2 Hz par case. Dans mon cas, N=32 et freq=32, n'est-ce pas ? Il y a donc N/2=32/2=16 cases, et la fréquence la plus élevée (Nyquist) est freq/2=32/2=16 Hz, ce qui donne 16 Hz pour 16 cases, soit 1 Hz par case ?

1 votes

Oui, le graphique montre la magnitude du spectre - |Y(f)|. Les barres de valeur absolue indiquent la magnitude. Largeur de bande = fréquence d'échantillonnage / taille de la FFT. Votre taux d'échantillonnage est de 32 hz, votre taille FFT est de 32. Oui, vous avez raison à propos de la largeur du bin !

0 votes

Fixe la fréquence du bac.

11voto

Paul R Points 104036

Vous avez déjà de bonnes réponses, mais je vais juste ajouter que vous devez vraiment appliquer un fonction de fenêtre à vos données dans le domaine temporel avant la FFT, sinon vous obtiendrez de méchants artefacts dans votre spectre, en raison de fuite spectrale .

0 votes

Je comprends que beaucoup de temps s'est écoulé depuis cette réponse Cependant, pourriez-vous préciser de quel type d'artefacts vous parlez ?

1 votes

@MattHusz : le terme général pour l'origine de ces artefacts est "fuite spectrale" - j'ai ajouté un lien vers la réponse qui explique cela. La meilleure façon dont je peux décrire l'effet est que votre spectre sera "étalé" en raison de la fenêtre rectangulaire implicite.

6voto

duskwuff Points 69245

1) Cherchez les indices dans le tableau réel avec les valeurs les plus élevées, à part le premier (c'est la composante DC). Vous aurez probablement besoin d'un taux d'échantillonnage considérablement plus élevé que 32 Hz, et d'une plus grande taille de fenêtre, pour obtenir des résultats significatifs.

2) La seconde moitié des deux tableaux est le miroir de la première moitié. Par exemple, notez que le dernier élément du tableau réel (1,774) est le même que le deuxième élément (1,774), et que le dernier élément du tableau imaginaire (1,474) est le même que le deuxième élément (1,474). négatif du deuxième élément.

3) La fréquence maximale que vous pouvez capter à une fréquence d'échantillonnage de 32 Hz est de 16 Hz ( limite de Nyquist ), donc chaque étape est de 2 Hz. Comme indiqué précédemment, n'oubliez pas que le premier élément est 0 Hz (c'est-à-dire le décalage en courant continu).

4) Bien sûr, une amplitude négative est parfaitement logique. Cela signifie simplement que le signal est "inversé" -- une FFT standard est basée sur un cosinus, qui a normalement la valeur = 1 à t = 0, donc un signal qui avait la valeur = -1 au temps = 0 aurait une amplitude négative.

0 votes

Merci de votre réponse. (1) Voulez-vous dire que je peux ignorer le tableau imaginaire (sinus), et si oui, pourquoi ? La composante sinusoïdale doit sûrement être importante ? (2) Pourquoi ce miroir se produit-il ? Est-ce simplement le résultat de l'algorithme FFT ? La plupart des gens ignorent-ils la moitié réfléchie ? (3) Comment avez-vous calculé les pas de 2Hz ? Je comprends que la limite de Nyquist est de 16Hz, donc s'il y a 16 éléments de matrice (non-mirroïsés), chaque élément doit être de 16 Hz/16 = 1 Hz chacun ? (4) Pour trouver les fréquences principales, dois-je simplement prendre la valeur absolue des valeurs d'amplitude dans les tableaux de sortie ?

0 votes

Vous ne devez pas chercher la valeur la plus élevée dans le tableau réel, et vous ne pouvez pas ignorer le tableau sinus/I. Vous voulez plutôt la magnitude du vecteur complexe composite. L'effet miroir se produit parce que la moitié de l'entrée (le tableau I) est composée de zéros, et le résultat a donc la moitié des degrés de liberté. Vous pouvez l'ignorer si vos données sont strictement réelles.

0 votes

@duskwuff Merci beaucoup : vous avez donné une réponse à une question que j'allais poster, si je n'avais pas trouvé votre réponse : comment interpréter la SECONDE partie de la FFT. Je veux modifier les données et effectuer l'inverse et j'ai continué à n'obtenir que des demi-résultats, parce que j'ai modifié les mauvaises données dans cette partie. Merci encore.

5voto

hotpaw2 Points 40796

Notez que la "fréquence la plus fréquente" peut être dispersée dans plusieurs cases de la FFT, même avec une fonction de fenêtre. Vous devrez donc peut-être utiliser une fenêtre plus longue, des fenêtres multiples ou une interpolation pour mieux estimer la fréquence des pics spectraux.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X