我已經找到了一些代碼來計算麥克風音量(RMS):聲級RMS
public int calculateRMSLevel(byte[] audioData) {
// audioData might be buffered data read from a data line
long lSum = 0;
for (int i = 0; i < audioData.length; i++) {
lSum = lSum + audioData[i];
}
double dAvg = lSum/audioData.length;
double sumMeanSquare = 0d;
for (int j = 0; j < audioData.length; j++) {
sumMeanSquare = sumMeanSquare + Math.pow(audioData[j] - dAvg, 2d);
}
double averageMeanSquare = sumMeanSquare/audioData.length;
return (int) (Math.pow(averageMeanSquare, 0.5d) + 0.5);
}
但它僅適用於以下音頻格式:
private AudioFormat getAudioFormat() {
float sampleRate = 8000.0F;
int sampleSizeInBits = 8;
int channels = 1;
boolean signed = true;
boolean bigEndian = true;
return new AudioFormat(sampleRate, sampleSizeInBits, channels, signed,
bigEndian);
}
如何擴充,以便它可以使用不同的位數?如果我將位數改爲16,它會返回大約50的值,當靜音在8位時返回1或2.此外,我想在圖表上繪製聲級,聲級值與時間相關如何?
這是一個很老的問題,但我遇到了同樣的問題 - RMS對我來說總是在50左右。你是否設法解決這個問題? – locomotion 2016-03-18 01:44:34