我正在尝试以decibals获取录制音频的噪音水平。我正在使用以下代码,但它没有提供正确的输出
byte[] audioData = new byte[bufferSize];
recorder.read(audioData, 0, bufferSize);
ByteBuffer bb = ByteBuffer.wrap(audioData);
int sampleSize = bb.getInt();
现在,如果我记录sampleSize,那么它会给出非常大的值,如956318464
任何人都可以告诉我们如何在decibals中获得正确的噪音水平。
答案 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;
它的工作正常这个方法