录音机以分贝为单位获得噪音水平

时间:2013-01-24 06:03:31

标签: android recorder

我正在尝试以decibals获取录制音频的噪音水平。我正在使用以下代码,但它没有提供正确的输出

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

现在,如果我记录sampleSize,那么它会给出非常大的值,如956318464

任何人都可以告诉我们如何在decibals中获得正确的噪音水平。

2 个答案:

答案 0 :(得分:2)

首先 - 分贝是比率。您不仅可以获得分贝,还需要将音量与基线测量值进行比较。因此,振幅方面的实数等式是

db = 10 * log10(amplitude / baseline_amplitude);

如果您现在正在录制音频,请使用MediaRecorder.getMaxAmplitude来获取振幅。对于基线幅度,测量预期的背景噪声。

答案 1 :(得分: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;

它的工作正常这个方法