1

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

4

2 に答える 2

2

サンプル レートは重要ではありませんが、ビット深度、エンディアン、および別の方法でチャネル数が重要です。

To see why, you must simply notice that the function in question takes a byte array as an argument and processes each value from that array individually. The byte datatype is an 8-bit value. If you want something that works with 16-bit values, you need to use a different datatype (short) or convert to that from bytes.

Once you do that, you will still get different values for 16 bits vs 8 bit because the range is different: 8 bit goes from -128 to +127 and 16 bit goes from -32768 to +32767, but they are both measuring the same thing, meaning they scaling the same real-word values to different represented values.

サウンドレベルと時間との関係については....サンプルレートとこの関数に入る配列のサイズに依存します。たとえば、サンプルレートが 8kHz で、バッファーごとに 2048 個のサンプルがある場合、関数は 8000/2048 または 1 秒あたり約 3.9 回呼び出され、結果がそのレート (256 ミリ秒ごと) で受信されることを意味します。

于 2012-07-18T20:08:00.423 に答える
0

入力を常に同じ最小 - 最大範囲にスケーリングして、異なる形式から同様の結果を得ることができます。

時間あたりのサウンド レベルに関しては、サンプルが互いに 1/SampleRate(in Hz) 秒離れていること以外に関係はありません。

于 2012-07-18T11:47:27.077 に答える