Java 将波形PCM字节数组传递到FFT进行基音检测

Java 将波形PCM字节数组传递到FFT进行基音检测,java,bytearray,fft,wav,pcm,Java,Bytearray,Fft,Wav,Pcm,我做了代码,直到从音频文件中找到PCM数据。我应该如何将这些数据应用到快速傅里叶变换算法中?在将字节数组应用到FFT算法之前,有更多的事情要考虑吗? public static void main(String[] args) throws FileNotFoundException, IOException { ByteArrayOutputStream out = new ByteArrayOutputStream(); BufferedInputStream in = ne

我做了代码,直到从音频文件中找到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]);
        }
}
publicstaticvoidmain(字符串[]args)抛出FileNotFoundException、IOException{
ByteArrayOutputStream out=新建ByteArrayOutputStream();
BufferedInputStream in=新的BufferedInputStream(新文件输入流(“adios.wav”));
int-read;
字节[]buff=新字节[1024];
而((read=in.read(buff))>0)
{
out.write(buff,0,read);
}
out.flush();
byte[]audioBytes=out.toByteArray();

对于(int i=0;i,您需要跳过wav头并将PCM样本转换为-1和1之间的浮点值。例如,对于带有PCM wav的字节数组,每个样本16位,小端数,需要进行以下转换(来自
com.sun.media.sound.AudioFloatConverter
):

public float[]toFloatArray(buff中的字节[],偏移量中的整数,
浮点[]输出增益,输出偏移,输出长度){
int ix=英寸偏移量;
int len=out\u offset+out\u len;
用于(int-ox=out\u偏移量;ox(in_buff[ix++]首先:使用该代码,您刚刚将adios.wav的内容存储到一个数组中,但这并不意味着您已经成功地将文件转换为一个数字数组。为此,您需要先读取文件头,然后使用头数据类型(int,float,8-16位)相应地解码文件内容第二,你想使用哪个FFT类?首先尝试使用它,然后告诉我们它是如何出错的(如果它出错了)。我应该传递给这个方法的值是什么?我手里唯一的值是
in_buff
,它是字节数组。我应该传递给
int in_offset,float[]out\u buff、int out\u offset、int out\u len
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;
    }