将wav音频格式字节数组转换为浮点数

我正在使用Java AudioInputStream读取.wav音频文件。音频文件是16位PCM签名,samplerate = 44100,framesize = 2,framelength = 114048.我设法以字节数组的forms获取音频数据但是我我不确定我应该为这个字节数组分配多少大小,以便我可以将它转换为floatinf点值。 我正在使用Goertzel算法进行一些音频操作,该算法接受浮点数组的输入,例如“float [] x”。 下面是我正在使用的一些代码片段。 提前致谢。

try { AudioInputStream audioInputStream = AudioSystem.getAudioInputStream(fileIn); } while ( numBytesRead != -1) { numBytesRead = audioInputStream.read(audioBytes); // Logic goes here floatValue = byteArrayToFloat(audioBytes); } 

音频文件是16位PCM签名,samplerate = 44100,framesize = 2,framelength = 114048。

我从上面假设您只有一个通道(2字节采样* 1通道= 2字节帧)。

第一步是将数据作为16位整数类型的序列,这在Java中很short

 import java.nio.ByteBuffer; import java.nio.ByteOrder; import java.nio.ShortBuffer; ... byte[] audioBytes = ... ShortBuffer sbuf = ByteBuffer.wrap(audioBytes).order(ByteOrder.LITTLE_ENDIAN).asShortBuffer(); short[] audioShorts = new short[sbuf.capacity()]; sbuf.get(audioShorts); 

现在,如何将其转换为float s取决于下游函数如何表示音频的表示。 例如,如果他们期望浮点数> = -1且<= 1,那么您可以这样做:

 float[] audioFloats = new float[audioShorts.length]; for (int i = 0; i < audioShorts.length; i++) { audioFloats[i] = ((float)audioShorts[i])/0x8000; } 

不幸的是,有很多方法来表示音频。