2011-10-31 11 views
8

Estoy explorando el reconocimiento de voz y DSP, por lo que me gustaría implementar un analizador de frecuencia de sonido simple en mi teléfono inteligente (tengo un iPhone y un Samsung Nexus S con Android). He hecho DSP básico en Matlab previamente.¿Cuántas FFT por segundo puedo hacer en mi teléfono inteligente? (para realizar reconocimiento de voz)

Según tengo entendido, necesito realizar una FFT para obtener las frecuencias fundamentales de una señal.

Así que ahora, me gustaría probar el micrófono a 44100 Hz. Si utilizo una ventana deslizante de tamaño de muestra 512 con una superposición del 50%, eso significa que necesito hacer una FFT cada 256 muestras, o 0.00580 segundos.

Esa tasa parece realmente alta, especialmente si programo en Java para Android. ¿Mi teléfono inteligente podrá manejar esa velocidad? Soy consciente de que puedes programar en C/C++ en Android, pero me gustaría mantenerlo con Java por el momento.

+0

considerar que existen otros métodos de estimación de la frecuencia fundamental otro entonces FFT –

+0

No creo que OP realmente tenga la intención de usar la frase "frecuencia fundamental" en el sentido de reconocimiento de tono (es decir, encontrar la frecuencia dominante), ya que esto normalmente no sería algo que usarías para el reconocimiento de voz. – MusiGenesis

Respuesta

9

La realización de una FFT de real a compleja requiere ~ 5/2 n lg n operaciones de coma flotante (adiciones y multiplicaciones). En su caso, n = 512, por lo que:

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

Así FFT 172 por segundo requiere alrededor de 2 millones de operaciones de punto flotante por segundo. Eso suena como mucho, pero realmente no son tantos. El hardware de un teléfono inteligente típico de armv7 es capaz de realizar cientos de millones o miles de millones de operaciones de coma flotante por segundo.

Sin embargo, tenga en cuenta que querrá tener una FFT de alto rendimiento cuidadosamente escrita; las FFT mal redactadas son notoriamente ineficientes. En el iPhone, puede usar el marco Accelerate (integrado en el sistema operativo y disponible en el SDK), que proporciona un buen conjunto de funciones FFT; No estoy seguro de lo que está disponible en Android.

+0

¿De dónde sacaste ese estimado para FLOPS por FFT? ¿Puedes señalarme algo de literatura? Sé de la O (N lg N) vinculada al algoritmo de Cooley-Tukey, pero no he visto una estimación de FLOPS. – stackoverflowuser2010

+0

El papel original de Cooley-Tukey en realidad ofrece un conteo de 5 n lg n flop más refinado; las personas comúnmente usan ese conteo (y por lo tanto 5/2 n lg n para una fft real a compleja, aunque eso no sea exactamente correcto). En realidad, los algoritmos más sofisticados (como se usan en la práctica común) realmente requieren un poco menos fracasos. No estoy seguro de cuál es el límite inferior más reciente del estado del arte, pero creo que fue alrededor de 4 n lg n la última vez que miré. –

+0

@ stackoverflowuser2010: la página de wikipedia en la FFT tiene algunos buenos enlaces al trabajo reciente en los límites de la constante. –

5

Para el iPhone, el marco Accelerate para iOS puede hacer todas las FFT especificadas usando del orden del 1% del tiempo de CPU (porcentaje exacto según el modelo de dispositivo y los tipos de datos FFT).

Para Android, es posible que desee considerar el uso de una biblioteca nativa NDK para cálculos numéricos intensivos del procesador.

También tenga en cuenta que una FFT le proporcionará las frecuencias pico, que no necesariamente incluirán la frecuencia fundamental o de tono de voz.

AGREGADO: Este Java benchmark web page sugiere que los teléfonos Android son capaces de en el rango de 5 a más de 50 MFlops utilizando Java para la matemática de la matriz bien escrita. Una FFT bien escrita debería tener aproximadamente el mismo rango de rendimiento en MFlops. @Stephan Cannon publicó que en el orden de 2 MFlops podría ser necesario para su especificación.

+0

Interesante ... ¿por qué el voto hacia abajo? – hotpaw2

+0

No puedo imaginar por qué alguien votaría por esto. –

+0

No fui yo, pero casi rechacé esta respuesta porque comienza mencionando iPhone y pensé que era una pregunta pura de Android (no noté las etiquetas). – MusiGenesis

3

Su dispositivo Android será capaz de manejar esta multa. He escrito analizadores de frecuencia basados ​​en FFT en tiempo real que se ejecutan en dispositivos Windows Mobile desde hace unos años (usando C# puro), y estos dispositivos tenían procesadores mucho peores que los dispositivos Android actuales. El aspecto más costoso desde el punto de vista computacional de FFT son las funciones trigonométricas, y como está utilizando una ventana de tamaño fijo, puede reemplazar fácilmente las llamadas a funciones trigonométricas con una tabla de búsqueda precalculada.

1

Como un lado, probablemente pueda reducir el tiempo de cálculo reduciendo la velocidad de muestreo. El habla no tiene mucha energía por encima de 8 kHz, por lo que es probable que disminuya la resolución de su audio a 16 KHz antes de realizar cualquier FFT, sin perder mucha precisión. A 16 kHz, tus FFT serían más pequeñas y más rápidas.

Wikipedia claims que 16 kHz es una frecuencia de muestreo estándar para reconocimiento de voz en aplicaciones de escritorio.

(me di cuenta de que esto no responde a la pregunta de la OP, pero yo creo que puede ser útil para él, sin embargo, dada su aplicación.)

Cuestiones relacionadas