Actualmente estoy tratando de implementar algún código con Android para detectar cuándo se tocan varios rangos de frecuencia de audio específicos a través del micrófono del teléfono. He creado la clase utilizando la clase AudioRecord
:FFT de audio Android para recuperar una magnitud de frecuencia específica usando audiorecord
int channel_config = AudioFormat.CHANNEL_CONFIGURATION_MONO;
int format = AudioFormat.ENCODING_PCM_16BIT;
int sampleSize = 8000;
int bufferSize = AudioRecord.getMinBufferSize(sampleSize, channel_config, format);
AudioRecord audioInput = new AudioRecord(AudioSource.MIC, sampleSize, channel_config, format, bufferSize);
El audio se lee en:
short[] audioBuffer = new short[bufferSize];
audioInput.startRecording();
audioInput.read(audioBuffer, 0, bufferSize);
Realización de una FFT es donde atorarse, ya que tengo muy poca experiencia en esta área . He estado tratando de utilizar esta clase:
FFT in Java y Complex class to go with it
entonces yo estoy enviando los siguientes valores:
Complex[] fftTempArray = new Complex[bufferSize];
for (int i=0; i<bufferSize; i++)
{
fftTempArray[i] = new Complex(audio[i], 0);
}
Complex[] fftArray = fft(fftTempArray);
Esto fácilmente podría ser yo malentendido cómo esta clase está destinado a trabajar, pero los valores devueltos saltan por todos lados y no son representativos de una frecuencia uniforme incluso en silencio. ¿Alguien sabe de una manera de realizar esta tarea, o estoy complicando demasiado las cosas para tratar de obtener solo un pequeño número de rangos de frecuencia en lugar de dibujarlo como una representación gráfica?
Hey, si lo imaginó, ¿podría publicar la versión final del código? thx –