2012-04-02 56 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