Java 如何使用FFT从PCM获取频率数据

Java 如何使用FFT从PCM获取频率数据,java,android,fft,pcm,Java,Android,Fft,Pcm,我有一个音频数据数组,正在传递给读卡器: recorder.read(audioData,0,bufferSize); 实例化如下所示: AudioRecord recorder; short[] audioData; int bufferSize; int samplerate = 8000; //get the buffer size to use with this audio record bufferSize = AudioRecord.getMinBufferSize(sam

我有一个音频数据数组,正在传递给读卡器:

 recorder.read(audioData,0,bufferSize); 
实例化如下所示:

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.
我在网上找到了一个FFT类和一个复杂的类。 我已经尝试了两天的在线搜索,但无法找到如何循环存储在
audioData
中的值并将其传递给FFT

这是我正在使用的FFT类:
这是一个复杂的类:

PCM是数据编码技术。这与使用FFT对音频数据进行频率分析无关。如果使用Java对PCM编码数据进行解码,您将获得原始音频数据,然后可以将其传递到FFT库。

假设
audioData
数组包含原始音频数据,则需要从
audioData
数组中创建一个
复杂[]
对象,如下所示:

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

一些细节将取决于FFT的用途


所需FFT的长度取决于您在分析中希望的频率分辨率和时间精度(它们是反向相关的),可能在音频输入缓冲区的长度附近,也可能不在附近。考虑到长度上的差异,您可能需要组合多个缓冲区、分段单个缓冲区或两者的某种组合,以获得满足分析要求的FFT窗口长度。

我曾尝试过使用过零交叉方法,我必须把从这个方法得到的数据传递给FFT吗?从我所看到的窗口长度只从我的输出中取一些值?我是否在这里获取数据的峰值以实现频率?Thanks@Ben塔利亚多罗斯:这对你有帮助吗?因为我也在努力解决这个问题
Complex[] fftResult = FFT.fft(complexData);