Jak uzyskać częstotliwości każdej wartości w FFT?

148

Mam wynik FFT. Są one przechowywane w dwóch doubletablicach: tablicy części rzeczywistej i tablicy części urojonej. Jak określić częstotliwości odpowiadające każdemu elementowi w tych tablicach?

Innymi słowy, chciałbym stworzyć tablicę przechowującą częstotliwości dla każdego rzeczywistego i urojonego składnika mojego FFT.

Rango
źródło
Robię to w C # .net. Możesz mi pomóc?
Rango,
9
Jeśli nie rozumiesz znaczenia rzeczywistych i urojonych części FFT, nie uzyskasz żadnych znaczących wyników, więc powinieneś poszukać kilku samouczków FFT i przetwarzania sygnałów, aby zrozumieć, jak interpretować wyniki. Myślę, że jest całkiem prawdopodobne, że cokolwiek go używasz, chcesz wielkości FFT lub gęstości widmowej mocy.
the_mandrill
Dziękuję Ci! Chcę uzyskać częstotliwości szczytowe każdej klatki (długość klatki zależy od długości okna i długości przesunięcia)
Rango

Odpowiedzi:

350

Pierwsza paczka w FFT to DC (0 Hz), druga paczka to Fs / N, gdzie Fsjest częstotliwością próbkowania i Njest rozmiarem FFT. Następny pojemnik to 2 * Fs / N. Aby wyrazić to ogólnie, n-ty pojemnik to n * Fs / N.

Więc jeśli twoja częstotliwość próbkowania, Fspowiedzmy 44,1 kHz, a twój rozmiar FFT, Nto 1024, to biny wyjściowe FFT są na:

  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

Zauważ, że dla rzeczywistego sygnału wejściowego (części urojone wszystkie zera) druga połowa FFT (przedziały od N / 2 + 1do N - 1) nie zawiera żadnych przydatnych dodatkowych informacji (mają one złożoną symetrię sprzężoną z pierwszymi N / 2 - 1przedziałami). Ostatnim użytecznym N / 2 - 1binem (do praktycznych zastosowań) jest w , co odpowiada 22006,9 Hz w powyższym przykładzie. Szuflada na N / 2reprezentuje energię przy częstotliwości Nyquista, tj. Fs / 2(= 22050 Hz w tym przykładzie), ale generalnie nie ma to żadnego praktycznego zastosowania, ponieważ filtry antyaliasingowe zwykle tłumią wszelkie sygnały na poziomie i powyżej Fs / 2.

Paul R.
źródło
8
Uwaga - odpowiedź jest trochę zła - 512-ty segment zawiera poziom 22050, czyli limit nyquista. Pojemniki od 0 do N / 2 włącznie zawierają przydatne wartości.
david van brink
4
Dzięki za edycję i wyjaśnienia ... Myślę, że w tym miejscu ujawniam pewien brak praktyczności. Ja: Ale mistrzu, praca FFT do nyquista! Ty: Padawan, naprawdę powinieneś to odfiltrować.
david van brink
5
Chciałbym móc gwiazdkować odpowiedzi. Ta odpowiedź jest nawet lepsza niż pierwotne pytanie!
Skylion,
14
@PaulR - chciałem Ci podziękować za tę wspaniałą odpowiedź, która służyła mi przez lata. Odwiedziłbym tę odpowiedź, zanim miałbym konto StackOverflow, i tak naprawdę zapomniałem o podziękowaniu po zarejestrowaniu się. Niedawno oglądałem rzeczy FFT i przypomniałem sobie twoją odpowiedź i właśnie ją teraz odwiedziłem. Kiedy tu dotarłem, przypomniałem sobie, żeby ci podziękować ... więc dziękuję! Ilekroć rozmawiam z kimś na temat interpretacji każdego punktu na osi poziomej FFT, po prostu wskazuję im ten link.
rayryeng
6
@rayryeng: bardzo dziękuję - myślę, że to najmilsze uznanie, jakie kiedykolwiek otrzymałem od ~ 5 lat odpowiadania na pytania tutaj na SO!
Paul R
55

Spójrz na moją odpowiedź tutaj .

Odpowiedz na komentarz:

FFT faktycznie oblicza korelację krzyżową sygnału wejściowego z funkcjami sinusoidalnymi i cosinusowymi (funkcje bazowe) w zakresie równo rozmieszczonych częstotliwości. Dla danego wyjścia FFT istnieje odpowiednia częstotliwość (F) podana w przesłanej przeze mnie odpowiedzi. Część rzeczywista próbki wyjściowej jest korelacją krzyżową sygnału wejściowego z, cos(2*pi*F*t)a część urojoną jest korelacją krzyżową sygnału wejściowego z sin(2*pi*F*t). Powodem, dla którego sygnał wejściowy jest skorelowany z funkcjami sini, cosjest uwzględnienie różnic fazowych między sygnałem wejściowym a funkcjami podstawowymi.

Biorąc wielkość złożonego sygnału wyjściowego FFT, uzyskuje się miarę korelacji sygnału wejściowego z sinusoidami przy zestawie częstotliwości, niezależnie od fazy sygnału wejściowego. Jeśli tylko analizujesz zawartość częstotliwościową sygnału, prawie zawsze bierzesz wielkość lub wielkość do kwadratu złożonego sygnału wyjściowego FFT.

Jason B.
źródło
Część rzeczywista i urojona to wynik FFT, który był używany do? Proszę wyjaśnij mi. Dziękuję
Rango
5
ta odpowiedź zasługuje na więcej miłości.
jasna gwiazda
1
Czy to możliwe, że wielkość złożonych wyników musi zostać podwojona? (jeśli ograniczę moją interpretację do dolnej połowy)
Wolf
18

Użyłem następujących:

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));
}

Dane wejściowe to:

  • i: Pojemnik do dostępu
  • samples: Częstotliwość próbkowania w hercach (tj. 8000 Hz, 44100 Hz itp.)
  • nFFT: Rozmiar wektora FFT
roberto
źródło
7
Ludzie nie mogą dokładnie wiedzieć, z czym reprezentujesz sampleslub nFFT. Więc proszę, uczyń to bardziej objaśniającym.
mostar
14
Przyjęta odpowiedź mówi, że tak powinno być i * samples / nFFT. Dlaczego jest 2tam dodatek ? Czy coś mi brakuje?
yati sagade
13

Współczynniki wyjściowe FFT (dla złożonego wejścia o rozmiarze N) mieszczą się w zakresie od 0 do N - 1, pogrupowanych według częstotliwości [LOW, MID, HI, HI, MID, LOW].

Uważam, że element w k ma taką samą częstotliwość jak element w Nk, ponieważ dla rzeczywistych danych FFT [Nk] = sprzężona zespolona FFT [k].

Kolejność skanowania od NISKIEJ do WYSOKIEJ częstotliwości to

0,

 1,
 N-1,

 2,
 N-2

 ...

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

 [N/2]

Istnieją [N / 2] +1 grupy częstotliwości od indeksu i = 0 do [N / 2], z których każda ma rozszerzenie frequency = i * SamplingFrequency / N

Zatem częstotliwość w bin FFT [k] wynosi:

if k <= [N/2] then k * SamplingFrequency / N
if k >= [N/2] then (N-k) * SamplingFrequency / N
robert.b
źródło
5

Częstotliwość twojego k- tego wyniku FFT wynosi 2 * pi * k / N.

Neo
źródło
6
Myślę, że to będzie w radianach
Barnaby,