为什么我的程序无法检测到超过90分贝?

时间:2018-08-16 13:28:00

标签: java audio microphone decibel

所以,这里的主要问题是我还不知道实际的问题是什么。我有两个麦克风,使用其中一个麦克风时,检测db中音量的程序最多只能检测90个麦克风。我不确定这是否是麦克风的限制,还是它是程序,但它清楚地表明它是90db,并且无论它是否高,它都不会更高。如果证明有帮助,我的麦克风是便宜的Logitech网络摄像头和蓝色的雪人麦克风(不便宜)。

如果是麦克风,为什么会这样呢?如果没有,那么这就是我要弄清楚数据库级别是什么的代码:

AudioFormat audioFormat = getAudioFormat();
TargetDataLine targetDataLine;
try {
    targetDataLine = (TargetDataLine) AudioSystem.getTargetDataLine(audioFormat);
    targetDataLine.open();
    targetDataLine.start();
    byte [] buffer = new byte[2000];
    while (true) {
        int bytesRead = targetDataLine.read(buffer,0,buffer.length);
         if (bytesRead >= 0) {
             max = (int) (buffer[0] + (buffer[1] << 8));
             for (int p=2;p<bytesRead-1;p+=2) {
                 int thisValue = (int)(buffer[p] + (buffer[p+1] << 8));
                 if (thisValue > max) max = thisValue;
             }

         }
    }
} catch (LineUnavailableException e) {
    // TODO Auto-generated catch block
    e.printStackTrace();
}
currentDecibelLabel.setText(Integer.toString((int)(20 * Math.log10(max)))));

有什么想法吗?谢谢!

编辑:众所周知,'max'是global int

1 个答案:

答案 0 :(得分:3)

您的max变量很短。

根据oracle,简短最大值为32767(有符号16位/ 2字节值)

20*log10(32767) = 90.3087

当您将其转换为int时,它会四舍五入为90。

如果API仅给您2个字节来获取音量,并且(如果(并且仅当)它是未签名的),则可以将max定义为int而不是将最大值提高一倍值达到96dB。