Soy bastante nuevo en Java y procesamiento de señales, pero se me asignó un proyecto que se ocupa del procesamiento de audio. Mi tema que se me da es un juego que tiene un componente de análisis de una canción (cualquier canción) y genera datos dependiendo de la frecuencia que se está reproduciendo actualmente (en tiempo real). es decir: mientras se reproduce la canción, emite la frecuencia actual (cada segundo emite la frecuencia actual).
Me han dicho en stackoverflow que use FFT. dicen "solo haz una FFT" pero eso no significa nada para mí? ¿CÓMO haces una FFT? He leído tutoriales, y básicamente entiendo lo que es, pero no tengo idea de cómo implementarlo como en:
- ¿Cuál es el tipo de datos del archivo de audio más adecuado para dicho procesamiento?
- cuál es exactamente la entrada de la FFT
- ¿Cómo interpreto los resultados?
¿Alguien puede sugerir un tutorial / tutorial fácil de seguir sobre cómo procesar una señal de audio? Además, si alguien conoce una buena implementación de FFT para Java, agradecería las sugerencias.
Respuestas:
Veamos. No tengo idea sobre las clases de Java o qué tipo de soporte tiene para el procesamiento de señales, pero le daré algunas pautas. Los detalles particulares de la implementación en el lenguaje, tienes que averiguarlo.
Para realizar cualquier tipo de procesamiento en un archivo de audio, necesita los datos "en bruto", es decir, un archivo de audio que tenga muestras de audio sin comprimir. Por ejemplo, el formato WAV, que normalmente tiene muestras en un complemento de 2 con signo de 16 bits.
Si va a usar una computadora y hacer un procesamiento fuera de línea, podría ser una buena idea convertir ese valor al doble (lo que en la mayoría de los procesadores de hoy significa número de coma flotante de 64 bits).
Por lo tanto, tendrá un flujo continuo de números dobles provenientes del archivo. Luego debe definir una forma de manejar los datos continuos. Una forma estándar muy utilizada es usar un búfer circular (incluso si está fuera de línea, supongo que desea que su código sea eficiente, y cargar todo el archivo en la memoria como una matriz no es la mejor solución). O eso o simplemente un búfer normal, es su elección. La longitud del búfer debe ser una potencia de 2 (Do a la eficiencia del algoritmo Radley-2 de Cooley-Tukey).
Ahora necesitas hacer la FFT real. Esto es simplemente una multiplicación del búfer (que matemáticamente es un vector) por la matriz FFT. Cómo se realiza esta operación en Java, ni idea. En C sería solo pasar el puntero a la matriz y la longitud a una rutina FFT que, o bien devuelve un puntero a la memoria asignada dinámicamente, o deja el resultado en una matriz que le pasa.
finalmente, llega a una matriz de números complejos M (suponiendo que la longitud de la matriz / buffer / vector con la señal es M). Y luego haces lo que quieras con él.
Por ejemplo, podría tomar la magnitud de cada uno de los números complejos y encontrar el máximo para detectar dónde podría estar la frecuencia fundamental (aunque muy aproximada).
Extras: Las técnicas más avanzadas para procesar incluirían una ventana previa para evitar fugas, hacer relleno cero para obtener más resolución en el espectro de ventanas, etc.
Espero eso ayude.
fuente
Si eres lo suficientemente bueno
JAVA
, puedes usar JTRANSFORMS, una biblioteca de Java para laFFT
que puede ayudarte.y por tu necesidad suena como un
Visualización de música utilizando Java Sound API
Visualización de música usando FFT en Ruby en 7 pasos
puede seguir estos sencillos pasos según sus requisitos:
* Acostúmbrate a alguna terminología de audio
1.Lea el marco de reproducción (digamos 20-30 ms), el tamaño de su marco depende de su tamaño,
sampling rate
digamos que está utilizando una frecuencia de muestreo de 8000 y cada muestra es16bit
signed
little endian
, entonces su marco de 20 ms será de 160 muestrasNota: intente reproducir un
raw
archivo no comprimidomp3
.2.Tome el marco de datos sin procesar y realice un
FFT
3.Realizar adecuadamente
Windowing
4. Su resultado FFT de salida tendrá dos componentes reales y complejos. Intente tomar un gráfico de magnitud, que es solo el
absolute
valor del componente complejo, su pico le da eldominant frequency
5. echa un vistazo a tutoriales simples como a continuación
Buen tutorial sobre FFT
Guía de ingenieros para FFT
Tutorial FFT
OverView de FFT
fuente