我做了代码直到从音频文件中找到PCM数据.我应如何将这些数据应用于快速傅立叶变换算法?在将字节数组应用于FFT算法之前,还有更多事情要考虑.
public static void main(String[] args) throws FileNotFoundException, IOException {
ByteArrayOutputStream out = new ByteArrayOutputStream();
BufferedInputStream in = new BufferedInputStream(new FileInputStream("adios.wav"));
int read;
byte[] buff = new byte[1024];
while ((read = in.read(buff)) > 0)
{
out.write(buff, 0, read);
}
out.flush();
byte[] audioBytes = out.toByteArray();
for(int i=0; i<audioBytes.length;i++){
System.out.println(audioBytes[i]);
}
}
解决方法:
您需要跳过wav标头,并将PCM样本转换为介于-1和1之间的浮点值.例如,对于具有PCM wav的字节数组(每个样本16位,并且使用小端),需要进行以下转换(来自com.sun.media) .sound.AudioFloatConverter):
public float[] toFloatArray(byte[] in_buff, int in_offset,
float[] out_buff, int out_offset, int out_len) {
int ix = in_offset;
int len = out_offset + out_len;
for (int ox = out_offset; ox < len; ox++) {
out_buff[ox] = ((short) ((in_buff[ix++] & 0xFF) |
(in_buff[ix++] << 8))) * (1.0f / 32767.0f);
}
return out_buff;
}
在此调用之后,您最终得到一个可用于FFT分析的float [].
为了使此操作更容易,JVM包括AudioSystem和AudioInputStream类.
Java音频处理库TarsosDSP的源代码包含许多示例. TarosDSP manual解释了PCM数据和可用样本之间的关系.