マイクのサウンド レベル (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 が返されます。また、サウンド レベルをグラフにグラフ化したいのですが、サウンド レベルの値はどのように時間に関連していますか?