web-dev-qa-db-fra.com

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

J'ai un résultat FFT. Celles-ci sont stockées dans deux tableaux double: un tableau de parties réelles et un tableau de parties imaginaires. Comment déterminer les fréquences correspondant à chaque élément de ces tableaux?

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

142
Rango

Le premier bin de la FFT est DC (0 Hz), le second bin est Fs / N], où Fs est le taux d'échantillonnage et N est la taille de la FFT, le prochain bin est 2 * Fs / N. Pour l’exprimer en termes généraux, le nième bin est n * Fs / N.

Donc, si votre fréquence d'échantillonnage, Fs est égale à 44,1 kHz et que votre taille FFT, N est égale à 1024, les emplacements de sortie de la FFT sont situés à:

  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 à zéro), la seconde moitié de la FFT (les classes de N / 2 + 1 à N - 1) ne contient aucune information supplémentaire utile (elles ont une symétrie conjuguée complexe avec la première N / 2 - 1 bacs). Le dernier casier utile (pour les applications pratiques) se trouve à N / 2 - 1, ce qui correspond à 22006,9 Hz dans l'exemple ci-dessus. Le bac situé à N / 2 représente l’énergie à la fréquence de Nyquist, c’est-à-dire Fs / 2 (= 22050 Hz dans cet exemple), mais il n’est en général utile en pratique, car les filtres anti-aliasing atténueront généralement signaux supérieurs et égaux à Fs / 2.

324
Paul R

Regardez ma réponse ici .

Réponse au commentaire:

La FFT calcule en fait la corrélation croisée du signal d’entrée avec des fonctions sinus et cosinus (fonctions de base) dans une plage de fréquences équidistantes. Pour une sortie FFT donnée, il existe une fréquence correspondante (F) 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 les fonctions sin et cos est pour 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 ne faites qu'analyser le contenu fréquentiel d'un signal, vous prendrez presque toujours l'amplitude ou l'amplitude au carré de la sortie complexe de la FFT.

54
Jason B

J'ai utilisé les éléments suivants:

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 (8000 Hz, 44100Hz, etc.)
  • nFFT: Taille du vecteur FFT
17
roberto

Les coefficients de sortie FFT (pour une entrée complexe de taille N) vont de 0 à N - 1 et sont regroupés par 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 N-k puisque pour les données réelles, FFT [N-k] = complexe conjugué de FFT [k].

L'ordre de balayage de basse fréquence à haute fréquence 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équences d'indice i = 0 à [N/2], chacun ayant le frequency = i * SamplingFrequency / N

Donc, la fréquence à la bin FFT [k] est:

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

Votre kth La fréquence du résultat FFT est 2 * pi * k/N.

5
Neo