web-dev-qa-db-fra.com

Comprendre la sortie FFT

J'ai besoin d'aide pour comprendre la sortie du calcul DFT/FFT.

Je suis un ingénieur logiciel expérimenté et j'ai besoin d'interpréter certaines lectures d'accéléromètre de smartphone, telles que trouver les fréquences principales. Malheureusement, j'ai dormi dans la plupart de mes cours universitaires d'EE il y a quinze ans, mais je lis sur DFT et FFT depuis plusieurs jours (en vain, apparemment).

S'il vous plaît, aucune réponse de "allez suivre un cours d'EE". Je prévois en fait 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 tracé dans Excel.

enter image description here

J'ai ensuite obtenu --- code FFT écrit en Java de Columbia University (après avoir suivi les suggestions dans un post sur " FFT fiable et rapide en Java = ").

Le résultat de ce programme est le suivant. Je crois qu'il exécute une FFT sur place, il réutilise donc 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 ne peux pas faire de tête ou de queue de la sortie. Je comprends les concepts de la DFT, comme la partie réelle étant les amplitudes des ondes cosinus composantes et la partie imaginaire étant les amplitudes des ondes sinusoïdales composantes. Je peux également suivre ce diagramme du grand livre " Le guide du scientifique et de l'ingénieur pour le traitement numérique du signal ": enter image description here

Mes questions spécifiques sont donc:

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

  2. J'ai une entrée à 32 points dans le domaine temporel. La sortie de la FFT ne devrait-elle pas être un tableau à 16 éléments pour les réels et un tableau à 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 relation avec la question précédente, comment analyser les index dans les tableaux de sortie? Étant donné mon entrée de 32 échantillons échantillonnés à 32 Hz, ma compréhension est qu'une sortie de tableau à 16 éléments devrait avoir son indice uniformément réparti 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 FFT a-t-elle des valeurs négatives? Je pensais que les valeurs représentent 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 cosinus de fréquence 3. Est-ce vrai? Comment une amplitude peut-elle être négative?

77
  1. Vous ne devez pas non plus chercher la partie réelle ou imaginative d'un nombre complexe (c'est quoi votre tableau réel et imaginaire). Au lieu de cela, vous voulez rechercher l'amplitude 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 DC et ne contient aucune information dépendante de la fréquence).

  2. Vous obtenez 32 sorties réelles et 32 ​​sorties imaginaires car vous utilisez une FFT complexe à complexe. N'oubliez pas que vous avez converti vos 32 échantillons en 64 valeurs (ou 32 valeurs complexes) en l'étendant avec zéro partie imaginaire. Il en résulte une sortie FFT symétrique où le résultat de fréquence se produit deux fois. Une fois prêt à l'emploi dans les sorties 0 à N/2, et une fois reflété dans les sorties N/2 à N. Dans votre cas, il est plus simple d'ignorer simplement 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 fréquence-fft-bin est (bin_id * freq/2)/(N/2) où freq est votre fréquence d'échantillonnage (aka 32 Hz, et N est la taille de votre FFT). Dans votre cas, cela simplifie à 1 Hz par bac. Les bacs N/2 à N représentent des fréquences négatives (concept étrange, je sais). Pour votre cas, ils ne contiennent aucune information significative car ils ne sont que le miroir des premières fréquences N/2.

  4. Vos parties réelles et imaginaires de chaque bac forment un nombre complexe. Ce n'est pas grave si les parties réelles et imaginaires sont négatives alors que l'amplitude de la fréquence elle-même est positive (voir ma réponse à la question 1). Je vous suggère de lire 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 stackoverflow.

Remarque: Vous pouvez également vouloir lire ce qu'est l'autocorrélation et comment elle est utilisée pour trouver la fréquence fondamentale d'un signal. J'ai le sentiment que c'est ce que vous voulez vraiment.

76
Nils Pipenbrinck

Vous avez déjà de bonnes réponses, mais j'ajouterai simplement que vous devez vraiment appliquer un fonction de fenêtre à vos données de domaine temporel avant la FFT, sinon vous obtiendrez des artefacts désagréables dans votre spectre.

9
Paul R

1) Recherchez les indices dans le tableau réel avec les valeurs les plus élevées, en plus du premier (c'est le composant DC). Vous aurez probablement besoin d'une fréquence d'échantillonnage considérablement supérieure à 32 Hz, et une plus grande taille de fenêtre, pour obtenir beaucoup de 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 le dernier élément du tableau imaginaire (1.474) est le 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 pas 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 DC)).

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 une valeur = 1 à t = 0, donc un signal qui avait une valeur = -1 à l'instant = 0 aurait une amplitude négative .

5
duskwuff

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

4
hotpaw2