2011-09-29 20 views
5

Tengo una matriz de datos de audio que estoy pasando a un lector:¿Cómo puedo obtener los datos de frecuencia de PCM mediante FFT

recorder.read(audioData,0,bufferSize); 

La ejemplificación es el siguiente:

AudioRecord recorder; 
short[] audioData; 
int bufferSize; 
int samplerate = 8000; 

//get the buffer size to use with this audio record 
bufferSize = AudioRecord.getMinBufferSize(samplerate, AudioFormat.CHANNEL_CONFIGURATION_MONO, AudioFormat.ENCODING_PCM_16BIT)*3; 

//instantiate the AudioRecorder 
recorder = new AudioRecord(AudioSource.MIC,samplerate, AudioFormat.CHANNEL_CONFIGURATION_MONO, AudioFormat.ENCODING_PCM_16BIT,bufferSize); 

recording = true; //variable to use start or stop recording 
audioData = new short [bufferSize]; //short array that pcm data is put into. 

tengo una La clase de FFT I la he encontrado en línea y una clase compleja que la acompaña. He intentado durante dos días buscar en línea en todas partes pero no puedo encontrar la forma de recorrer los valores almacenados en audioData y pasarlo a la FFT.

Esta es la clase de FFT que estoy utilizando: http://www.cs.princeton.edu/introcs/97data/FFT.java y esta es la clase de complejo para ir con ella: http://introcs.cs.princeton.edu/java/97data/Complex.java.html

Respuesta

0

PCM es la técnica de codificación de datos. No es relevante obtener análisis de frecuencia de datos de audio mediante FFT. Si utiliza Java para decodificar datos codificados PCM obtendrá datos de audio en bruto que luego se pueden pasar a su biblioteca FFT.

+0

He intentado esto, utilizando un método de cruce por cero, ¿tengo que pasar los datos que obtengo de este método a la FFT? –

3

Suponiendo que la matriz audioData contiene los datos de audio en bruto, es necesario crear un objeto de la matriz audioData como tal:

Complex[] complexData = new Complex[audioData.length]; 
for (int i = 0; i < complexData.length; i++) { 
    complextData[i] = new Complex(audioData[i], 0); 
} 

Ahora usted puede pasar su objeto complexData como parámetro a la función FFT:

Complex[] fftResult = FFT.fft(complexData); 
+0

¡Lo intentaré, gracias! –

+0

@Ben Taliadoros:? ¿Esto ayuda u Debido iam también está luchando con este problema – androidGuy

+0

sí, ¿cuál es su problema # –

1

Algunos de los detalles dependerá del propósito de su FFT.

La longitud de la FFT requerida depende de la resolución de frecuencia y la precisión de tiempo (que están inversamente relacionadas), que desea en su análisis, que pueden o no estar cerca de la longitud de un búfer de entrada de audio. Dadas esas diferencias de longitud, es posible que tenga que combinar varios almacenamientos intermedios, segmentar un único almacenamiento intermedio o alguna combinación de los dos, para obtener la longitud de la ventana FFT que satisfaga los requisitos de análisis.

+0

por lo que he visto longitud de la ventana está tomando sólo algunos valores de mis salidas? ¿Estoy tomando picos de los datos aquí para lograr la frecuencia? Gracias –

Cuestiones relacionadas