Cómo analizar la entrada / espectro de audio correctamente

9

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.

usuario3241507
fuente
2
Esta pregunta parece estar fuera de tema porque se trata de matrices Java básicas, tipos de datos y archivos de lectura.
hotpaw2
1
Dijeron que debo preguntar aquí, ya que tiene que ver con el procesamiento de señales
user3241507
Solo la última parte de su pregunta parece ser sobre DSP. Intente eliminar las primeras 2 o 3 partes para tratar el tema aquí.
hotpaw2

Respuestas:

8

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.

hueso
fuente
5

Si eres lo suficientemente bueno JAVA, puedes usar JTRANSFORMS, una biblioteca de Java para la FFTque puede ayudarte.

y por tu necesidad suena como un

ingrese la descripción de la imagen aquí

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 ratedigamos que está utilizando una frecuencia de muestreo de 8000 y cada muestra es 16bit signed little endian, entonces su marco de 20 ms será de 160 muestras

Nota: intente reproducir un rawarchivo no comprimido mp3.

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 absolutevalor 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

kakeh
fuente