微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

将WAV文件读入Java,获得与MATLAB或SciPy相同的值

如何解决将WAV文件读入Java,获得与MATLAB或SciPy相同的值

在这里多次询问了读取.WAV文件并将其放入Java数组的问题。我研究了许多方法。我想做的是获取使用MATLAB的本机WAVread函数打开WAV文件所产生的相同值。我要分析的特定文件(为了进行信号处理)是立体声的,采样率为10000 Hz,并且是32位浮点数(我怀疑这是问题的一部分)。

在MATLAB中,此特定文件的所有值均为Double格式,最大值为3.0991,最小值为-3.0530。我也使用scipy.io.wavfile.read包在Python中获得了相同的值。

利用以下Java代码读取文件,然后将其转换为Double数组类型时:

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,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类的其他改编版中也遇到了类似的问题,而如果我尝试使用Java Wav File IO包,则它不支持32位浮点WAV文件

我可能已经花费了十几个小时来尝试正确读取此内容。毫无疑问,部分问题是我对WAV文件性质的不正确理解。有人能指出我的正确方向,以类似MATLAB(或scipy)的方式读取文件吗?

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。