2011-09-21 12 views
5

Widziałem różne pytania FFT tutaj, ale jestem zdezorientowany na części realizacji. Zamiast wykonywać FFT w czasie rzeczywistym, chcę zrobić to w trybie offline. Powiedzmy, że mam surowe dane w float[] audio. Częstotliwość próbkowania wynosi 44100, a więc audio[0] to audio[44099] będzie zawierać 1 sekundę dźwięku. Jeśli moja funkcja FFT obsługuje okienkowanie (na przykład Hanning), czy po prostu umieszczam cały bufor audio w funkcji za jednym zamachem? Czy muszę wyciąć dźwięk na kawałki 4096 (mój rozmiar okna), a następnie wprowadzić go do FFT, który następnie wykona funkcję okna na górze?FFT - Kiedy do okna?

+1

pewnością zależy to od specyfiki biblioteki FFT że cię używają. – Mankarse

+0

To pytanie jest lepiej dopasowane do dsp.stackexchange.com. Czy powinien zostać przeniesiony? –

+0

@Mankarse - Tak, przykro mi, powinienem być bardziej konkretny. Miałem trzy różne biblioteki FFT i nie byłem pewien, którego z nich zamierzam użyć. Zdecydowałem się użyć tego w ramach Apple Accelerate. – Skoder

Odpowiedz

2

Może być konieczne skopiowanie danych wejściowych do oddzielnego bufora i pobranie go w odpowiednim formacie, np. jeśli twoja FFT jest na miejscu lub jeśli wymaga przeplatanych złożonych danych (rzeczywistych/urojonych). Jednak jeśli twoja procedura FFT może przyjmować czysto rzeczywiste dane wejściowe i nie jest w miejscu (tj. Nieniszcząca), wtedy możesz po prostu przekazać wskaźnik do oryginalnych danych próbki wraz z odpowiednim parametrem wielkości.

Zazwyczaj dla 1s dźwięku, np. mowy lub muzyki, należy wybrać rozmiar FFT, który odpowiada rozsądnie stacjonarny fragment audio, np. 10 ms lub 20 ms. Tak więc przy 44,1 kHz rozmiar twojej FFT może wynosić 512 lub 1024. Następnie generowałbyś kolejne widma, przechodząc przez bufor i wykonując nową FFT w każdym punkcie początkowym. Zwróć uwagę, że powszechną praktyką jest nakładanie się na te kolejne bufory, zwykle o 50%. Jeśli więc N = 1024 Twoja pierwsza FFT będzie dla próbek 0..1023, Twoja druga będzie dla próbek 512..1535, a następnie 1024. 2047 itd.

+0

Dzięki za pomoc Paul. Będę korzystał z Apple Accelerate, która, jak sądzę, wykonuje lokalną FFT, więc myślę, że muszę manipulować danymi w osobnym buforze. Więc jeśli mam utwór trwający 180 sekund, po prostu iteruję po buforze zgodnie z opisem i wykonuję FFT do N = 7938000 (44100 * 180)? – Skoder

+2

Jeśli nazwa funkcji kończy się na "ip", oznacza to, że jest na miejscu, np. 'vDSP_fft_zrip'. Więc tak, skopiuj każdy fragment danych wejściowych do odpowiedniego bufora FFT, zastosuj funkcję okna (np. Hanna), zastosuj FFT, oblicz spektrum mocy lub cokolwiek chcesz zrobić, zapisz i/lub wyświetl widmo mocy dla tego fragmentu, przejdź dalej do następnego kawałka ... –

+1

Zobacz też: http://stackoverflow.com/questions/3398753/using-the-apple-fft-and-accelerate-framework –

1

Rozmiar porcji lub długość okna, którą wybierasz rozdzielczość częstotliwości i rozdzielczość czasowa wyniku FFT. Musisz określić, co chcesz, lub co chcesz zrobić.

Dłuższe okna zapewniają lepszą rozdzielczość częstotliwości, ale gorszą rozdzielczość czasową. Krótsze okna, i na odwrót. Każdy zestaw wyników FFT będzie zawierał szerokość pasma częstotliwości około 1 do 2 razy większą niż częstotliwość próbkowania podzielona przez długość FFT, w zależności od kształtu okna (prostokątny, von Hann, itp.), A nie tylko jednej częstotliwości. Jeśli cała porcja danych jest nieruchoma (zawartość częstotliwości się nie zmienia), może nie być potrzebna żadna rozdzielczość czasowa i może przejść do "rozdzielczości" częstotliwości 1 do 2 Hz w 1 sekundę danych. Uśrednienie wielu krótkich okien FFT może również pomóc zmniejszyć wariancję twoich spektralnych oszacowań.

+0

Nie wiem, czy dobrze się z tym zapoznałeś, ale próbuję stworzyć coś podobnego do AudioSurf (ten film pokazuje dobry przykład rozpoznawania tempa około 20 sekund w http://www.youtube.com/watch?v= 2EsVyEnhxWY). AudioSurf preprocesuje audio zamiast robić to w czasie rzeczywistym i nie byłem do końca pewien, jak to się stało. – XSL

+0

@SSL - Dlaczego szukacie FFT tylko 1 sekundy danych do rozpoznawania tempa? Lub jeśli chodzi o coś innego niż pierwotne pytanie OP, być może powinieneś zadać własne nowe pytanie na SO. – hotpaw2

+0

To było ponad pierwotne pytanie, ale byłem ciekawy tego samego co OP. Nie potrzebuję teraz informacji, więc utworzę nowy wątek, kiedy przekroczę ten most. – XSL

2

Wybór, czy obliczyć jeden FFT w całym zestawie danych (w przypadku OP, 44100 próbek reprezentujących 1 sekundę danych), czy też wykonać serię FFT w stosunku do mniejszych podzbiorów pełnego zestawu danych, zależy od danych i od zamierzonego celu FFT.

Jeśli dane są względnie statycznie widmowe w pełnym zestawie danych, to jedna FFT w całym zestawie danych jest prawdopodobnie wszystkim, co jest potrzebne.

Jednakże, jeśli dane są dynamicznie widmowe w zestawie danych, wówczas wielokrotne przesuwanie się FFT nad małymi podzbiorami danych spowodowałoby bardziej dokładną reprezentację danych w czasie i częstotliwości.

Poniższy wykres przedstawia spektrum mocy gitary akustycznej odtwarzającej notatkę A4. Sygnał audio był próbkowany przy 44,1 kHz, a zestaw danych zawierał 131072 próbek, prawie 3 sekundy danych. Ten zestaw danych został wstępnie pomnożony przez funkcję okna Hanna.

Guitar spectrum, Hann window, 131072 samples

Poniższa fabuła przedstawia widmo mocy podzbioru 16384 próbek (0 do 16383) pobranych z pełnym zestawem danych akustycznej nuty gitara A4. Ten podzbiór został również wstępnie pomnożony przez funkcję okna Hanna.

Guitar spectrum, Hann window, 16384 samples

Wskazówki jak rozkład widmowy energii podzbioru różni się istotnie od rozkładu widmowego energii pełnego zestawu danych.

Gdybyśmy wyodrębnili podzestawy z pełnego zestawu danych, używając przesuwanej 16384 próbnej ramki i obliczyliśmy widmo mocy każdej klatki, stworzylibyśmy dokładny obraz częstotliwościowy pełnego zestawu danych.

Referencje:

danych rzeczywistych sygnałów audio, Hann funkcja okna, działki, FFT oraz analiza widmowa przeprowadzono tutaj:

Fast Fourier Transform, spectral analysis, Hann window function, audio data