Java 为什么可以';我的程序不能检测到超过90分贝的声音吗?

Java 为什么可以';我的程序不能检测到超过90分贝的声音吗?,java,audio,microphone,decibel,Java,Audio,Microphone,Decibel,所以,我这里的主要问题是我还不知道实际的问题是什么。我有两个麦克风,当使用其中一个时,我检测音量(db)的程序最多只能检测90。我不确定这是麦克风的限制,还是程序的限制,但它清楚地表明它是90 db,并且无论是否是,它都不会再高。如果这证明有用,我的麦克风是一个便宜的罗技网络摄像头和一个蓝色雪人麦克风(不便宜) 如果是麦克风,为什么会发生这种情况?如果不是,那么下面是我用来计算db级别的代码: AudioFormat audioFormat = getAudioFormat(); TargetD

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

如果是麦克风,为什么会发生这种情况?如果不是,那么下面是我用来计算db级别的代码:

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)))));
AudioFormat AudioFormat=getAudioFormat();
TargetDataLine TargetDataLine;
试一试{
targetDataLine=(targetDataLine)AudioSystem.getTargetDataLine(audioFormat);
targetDataLine.open();
targetDataLine.start();
字节[]缓冲区=新字节[2000];
while(true){
int bytesRead=targetDataLine.read(buffer,0,buffer.length);
如果(字节读取>=0){

max=(int)(buffer[0]+(buffer[1]您的
max
变量是一个短变量

根据以下条件,短最大值为32767(有符号16位/2字节值)

当你将它转换为int时,它的值是90


如果API仅提供2个字节来获取卷,并且如果(且仅当)它是无符号的,您可以将
max
定义为int,而不是将最大值加倍提高到96dB。

该死,我真的希望您是对的,我认为您是对的。然而,尽管这很有意义,但在将
short
的每一处内容更正并替换为
int
之后,它仍然不会超过90。@Pinkie漩涡是的,我这么做了。@pinkiewirl这个答案仍然有效。你只能从2个字节构建
max
。最大值是65535(96dB),但如果API返回一个有符号的值,最大值仍然是32767(90dB)@jhamon我没有说你的答案是错误的。有符号字节可以解释为无符号整数(在java API中是commi)这可能就是问题所在。woups,我想标记ops,我猜应该是
(buffer[p]+(buffer[p+1]
20*log10(32767) = 90.3087