2013-02-09 10 views
25

Ho utilizzato i dati FFT dal nodo Analyzer utilizzando il metodo getByteFrequencyData nel Web Audio API per creare un visualizzatore spettro come illustrato di seguito:A cosa corrispondono i dati FFT nell'API Web Audio?

Spectrum Visualizer

In questo caso ho 256 intervalli di dati. A cosa corrispondono esattamente i numeri in questo? È il livello di decibel di ogni componente di frequenza. In tal caso, come faccio a sapere a cosa corrisponde il valore della frequenza di ciascun contenitore?

Mi piacerebbe sapere così posso sperimentare la costruzione di un eq grafico e quindi vorrei sapere in quali punti indicare le bande del filtro. Idealmente mi piacerebbe rappresentare frequenze da 20Hz a 20kHz e intervalli di trama tra quelli di conseguenza.

Grazie per qualsiasi aiuto.

risposta

27

sì, getByteFrequencyData risultati in una matrice di valori normalizzato tra 0 e 255. (copia i dati nella matrice che viene passato-in).

bande di frequenza sono divisi equamente, in modo che ogni elemento dell'array N corrisponde a:

N * samplerate/fftSize 

modo, il primo contenitore è 0.
e, assumendo una frequenza di campionamento di 44100 e un <analyzerNode>.fftSize di 512 il secondo sarebbe: 86.13 Hz, e così via ...

troverete queste due domande e risposte utili, su dsp e SO:

Nota che la lunghezza del tuo sampledata è la metà dello <analyzerNode>.fftSize, limitando efficacemente la gamma di frequenza a metà del campionatore.

+0

getByteFrequencyData non restituisce nulla; piuttosto, copia i valori dei dati di frequenza (0-255) _dall'array senza segno (Uint8Array() in javascript) che si passa al metodo come parametro. [W3C Draft - Web Audio API - getByteFrequencyData] (https://dvcs.w3.org/hg/audio/raw-file/tip/webaudio/specification.html#AnalyserNode). Nel caso in cui qualcuno venga scoperto a cercare di utilizzare una qualche forma di valore restituito da questo metodo, chiamare ... –

+0

@fettereddingoskidney, grazie, aggiornato. – kr1

+0

rock on! Non tentare di essere pignoli:] –

5

Con 256 bin, ognuno sarà ~ 86 Hz (frequenza di campionamento 44100 kHz/fftSize, dove fftSize è il doppio del numero di contenitori). Quindi si inizia a zero e si sale con incrementi di 86 Hz da lì.

I valori effettivi nei raccoglitori sono solo una rappresentazione della quantità di ciascuna frequenza presente nel segnale (ad esempio, quanto è "alta" la frequenza).

+0

l'audio web api restituisce un numero di contenitori che è la metà di fftSize. quindi, IMHO dovresti dividere per 'bins.length * 2' o meglio usando' fftSize' direttamente, vedi anche la mia risposta. – kr1