将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 (将#修改为@)

相关问答

错误1:Request method ‘DELETE‘ not supported 错误还原:...
错误1:启动docker镜像时报错:Error response from daemon:...
错误1:private field ‘xxx‘ is never assigned 按Alt...
报错如下,通过源不能下载,最后警告pip需升级版本 Requirem...