在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)的方式读取文件?
暂无答案!
目前还没有任何答案,快来回答吧!