2011-10-31 3 views
8

Sto esplorando il riconoscimento vocale e DSP, e quindi vorrei implementare un semplice analizzatore di frequenza del suono sul mio smartphone (ho sia un iPhone che un Samsung Nexus S con Android). Ho già fatto il DSP di base in Matlab in precedenza.Quanti FFT al secondo posso fare sul mio smartphone? (per l'esecuzione del riconoscimento vocale)

Dalla mia comprensione, ho bisogno di eseguire una FFT per ottenere le frequenze fondamentali di un segnale.

Così ora, vorrei campionare il microfono a 44100 Hz. Se utilizzo una finestra scorrevole della dimensione del campione 512 con sovrapposizione del 50%, ciò significa che è necessario eseguire un FFT ogni 256 campioni o 0,00580 secondi.

Tale tariffa sembra davvero alta, in particolare se programma in Java per Android. Il mio smartphone sarà in grado di gestire quella velocità? Sono consapevole che puoi programmare in C/C++ su Android, ma per il momento mi piacerebbe tenerlo con Java.

+0

considerare che ci sono altri metodi di stima frequenza fondamentale altri poi FFT –

+0

Non credo che l'OP intendesse davvero usare la frase "frequenza fondamentale" nel senso del riconoscimento del tono (cioè trovare la frequenza dominante), in quanto questo non sarebbe di solito qualcosa che useresti per il riconoscimento vocale. – MusiGenesis

risposta

9

L'esecuzione di un FFT reale-complesso richiede ~ 5/2 n lg n operazioni in virgola mobile (aggiunte e moltiplicazioni). Nel tuo caso, n = 512, quindi:

flops per fft ~= (5/2) * 512 * 9 = 11520 

Così 172 FFT al secondo richiede circa 2 milioni di operazioni in virgola mobile al secondo. Sembra molto, ma in realtà non sono molti. L'hardware di un tipico smartphone di classe armv7 è capace di centinaia di milioni o miliardi di operazioni in virgola mobile al secondo.

Si noti tuttavia che si desidera disporre di un FFT ad alte prestazioni accuratamente scritto; FFT scritti male sono notoriamente inefficienti. Su iPhone, è possibile utilizzare il framework Accelerate (integrato direttamente nel sistema operativo e disponibile nell'SDK), che fornisce un bel set di funzioni FFT; Non sono sicuro di cosa sia disponibile su Android.

+0

Dove hai ottenuto tale stima per FLOPS per FFT? Puoi indicarmi qualche letteratura? So che O (N lg N) è legato all'algoritmo di Cooley-Tukey, ma non ho visto una stima FLOPS. – stackoverflowuser2010

+0

La carta originale Cooley-Tukey dà effettivamente un conteggio 5 n lg n di flop più raffinato; le persone usano comunemente quel conteggio (e quindi 5/2 n lg n per un fft reale-complesso, anche se non è esattamente giusto). In realtà, gli algoritmi più sofisticati (come sono usati nella pratica comune) in realtà richiedono un po 'meno flop. Non sono sicuro di quale sia l'attuale limite inferiore dello stato dell'arte, ma credo che fosse all'incirca 4 n lg n l'ultima volta che ho guardato. –

+0

@ stackoverflowuser2010: la pagina di Wikipedia sulla FFT ha alcuni buoni collegamenti con i lavori recenti sui limiti della costante. –

5

Per l'iPhone, il framework Accelerate per iOS può eseguire tutti gli FFT specificati utilizzando nell'ordine dell'1% del tempo della CPU (percentuale esatta in base al modello di dispositivo e ai tipi di dati FFT).

Per Android, è consigliabile prendere in considerazione l'utilizzo di una libreria nativa NDK per calcoli numerici intensivi del processore.

Nota anche che una FFT ti darà le frequenze di picco, che non includeranno necessariamente la frequenza del tono fondamentale o della voce.

AGGIUNTO: questo Java benchmark web page suggerisce che i telefoni Android sono in grado di eseguire da 5 a oltre 50 MFlops utilizzando Java per matematica con matrice ben scritta. Una FFT ben scritta dovrebbe oscillare all'incirca nello stesso intervallo di prestazioni in MFlops. @Stephan Cannon pubblicato per l'ordine di 2 MFlops potrebbe essere richiesto per la tua specifica.

+0

Interessante ... perché il voto negativo? – hotpaw2

+0

Non riesco a immaginare perché qualcuno possa votare questo. –

+0

Non ero io, ma ho quasi votato questa risposta perché inizia citando iPhone e ho pensato che si trattasse di una pura questione Android (non ho notato i tag). – MusiGenesis

3

Il dispositivo Android sarà in grado di gestire questa multa. Ho scritto analizzatori di frequenza in tempo reale basati su FFT che giravano su dispositivi Windows Mobile da alcuni anni fa (usando puro C#), e questi dispositivi avevano processori molto peggiori degli attuali dispositivi Android. L'aspetto più oneroso dal punto di vista computazionale di FFT è rappresentato dalle funzioni trigonometriche e, dal momento che si utilizza una finestra a dimensione fissa, è possibile sostituire facilmente le chiamate della funzione trigonometrica con una tabella di ricerca precalcolata.

1

Come accantonamento puoi probabilmente ridurre il tempo di calcolo riducendo la frequenza di campionamento. Il parlato non ha molta energia al di sopra degli 8 kHz, quindi potresti probabilmente ridimensionare l'audio a 16 KHz prima di eseguire qualsiasi FFT, senza perdere molta precisione. A 16 kHz i tuoi FFT sarebbero più piccoli e quindi più veloci.

Wikipedia claims che 16 kHz è una frequenza di campionamento standard per il riconoscimento vocale nelle applicazioni desktop.

(mi rendo conto che questo non risponde alla domanda del PO, ma penso che potrebbe essere utile per lui comunque, data la sua applicazione.)