我有一个传递给读者的音频数据数组:
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类:http://www.cs.princeton.edu/introcs/97data/FFT.java 这是一个复杂的课程:http://introcs.cs.princeton.edu/java/97data/Complex.java.html
答案 0 :(得分:3)
假设audioData
数组包含原始音频数据,您需要从Complex[]
数组创建一个audioData
对象:
Complex[] complexData = new Complex[audioData.length];
for (int i = 0; i < complexData.length; i++) {
complextData[i] = new Complex(audioData[i], 0);
}
现在,您可以将complexData
对象作为参数传递给FFT函数:
Complex[] fftResult = FFT.fft(complexData);
答案 1 :(得分:1)
部分细节取决于FFT的用途。
所需FFT的长度取决于您在分析中所希望的频率分辨率和时间精度(它们是反向相关的),这可能是也可能不是音频输入缓冲区长度附近。鉴于长度差异,您可能需要组合多个缓冲区,分割单个缓冲区或两者的某种组合,以获得满足分析要求的FFT窗口长度。
答案 2 :(得分:0)
PCM是一种编码数据的技术。它与使用FFT获取音频数据的频率分析无关。如果您使用Java解码PCM编码数据,您将获得原始音频数据,然后可以将其传递到您的FFT库。