android fft 实例,java - Using FFT in Android - Stack Overflow

I am having trouble understanding how I should pass PCM data from the mic to this FFT class I am using made by Piotr Wendykier (it's the DoubleFFT_1D class in JTransforms).

I think I have to return a real and imaginary number and then double the real number to eventually obtain Frequency = 8000 * i / 1024 where i is the index of the highest magnitude.

Can someone help me in finding the frequency of a note played in?

I have a recording class as follows:

import edu.emory.mathcs.jtransforms.fft.DoubleFFT_1D;

...other various imports...

class recorderThread {

...public variables...

public static void getFFtresult(){

AudioRecord recorder;

short[] audioData;

int bufferSize;

int samplerate = 8000;//or 8192?

bufferSize= AudioRecord.getMinBufferSize(samplerate,AudioFormat.CHANNEL_CONFIGURATION_MONO,

AudioFormat.ENCODING_PCM_16BIT)*2; //get the buffer size to use with this audio record

recorder = new AudioRecord (AudioSource.MIC,samplerate,AudioFormat.CHANNEL_CONFIGURATION_MONO,

AudioFormat.ENCODING_PCM_16BIT,bufferSize); //instantiate the AudioRecorder

recording=true; //variable to use start or stop recording

audioData = new short [bufferSize]; //short array that pcm data is put into.

int recordingLoops = 0;

while (recordingLoops < 4) { //loop while recording is needed

if (recorder.getState()==android.media.AudioRecord.STATE_INITIALIZED) // check to see if the recorder has initialized yet.

if (recorder.getRecordingState()==android.media.AudioRecord.RECORDSTATE_STOPPED)

recorder.startRecording(); //check to see if the Recorder has stopped or is not recording, and make it record.

else {

recorder.read(audioData,0,bufferSize); //read the PCM audio data into the audioData array

DoubleFFT_1D fft = new DoubleFFT_1D(1023); //instance of DoubleFFT_1D class

double[] audioDataDoubles = new double[1024];

for (int j=0; j <= 1023; j++) { // get audio data in double[] format

audioDataDoubles[j] = (double)audioData[j];

}

fft.complexForward(audioDataDoubles); //this is where it falls

for (int i = 0; i < 1023; i++) {

Log.v(TAG, "audiodata=" + audioDataDoubles[i] + " no= " + i);

}

recordingLoops++;

}//else recorder started

} //while recording

if (recorder.getState()==android.media.AudioRecord.RECORDSTATE_RECORDING) recorder.stop(); //stop the recorder before ending the thread

recorder.release(); //release the recorders resources

recorder=null; //set the recorder to be garbage collected

}//run

}//recorderThread

Thanks so much!

Ben

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值