我做了代码,从音频文件中找到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]);
}
}
答案 0 :(得分:3)
您需要跳过wav标头并将PCM样本转换为介于-1和1之间的浮点值。例如,对于具有PCM wav的字节数组,每个样本16位和小端,需要进行以下转换(来自{{ 1}}):
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分析。
为了使这更容易,JVM包括float[]
和AudioSystem
类。
Java音频处理库TarsosDSP的源代码充满了示例。 TarosDSP manual解释了PCM数据与可用样本之间的关系。