2013-02-09 13 views
25

, jakie stosuje się dane z węzła FFT Analyzer z użyciem metody w sieci audio API getByteFrequencyData tworzyć wizualizacje widma, jak pokazano poniżej:Co odpowiada danym FFT w interfejsie Web Audio API?

Spectrum Visualizer

W tym przypadku, że ma 256 pojemników danych. Co dokładnie odpowiadają tym liczbom? Czy jest to poziom decybeli każdego komponentu częstotliwości. Jeśli tak, to skąd mam wiedzieć, do czego odnosi się wartość częstotliwości każdego pojemnika?

Chciałbym wiedzieć, więc mogę eksperymentować w budowaniu grafiki eq i dlatego chciałbym wiedzieć, w których punktach wskazać pasma filtrów. Idealnie chciałbym reprezentować częstotliwości od 20Hz do 20kHz i odpowiednio odstępy między nimi.

Dzięki za pomoc.

Odpowiedz

27

tak, getByteFrequencyData wyniki w znormalizowanej tablicy wartości od 0 do 255. (kopiuje dane do tablicy, przez którą jest przekazywana).

pasmach częstotliwości są podzielone równo, więc każdy element N swojej tablicy odpowiada:

N * samplerate/fftSize 

tak, pierwszy bin 0.
i, zakładając próbkowania 44100 i <analyzerNode>.fftSize 512 drugi będzie: 86,13 Hz, i tak dalej ...

znajdziesz te dwa pytania i odpowiedzi użytecznych, na dsp i SO:

Zwróć uwagę, że długość próbkowanej próbki jest o połowę niższa niż <analyzerNode>.fftSize, skutecznie ograniczając zakres częstotliwości do połowy próbkowania.

+0

getByteFrequencyData nie zwraca niczego; raczej kopiuje wartości danych częstotliwości (0-255) _into_ niepodpisaną tablicę (Uint8Array() w javascript), którą przekazujesz do metody jako parametr. [W3C Draft - Web Audio API - getByteFrequencyData] (https://dvcs.w3.org/hg/audio/raw-file/tip/webaudio/specification.html#AnalyserNode). Na wypadek, gdyby ktoś został przyłapany na próbie użycia jakiejś formy zwróconej wartości z tej metody, zadzwoń ... –

+0

@fettereddingoskidney, thanks, updated. – kr1

+0

rock na! Nie próbując być wybrednym:] –

5

Z 256 binami, każdy z nich będzie ~ 86 Hz od siebie (częstotliwość próbkowania 44100 kHz/fftSize, gdzie fftSize jest dwa razy większa od liczby pojemników). Zaczynasz więc od zera i wzrastasz o 86 Hz.

Rzeczywiste wartości w pojemnikach stanowią jedynie reprezentację ilości każdej częstotliwości w sygnale (tj. Jak "głośna" jest częstotliwość).

+0

api web audio zwraca liczbę pojemników, która wynosi połowę fftSize. więc, IMHO powinieneś podzielić przez 'bins.length * 2' lub lepiej używając bezpośrednio' fftSize', zobacz także moją odpowiedź. – kr1

Powiązane problemy