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.
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 " :
Mes questions spécifiques sont donc les suivantes :
-
À 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) ?
-
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 ?
-
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 ?
-
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.
0 votes
@MarkJeronimus : Pouvez-vous me recommander une implémentation efficace de la FFT en Java ? Si je me souviens bien, la raison pour laquelle j'ai choisi le code de l'université de Columbia était que la bibliothèque FFTW était trop complexe pour fonctionner sur un smartphone Android.
0 votes
J'ai trouvé quelques implémentations "optimisées" éparses, mais il s'agit essentiellement d'un seul algorithme. par N, donc si vous avez besoin d'une gamme de tailles, vous avez besoin de toutes ces routines. En pratique, j'ai principalement utilisé les Intel Integrated Performance Primitives (oui, à partir de Java, par le biais de JNA), mais ce n'est pas gratuit. À la maison, j'utilise essentiellement le même algorithme que celui que vous avez cité, mais écrit à partir de zéro en 2005 à l'aide d'un manuel. C'est juste une FFT (Fast Fourier Transform), rien de si "rapide" pour justifier le nom "Fast FFT".