将wav文件读入java,获得与matlab或scipy相同的值

gmxoilav  于 2021-06-30  发布在  Java
关注(0)|答案(0)|浏览(282)

在java中读取.wav文件并将其放入数组的问题在这里被多次提出。我已经研究了很多方法。我要做的是获得与使用matlab的原生wavread函数打开wav文件所产生的值相同的值。我试图分析的特定文件(为了执行信号处理)是立体声的,采样率为10000 hz,是32位浮点(我怀疑这是问题的一部分)。
在matlab中,这个特定文件的所有值都是双精度格式的,最大值是3.0991,最小值是-3.0530。我还使用scipy.io.wavfile.read包在python中获得了相同的值。
使用以下java代码读入文件并将其转换为双数组类型时:

public static double[] toDoubleArray(byte[] byteArray){
    int times = Double.SIZE / Byte.SIZE;
    double[] doubles = new double[byteArray.length / times];
    for(int i=0;i<doubles.length;i++){
        doubles[i] = ByteBuffer.wrap(byteArray, i*times, times).getDouble();
    }
    return doubles;
}

public static void main(String[] args) throws UnsupportedAudioFileException, IOException {

Path path = FileSystems.getDefault().getPath("").toAbsolutePath();
   File file = new File(path + "/antonio_deep_fast_1.wav");

   ByteArrayOutputStream out = new ByteArrayOutputStream();
   AudioInputStream in = AudioSystem.getAudioInputStream(file);

   int read;
   byte[] buff = new byte[1024];
   try {
    while ((read = in.read(buff)) > 0)
       {
           out.write(buff, 0, read);
       }
} catch (IOException e) {
    // TODO Auto-generated catch block
    e.printStackTrace();
}
   out.flush();
   byte[] audioBytes = out.toByteArray();

   for(byte byteMe:audioBytes)
       System.out.println(byteMe);

  double[]doubles = toDoubleArray(audioBytes);

我得到的值高达8,低至-9。对于java的audioinputstream类的其他改编,我也遇到过类似的问题,但是如果我尝试使用javawav文件io包,它不支持32位浮点wav文件。
我可能已经花了十几个小时试图让这个阅读正确。毫无疑问,问题的一部分是我对wav文件的本质理解不当。有没有人能给我指出正确的方向,让我以类似matlab(或scipy)的方式读取文件?

暂无答案!

目前还没有任何答案,快来回答吧!

相关问题