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

J’ai un résultat FFT. Ceux-ci sont stockés 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.

La première case dans la FFT est DC (0 Hz), la seconde est Fs / N , où Fs est la fréquence d’échantillonnage et N la taille de la FFT. Le bac suivant est 2 * Fs / N Pour exprimer cela en termes généraux, le nième bin est n * Fs / N

Donc, si votre fréquence d’échantillonnage, Fs est de 44,1 kHz et votre taille de FFT, N est 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ésortinge conjuguée complexe avec la première N / 2 - 1 bacs). Le dernier casier utile (pour les applications pratiques) se situe à N / 2 - 1 2-1, ce qui correspond à 22006,9 Hz dans l’exemple ci-dessus. La corbeille à 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-repliement atténueront Fs / 2 .

Jetez un oeil à ma réponse ici .

Répondre à un 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 équidistantes. Pour une sortie FFT donnée, il y a 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é aux fonctions sin et cos est de prendre en compte les différences de phase entre le signal d’entrée et les fonctions de base.

En prenant l’ampleur de la sortie FFT complexe, vous obtenez une mesure de la corrélation du signal d’entrée avec les sinusoïdes à un ensemble de fréquences indépendamment de la phase du signal d’entrée. Si vous ne faites qu’parsingr 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.

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 les suivantes:

  • i : Bin pour accéder
  • samples : taux d’échantillonnage en Hertz (ie 8000 Hz, 44100Hz, etc.)
  • nFFT : Taille du vecteur FFT

Les coefficients de sortie FFT (pour les entrées complexes de taille N) vont de 0 à N – 1 regroupés en fréquence [LOW, MID, HI, HI, MID, LOW].

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

L’ordre de numérisation de la fréquence BAS à HAUTE 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 d’indice i = 0 à [N / 2], chacun ayant la frequency = i * SamplingFrequency / N

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

 if k <= [N/2] then k * SamplingFrequency / N if k >= [N/2] then (Nk) * SamplingFrequency / N 

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