2012-04-02 22 views
5

如何從我的語音記錄中查找最小,最大,平均值,標準開發音高? 我使用AudioRecord錄製我的聲音。在Android上查找語音音調

frequency = 8000; 
channelConfiguration = AudioFormat.CHANNEL_CONFIGURATION_MONO; 
audioEncoding = AudioFormat.ENCODING_PCM_16BIT; 

recordInstance = new AudioRecord(MediaRecorder.AudioSource.MIC,frequency, channelConfiguration, audioEncoding, bufferSize); 

後我使用FFT算法來處理語音的原始數據,並獲得漂浮[]

後我使用此功能:

private float[] spectrumAnalyz(float[] spectr) { 
float Re; 
float Im; 
float[] spectruData = spectr; 
float[] mySpectrum = new float[(spectruData.length/2) - 1]; 
for (int i = 1, j = 0; i < spectruData.length/2; i++, j++) { 
Re = spectruData[2 * i]; 
Im = spectruData[2 * i + 1]; 
mySpectrum[j] = (float) Math.sqrt(Re * Re + Im * Im); 
} 
return mySpectrum; 
} 

此函數返回頻率陣列。在谷歌搜索後,我發現使用這個公式我能找到的最小,最大這個公式 http://en.wikipedia.org/wiki/Pitch_(music)

pitch = 69+12*log2(F/440Hz), where F is frequency in Hz. 

,平均值和標準偏差間距。

全部正確嗎?

回答

0

FFT爲一堆選定的音頻頻譜頻段返回一個複數量級的數組。它不直接估計音調頻率,因爲音調不僅僅是一個頻譜頻率分檔。

如果您使用基音檢測或估計方法(加權自相關,倒譜,RAPT等),則您引用的公式會給出該基音頻率的MIDI編號。

+1

如何獲取帶有人聲信息的頻率數據?也許我應該使用一些庫或框架? – illiaklimov 2012-04-12 08:00:31