144 votes

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

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

En d'autres termes, j'aimerais créer un tableau qui stocke les fréquences pour chaque composante réelle et imaginaire de ma FFT.

337voto

Paul R Points 104036

Le premier bin dans la FFT est DC (0 Hz), le deuxième bin est Fs / N, où Fs est le taux d'échantillonnage et N est la taille de la FFT. Le bin suivant est 2 * Fs / N. Pour exprimer cela en termes généraux, le bin n est n * Fs / N.

Donc, si votre taux d'échantillonnage, Fs est par exemple de 44,1 kHz et la taille de votre FFT, N est de 1024, alors les bins 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

Remarquez que pour un signal d'entrée réel (parties imaginaires toutes nulles), la deuxième moitié de la FFT (bins de N / 2 + 1 à N - 1) ne contient pas d'informations utiles supplémentaires (elles ont une symétrie de conjugué complexe avec les premiers N / 2 - 1 bins). Le dernier bin utile (pour des applications pratiques) est à N / 2 - 1, qui correspond à 22006.9 Hz dans l'exemple ci-dessus. Le bin à N / 2 représente l'énergie à la fréquence de Nyquist, c'est-à-dire Fs / 2 ( = 22050 Hz dans cet exemple), mais cela n'est généralement pas d'une grande utilité pratique, car les filtres anti-aliasing atténueront typiquement tout signal à et au-dessus de Fs / 2.

54voto

Jason B Points 6574

Jetez un œil à ma réponse ici.

Réponse au commentaire:

L'FFT calcule en réalité la corrélation croisée du signal d'entrée avec les fonctions sinus et cosinus (fonctions de base) à une gamme de fréquences également espacées. Pour une sortie FFT donnée, il existe une fréquence correspondante (F) telle que celle donnée dans 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 les fonctions sin et cos est de tenir compte des différences de phase entre le signal d'entrée et les fonctions de base.

En prenant la magnitude de la sortie FFT complexe, vous obtenez une mesure de la corrélation du signal d'entrée avec des sinusoïdes à un ensemble de fréquences, indépendamment de 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 le carré de la magnitude de la sortie complexe de l'FFT.

17voto

roberto Points 49

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 à accéder
  • samples : Taux d'échantillonnage en Hertz (c'est-à-dire 8000 Hz, 44100Hz, etc.)
  • nFFT : Taille du vecteur FFT

11voto

robert.b Points 21

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

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

L'ordre de balayage de la fréquence LOW à HIGH est

0,

 1,
 N-1,

 2,
 N-2

 ...

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

 [N/2]

Il y a [N/2]+1 groupes de fréquence de l'indice i = 0 à [N/2], ayant chacun la fréquence = i * Fréquence d'échantillonnage / N

La fréquence au bin FFT[k] est donc :

si k <= [N/2] alors k * Fréquence d'échantillonnage / N
si k >= [N/2] alors (N-k) * Fréquence d'échantillonnage / N

5voto

Neo Points 43

La fréquence du résultat FFT de votre kème est égale à 2*pi*k/N.

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