2011-09-29 47 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

從我看到的窗口長度只取自我的輸出中的一些值?我在這裏採集數據的峯值來達到頻率嗎?謝謝 –