Zrozumienie wyjścia FFT

Potrzebuję pomocy w zrozumieniu wyników obliczeń DFT/FFT.

Jestem doświadczonym inżynierem oprogramowania i muszę zinterpretować niektóre odczyty akcelerometru smartfona, takie jak znalezienie głównych częstotliwości. Niestety, przespałem większość moich zajęć na studiach piętnaście lat temu, ale od kilku dni czytam o DFT i FFT (widocznie mało pożytku).

Proszę, Brak odpowiedzi na "Idź na zajęcia EE". Planuję zrobić jeśli mój pracodawca mi zapłaci. :)

Oto mój problem:

Przechwyciłem sygnał na 32 Hz. Oto 1 druga próbka 32 punktów, które zapisałem w Excelu.

Tutaj wpisz opis obrazka

Potem otrzymałem kod FFTnapisany w Javie Z Columbia University (po zastosowaniu się do sugestii w poście " niezawodny i szybki FFT w Javie").

Wyjście tego programu jest następujące. Wierzę, że działa na miejscu FFT, więc ponownie używa tego samego bufor zarówno wejścia, jak i wyjścia.

Before: 

Re: [0.887  1.645  2.005  1.069  1.069  0.69  1.046  1.847  0.808  0.617  0.792  1.384  1.782  0.925  0.751  0.858  0.915  1.006  0.985  0.97  1.075  1.183  1.408  1.575  1.556  1.282  1.06  1.061  1.283  1.701  1.101  0.702  ]

Im: [0.0  0.0  0.0  0.0  0.0  0.0  0.0  0.0  0.0  0.0  0.0  0.0  0.0  0.0  0.0  0.0  0.0  0.0  0.0  0.0  0.0  0.0  0.0  0.0  0.0  0.0  0.0  0.0  0.0  0.0  0.0  0.0  ]

After: 

Re: [37.054  1.774  -1.075  1.451  -0.653  -0.253  -1.686  -3.602  0.226  0.374  -0.194  -0.312  -1.432  0.429  0.709  -0.085  0.0090  -0.085  0.709  0.429  -1.432  -0.312  -0.194  0.374  0.226  -3.602  -1.686  -0.253  -0.653  1.451  -1.075  1.774  ]

Im: [0.0  1.474  -0.238  -2.026  -0.22  -0.24  -5.009  -1.398  0.416  -1.251  -0.708  -0.713  0.851  1.882  0.379  0.021  0.0  -0.021  -0.379  -1.882  -0.851  0.713  0.708  1.251  -0.416  1.398  5.009  0.24  0.22  2.026  0.238  -1.474  ]
Więc, w tym momencie, nie mogę zrobić orzeł lub reszka z wyjścia. Rozumiem pojęcia DFT, takie jak część rzeczywista jest amplitudami składowych fal cosinusowych, a część urojona jest amplitudami składowych fal sinusoidalnych. Mogę również śledzić ten schemat z Wielkiej książki "[23]}The Scientist and Engineer ' s Guide to Digital Signal Processing[16]]}": Tutaj wpisz opis obrazka Więc moje konkretne pytania są:
  1. Z wyjścia FFT, jak znaleźć "najczęściej występujące częstotliwości"? To część mojej analizy danych z akcelerometru. Czy powinienem czytać tablice rzeczywiste (cosinus) lub urojone (sinus)?

  2. Mam 32-punktowe wejście w domenie czasowej. Czy wyjście FFT nie powinno być 16-elementową tablicą dla liczb rzeczywistych i 16-elementową tablicą dla urojonych? Dlaczego program daje mi rzeczywiste i wyimaginowane wyjścia tablicowe o rozmiarze 32?

  3. Związane z poprzednie pytanie, jak parsować indeksy w tablicach wyjściowych? Biorąc pod uwagę moje wejście 32 próbek pobranych przy 32 Hz, rozumiem, że 16-elementowe wyjście tablicy powinno mieć swój indeks równomiernie rozłożony do 1/2 częstotliwości próbkowania (32 Hz), więc czy mam rację w zrozumieniu, że każdy element tablicy reprezentuje (32 Hz * 1/2) / 16 = 1 Hz?

  4. Dlaczego wyjście FFT ma wartości ujemne? Myślałem, że wartości reprezentują amplitudy sinusoidy. Na przykład wyjście rzeczywiste [3] = -1,075 powinno oznaczać amplitudę -1,075 dla fali cosinusowej o częstotliwości 3. Naprawdę? Jak amplituda może być ujemna?

Author: Cœur, 2011-07-19

4 answers

  1. Nie należy też szukać części rzeczywistej lub wyobrażeniowej liczby zespolonej (to, czym jest tablica prawdziwa i urojona). Zamiast tego chcesz szukać wielkości częstotliwości, która jest zdefiniowana jako sqrt (real * real + imag * imag). Liczba ta zawsze będzie dodatnia. Teraz wystarczy wyszukać maksymalną wartość (zignoruj pierwszy wpis w tablicy. To jest twoje przesunięcie DC i nie niesie żadnych informacji zależnych od częstotliwości).

  2. Dostajesz 32 prawdziwe i 32 wyimaginowane wyjścia, ponieważ używasz złożonego do złożonego FFT. Pamiętaj, że przekonwertowałeś swoje 32 próbki na 64 wartości (lub 32 wartości złożone), rozszerzając je o zero części urojonych. Powoduje to symetryczne wyjście FFT, w którym wynik częstotliwości występuje dwukrotnie. Po przygotowaniu do użycia w wyjściach od 0 do N/2, a po odbiciu w wyjściach od N/2 do N. w Twoim przypadku najłatwiej jest po prostu zignorować wyjścia od N / 2 do N. nie potrzebujesz ich, są one po prostu artefaktem na temat sposobu obliczania Twój FFT.

  3. Częstotliwość do równania FFT-bin wynosi (bin_id * freq / 2)/(N / 2), gdzie freq jest częstotliwością próbki (aka 32 Hz, A N jest wielkością FFT). W Twoim przypadku upraszcza to do 1 Hz na pojemnik. Kosze N / 2 do N reprezentują ujemne częstotliwości (dziwne pojęcie, wiem). W Twoim przypadku nie zawierają żadnych istotnych informacji, ponieważ są tylko zwierciadłem pierwszych N / 2 częstotliwości.

  4. Twoje rzeczywiste i wyimaginowane części każdego pojemnika tworzą złożony numer. To jest w porządku, jeśli części rzeczywiste i urojone są negatywne, podczas gdy wielkość samej częstotliwości jest dodatnia(patrz moja odpowiedź na pytanie 1). Proponuję poczytać o złożonych liczbach. Wyjaśnienie, jak one działają (i dlaczego są przydatne) przekracza to, co jest możliwe do wyjaśnienia w jednym pytaniu o przepływ stosu.

Uwaga: Możesz również przeczytać, czym jest autokorelacja i jak jest używana do znalezienia podstawowej częstotliwości sygnału. Mam wrażenie, że to czego naprawdę chcesz.

 70
Author: Nils Pipenbrinck,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-10-16 11:44:31

Masz już kilka dobrych odpowiedzi, ale dodam tylko, że naprawdę musisz zastosować funkcję window do danych domeny czasu przed FFT, w przeciwnym razie dostaniesz paskudne artefakty w swoim spektrum.

 8
Author: Paul R,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2011-07-19 06:23:00

1) poszukaj indeksów w tablicy rzeczywistej z najwyższymi wartościami, oprócz pierwszej (to składnik DC). Prawdopodobnie będziesz potrzebował częstotliwości próbkowania znacznie wyższej niż 32 Hz i większego rozmiaru okna, aby uzyskać znaczące wyniki.

2) Druga połowa obu tablic jest zwierciadłem pierwszej połowy. Na przykład, zauważ, że ostatni element tablicy rzeczywistej (1.774) jest taki sam jak drugi element (1.774) , a ostatni element tablicy urojonej (1.474) jest ujemnym drugiego pierwiastka.

3) Maksymalna częstotliwość jaką można odebrać przy częstotliwości próbkowania 32 Hz to 16 Hz (granica Nyquista ), więc każdy krok to 2 Hz. Jak wspomniano wcześniej, pamiętaj, że pierwszy element to 0 Hz (tzn. przesunięcie DC).

4) oczywiście, ujemna Amplituda ma sens. Oznacza to po prostu, że sygnał jest "odwrócony" - standardowy FFT opiera się na cosinusie, który normalnie ma wartość = 1 przy t = 0, więc sygnał, który miał wartość = -1 w czasie = 0 ma ujemną amplitudę.

 4
Author: duskwuff,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2011-07-19 00:23:44

Zauważ, że "najbardziej występująca częstotliwość" może zostać rozpryśnięta na wiele pojemników FFT, nawet z funkcją okna. Może więc być konieczne użycie dłuższego okna, wielu okien lub interpolacji, aby lepiej oszacować częstotliwość dowolnych pików widmowych.

 4
Author: hotpaw2,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2011-07-19 22:02:18