Comment obtenir les fréquences de chaque valeur dans une FFT?

148

J'ai un résultat FFT. Ceux-ci sont stockés dans deuxdouble tableaux: un tableau de parties réelles et un tableau de parties imaginaires. Comment déterminer les fréquences qui correspondent à chaque élément de ces tableaux?

En d'autres termes, j'aurais aimé créer un tableau qui stocke les fréquences pour chaque composant réel et imaginaire de ma FFT.

Rango
la source
Je le fais en C # .net. Pouvez-vous m'aider?
Rango
9
Si vous ne comprenez pas la pertinence des parties réelles et imaginaires d'une FFT, vous n'obtiendrez pas de résultats significatifs, vous devriez donc rechercher des tutoriels sur la FFT et le traitement du signal pour comprendre comment interpréter les résultats. Je pense qu'il est fort probable que quoi que vous fassiez, vous vouliez l'ampleur de la FFT ou de la densité spectrale de puissance.
the_mandrill
Je vous remercie! Je veux obtenir les fréquences de crête de chaque image (la longueur de l'image dépend de la longueur de la fenêtre et de la longueur du décalage)
Rango

Réponses:

351

Le premier bac de la FFT est DC (0 Hz), le second bac est Fs / N, où Fsest la fréquence d'échantillonnage et Nest la taille de la FFT. Le prochain bac est 2 * Fs / N. Pour exprimer cela en termes généraux, le nième bac estn * Fs / N .

Donc, si votre fréquence d'échantillonnage, par Fsexemple 44,1 kHz et votre taille FFT, Nest de 1024, alors les bacs de sortie FFT sont à:

  0:   0 * 44100 / 1024 =     0.0 Hz
  1:   1 * 44100 / 1024 =    43.1 Hz
  2:   2 * 44100 / 1024 =    86.1 Hz
  3:   3 * 44100 / 1024 =   129.2 Hz
  4: ...
  5: ...
     ...
511: 511 * 44100 / 1024 = 22006.9 Hz

Notez que pour un signal d'entrée réel (parties imaginaires toutes nulles) la seconde moitié de la FFT (cases de N / 2 + 1à N - 1) ne contient aucune information supplémentaire utile (elles ont une symétrie conjuguée complexe avec les premières N / 2 - 1cases). Le dernier casier utile (pour des applications pratiques) est à N / 2 - 1, ce qui correspond à 22006,9 Hz dans l'exemple ci-dessus. Le bac àN / 2 représente l'énergie à la fréquence de Nyquist, c'est-à-dire Fs / 2(= 22050 Hz dans cet exemple), mais cela n'a en général aucune utilité pratique, car les filtres anti-crénelage atténueront typiquement tous les signaux à et au-dessus Fs / 2.

Paul R
la source
8
Remarque - la réponse est légèrement erronée - le 512e compartiment contient le niveau pour 22050, la limite de nyquist. Les cases 0 à N / 2 inclus contiennent des valeurs utiles.
david van brink
4
Merci pour la modification et la clarification ... Je suppose que c'est là que je révèle un manque de praticité. Moi: Mais maître, le travail de FFT jusqu'au nyquist! Vous: Padawan, vous devriez vraiment filtrer cela.
david van brink
5
J'aimerais pouvoir jouer les réponses. Cette réponse est encore meilleure que la question initiale!
Skylion du
14
@PaulR - Je voulais vous remercier pour cette merveilleuse réponse qui m'a servi au fil des ans. Je visiterais cette réponse avant d'avoir un compte StackOverflow, et j'ai en fait oublié de vous remercier une fois que je me suis inscrit. Je regardais récemment des trucs FFT et je me suis souvenu de votre réponse et je viens de la visiter maintenant. Une fois arrivé ici, je me suis souvenu de vous remercier ... alors merci! Chaque fois que j'ai un débat avec quelqu'un sur l'interprétation de ce que représente chaque point sur l'axe horizontal de la FFT, je leur indique simplement ce lien.
rayryeng
6
@rayryeng: merci beaucoup - je pense que c'est la plus belle reconnaissance que j'ai jamais eue en ~ 5 ans de réponse aux questions ici sur SO!
Paul R
55

Jetez un œil à ma réponse ici .

Réponse au commentaire:

La FFT calcule en fait la corrélation croisée du signal d'entrée avec les fonctions sinus et cosinus (fonctions de base) dans une plage de fréquences également espacées. Pour une sortie FFT donnée, il y a une fréquence correspondante (F) comme donnée par la réponse que j'ai postée. La partie réelle de l'échantillon de sortie est la corrélation croisée du signal d'entrée avec cos(2*pi*F*t)et la partie imaginaire est la corrélation croisée du signal d'entrée avec sin(2*pi*F*t). La raison pour laquelle le signal d'entrée est corrélé avec sinetcos fonctions est de tenir compte des différences de phase entre le signal d'entrée et les fonctions de base.

En prenant l'amplitude de la sortie FFT complexe, vous obtenez une mesure de la corrélation entre le signal d'entrée et les sinusoïdes à un ensemble de fréquences, quelle que soit la phase du signal d'entrée. Si vous analysez simplement le contenu fréquentiel d'un signal, vous prendrez presque toujours la magnitude ou la magnitude au carré de la sortie complexe de la FFT.

Jason B
la source
La partie réelle et imaginaire sont le résultat de FFT utilisé pour? Veuillez m'expliquer. Merci
Rango
5
cette réponse mérite plus d'amour.
Bright-star
1
Se pourrait-il que l'ampleur des extrants complexes doive être doublée chacun? (si je limite mon interprétation à la moitié inférieure)
Wolf
18

J'ai utilisé ce qui suit:

public static double Index2Freq(int i, double samples, int nFFT) {
  return (double) i * (samples / nFFT / 2.);
}

public static int Freq2Index(double freq, double samples, int nFFT) {
  return (int) (freq / (samples / nFFT / 2.0));
}

Les entrées sont:

  • i: Bin pour accéder
  • samples: Taux d'échantillonnage en Hertz (soit 8000 Hz, 44100Hz, etc.)
  • nFFT: Taille du vecteur FFT
Roberto
la source
7
Les gens ne peuvent pas savoir exactement ce que vous représentez avec samplesou nFFT. Alors, veuillez le rendre plus explicatif.
mostar
14
La réponse acceptée dit que cela devrait être i * samples / nFFT. Pourquoi le supplément est- 2il là? Est-ce que je manque quelque chose?
yati sagade
13

Les coefficients de sortie FFT (pour une entrée complexe de taille N) sont de 0 à N - 1 regroupés en fréquence [LOW, MID, HI, HI, MID, LOW].

Je considérerais que l'élément en k a la même fréquence que l'élément en Nk puisque pour des données réelles, FFT [Nk] = conjugué complexe de FFT [k].

L'ordre de balayage de la basse fréquence à la haute fréquence est

0,

 1,
 N-1,

 2,
 N-2

 ...

 [N/2] - 1,
 N - ([N/2] - 1) = [N/2]+1,

 [N/2]

Il existe [N / 2] +1 groupes de fréquences de l'indice i = 0 à [N / 2], chacun ayant le frequency = i * SamplingFrequency / N

Ainsi, la fréquence à la case FFT [k] est:

if k <= [N/2] then k * SamplingFrequency / N
if k >= [N/2] then (N-k) * SamplingFrequency / N
robert.b
la source
5

La fréquence de votre k e résultat FFT est de 2 * pi * k / N.

Néo
la source
6
Je suppose que ce sera en radians
Barnaby