Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/328.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 音频分贝声压级的计算_Java_Audio - Fatal编程技术网

Java 音频分贝声压级的计算

Java 音频分贝声压级的计算,java,audio,Java,Audio,我正在用java编写一个简单的db SPL表,试图理解一些关于如何计算它的理论,现在得到了这段代码 import java.io.IOException; import javax.sound.sampled.AudioFormat; import javax.sound.sampled.AudioInputStream; import javax.sound.sampled.AudioSystem; import javax.sound.sampled.DataLine; import ja

我正在用java编写一个简单的db SPL表,试图理解一些关于如何计算它的理论,现在得到了这段代码

import java.io.IOException;

import javax.sound.sampled.AudioFormat;
import javax.sound.sampled.AudioInputStream;
import javax.sound.sampled.AudioSystem;
import javax.sound.sampled.DataLine;
import javax.sound.sampled.LineUnavailableException;
import javax.sound.sampled.TargetDataLine;

public class Sound {
public static void main(String[] args) throws LineUnavailableException, InterruptedException, IOException {

    AudioFormat audioFormat = new AudioFormat(44100f, 16, 1, true, true);
    DataLine.Info info = new DataLine.Info(TargetDataLine.class, audioFormat);
    if (!AudioSystem.isLineSupported(info)) {
        System.err.println("Line is not supperted");
        return;
    }
    TargetDataLine targetDataLine = AudioSystem.getTargetDataLine(audioFormat);
    int bufferSize = targetDataLine.getBufferSize() / 5;
    targetDataLine.open(audioFormat, bufferSize);
    targetDataLine.start();

    AudioInputStream audioInputStream = new AudioInputStream(targetDataLine);
    byte[] buffer = new byte[bufferSize];
    for (int blen; (blen = audioInputStream.read(buffer, 0, buffer.length)) > -1;) {


        float[] samples = new float[buffer.length / 2];
        for (int i = 0, s = 0; i < blen;) {
            samples[s++] = (buffer[i++] << 8 | buffer[i++] & 0xFF) / 32768f;
        }

        double rms = 0;
        for(float sample : samples) {
            rms += Math.pow(sample,2);
        }
        rms = (double) Math.sqrt(rms/samples.length);

        double db = 20.0 * Math.log10(rms);

        System.out.println("rms:" + rms + " => db: " + db);
    }
    audioInputStream.close();
    targetDataLine.stop();
    targetDataLine.close();
}
}
在麦克风的相同位置使用一个外部应用程序(ios上没有分贝表),我可以得到大约6-10分贝的正的更有意义的值

我如何正确计算该值,使其至少接近或等于app medition的值?我做错了什么?

试试:

float db = 20.0 * Math.log10(rms);
PCM(音频)数据以32位
Float
格式处理,而不是以64位
Double
格式处理。

尝试:

float db = 20.0 * Math.log10(rms);
PCM(音频)数据以32位
Float
而不是64位
Double
类型处理