将WAVE PCM字节数组传递给FFT进行音调检测

时间:2014-09-03 05:04:09

标签: java bytearray fft wav pcm

我做了代码,从音频文件中找到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]);
        }
}

1 个答案:

答案 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数据与可用样本之间的关系。