2012-01-13 11 views
12

Ho guardato aurioTouch 2 dal codice di esempio di Apple (found here). Alla fine del giorno voglio analizzare le frequenze da solo. Per ora sto cercando di capire un po 'di quello che sta succedendo qui. Le mie scuse se questo è banale, sto solo cercando di capire alcuni dei numeri magici non commentati che galleggiano in qualche fonte. I miei punti principali di confusione in questo momento sono:Informazioni su FFT in aurioTouch2

  1. Perché hanno azzerare il valore di Nyquist in FFTBufferManager :: ComputeFFT? Questo valore può davvero essere gettato via? (~ riga 112 di FFTBufferManager.cpp).
  2. Ridimensionano tutto di -128 dB, quindi presumo che i risultati siano compresi nell'intervallo tra (-128, 0). Tuttavia, più avanti in aurioTouchAppDelegate.mm (~ line 807), convertono questo valore in un valore compreso tra 0 e 1 aggiungendo 80 e dividendo per 64, quindi serrando a 0 e 1. Perché la sfocatura? Inoltre, ho ragione nel presumere che i valori saranno nelle vicinanze di (-128, 0)?

risposta

13

Beh, non è banale neanche per me ma è così che lo capisco. Se ho semplificato, è puramente a mio vantaggio, non intendo essere paternalistico.

Azzeramento il risultato corrispondente alla frequenza di Nyquist:

sto andando supporre che stiamo calcolando la FFT in avanti di 1024 campioni di ingresso. Con l'input 44100hz questo è solitamente vero nel mio caso (ma non è quello che AurioTouch sta facendo, che trovo un po 'strano, ma non sono un esperto). È più facile per me capire con valori specifici.

Dato campioni 1024 (n) di ingresso, disposti secondo necessità (anche indici primi indici poi dispari {a [0], in [2], in [4], ..., in 1, in [3], in [5], ...}) (utilizzare vDSP_ctoz() ordinare l'input)

L'uscita della FFT 1024 campioni (n) di ingresso è ((n/2) + 1) valori complessi. cioè 513 componenti reali e 513 elementi immaginari, per un totale di valori.

Tuttavia, immaginario [0] e immaginario [512] (n/2) sono sempre, necessariamente, nullo. Quindi, mettendo reale [512] (la componente reale del bidone frequenza di Nyquist) a immaginario [0] e dimenticando immaginario [512] - che è sempre pari a zero e può essere dedotto, i risultati sono confezionati in un (n) buffer di lunghezza.

Pertanto, affinché i risultati restituiti siano validi, è necessario impostare almeno lo immaginario [0] su zero. Se avete bisogno di tutti i ((n/2) +1) bin di frequenza è necessario aggiungere un altro valore complesso al risultato e metterlo quindi ..

unpackedVal = imaginary[0] 
real[512]=unpackedVal, imaginary[512]=0 
imaginary[0] = 0 

In AurioTouch dovrei sempre hanno appena don' t fastidio.n/2 risultati è ovviamente più conveniente per lavorare con e difficilmente si può dire dal Visualizer: - "Oh guarda, che manca una magnitudine alla frequenza di Nyquist"

The UsingFourierTransforms docs explain the packing

NB i valori specifici 1024, 513, 512, ecc. Sono esempi non dei valori effettivi di n, (n/2) +1, n/2 di AurioTouch.

Essi scalare tutto dalla -128db

Non proprio, l'intervallo dei valori di uscita è rispetto al numero di campioni di ingresso quindi deve essere normalizzato. La scala è 1.0/(2 * inNumberFrames).

Dopo il ridimensionamento dell'intervallo è -1,0 -> +1,0. La grandezza del vettore complesso viene quindi portata (fase viene ignorato) dando un valore scalare per ciascun intervallo di frequenza tra 0 e 1,0

Questo valore viene quindi interpretato come un valore in decibel tra -128 e 0

Il disegno ... +80/64. ... * 120 ... ... non sono sicuro. Potrei sbagliarmi completamente o potrebbe essere ... una licenza artistica?

+0

Grazie mille per aver trovato il tempo di spiegarmelo. –