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.


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.


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.


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

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

5

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


6
Myślę, że to będzie w radianach
Barnaby,
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.