2

録音したオーディオのノイズレベルをデシバルで取得しようとしています。次のコードを使用していますが、正しい出力が得られません

byte[] audioData = new byte[bufferSize];
recorder.read(audioData, 0, bufferSize);
ByteBuffer bb = ByteBuffer.wrap(audioData);
int sampleSize = bb.getInt();

ここでsampleSizeをログに記録すると、956318464のような非常に大きな値が得られます。

誰もがデシバルで正しいノイズレベルを取得する方法を教えてもらえますか?

4

2 に答える 2

2

最初のオフデシベルは比率です。デシベルだけを取得することはできません。ボリュームをベースライン測定値と比較する必要があります。したがって、振幅に関する実際の方程式は次のようになります。

db = 10 * log10(amplitude / baseline_amplitude);

ここでオーディオを録音している場合、振幅を取得するには、MediaRecorder.getMaxAmplitudeを使用します。ベースライン振幅については、予想されるバックグラウンドノイズを測定します。

于 2013-01-24T06:45:29.450 に答える
0
 public int calculatePowerDb(short[] sdata, int off, int samples)
    {
        double sum = 0;
        double sqsum = 0;
        for (int i = 0; i < samples; i++)
        {
            final long v = sdata[off + i];
            sum += v;
            sqsum += v * v;
        }
        double power = (sqsum - sum * sum / samples) / samples;

        power /= MAX_16_BIT * MAX_16_BIT;

        double result = Math.log10(power) * 10f + FUDGE;
        return (int)result;
    }
    private static final float MAX_16_BIT = 32768;
private static final float FUDGE = 0.6f;

この方法でうまく機能します

于 2013-11-29T14:14:34.550 に答える