【问题标题】:Audio Recorder get noise level in decibal录音机以分贝为单位获得噪音水平
【发布时间】:2013-01-24 06:03:31
【问题描述】:

我正在尝试获取以分贝计的录制音频的噪声级别。我正在使用以下代码,但它没有给出正确的输出

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

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

谁能告诉我如何在分贝中获得正确的噪音水平。

【问题讨论】:

  • “噪音水平”是什么意思?您是否尝试测量录音中的噪声量(例如信噪比)?您可能可以通过分析某些频带内的能量来实现某种固定噪声的测量,但对于动态噪声,我怀疑在没有参考信号的情况下您能否获得良好的结果。如果您正在尝试计算声压级...嗯,您已经获得了信号的线性幅度(这是您从记录仪读取时得到的),这就是您计算的基础。

标签: android recorder


【解决方案1】:

第一分贝是一个比率。您不能只获得分贝,您需要将音量与基线测量值进行比较。所以关于振幅的真实方程是

db= 10* log10(振幅/基线_振幅);

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

【讨论】:

  • baseline_amplitude 的公式是什么?
  • 你需要测量它——背景噪声的幅度。
【解决方案2】:
 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;

这个方法效果很好

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2010-11-20
    • 2017-03-28
    • 1970-01-01
    • 2012-11-16
    • 2017-08-17
    • 1970-01-01
    • 1970-01-01
    • 2011-02-02
    相关资源
    最近更新 更多