2011-09-29 17 views
5

从PCM获得频率数据我有音频数据的数组我传递给读者:我如何使用FFT

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

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

+0

我曾尝试过使用过零点方法,是否必须将数据从此方法传递到FFT? –

3

假设audioData数组包含原始音频数据,您需要从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); 
+0

我试试这个,谢谢! –

+0

@Ben Taliadoros:这是否帮助你?因为iam也在努力解决这个问题 – androidGuy

+0

是的,你的问题是什么?# –

1

一些细节将取决于您的FFT的目的。

所需的FFT长度取决于频率分辨率和时间精度(它们是反向相关的),您希望在您的分析中使用,它可能会或可能不会接近音频输入缓冲区的长度。鉴于这些长度的差异,您可能必须组合多个缓冲区,将单个缓冲区或两者的某种组合分开才能获得满足分析要求的FFT窗口长度。

+0

从我看到的窗口长度只取自我的输出中的一些值?我在这里采集数据的峰值来达到频率吗?谢谢 –