如何使用java从pcm字节数组.wav文件中获取频率和基音?

如何使用java从pcm字节数组.wav文件中获取频率和基音?,java,audio,fft,wav,pcm,Java,Audio,Fft,Wav,Pcm,我目前是新来的,所以请保持简单,让我理解 我有一个项目,我必须把声音分为好的、坏的或中性的。我的计划是获得样本数据集的所有频率和基音,并使用SVM进行训练 以获取所有.wav文件的音调和频率。我做了代码,直到从音频文件中找到PCM数据。现在,我应该如何将这些数据应用到快速傅里叶变换算法中以获得频率?在将字节数组应用到FFT算法之前有更多的事情要考虑吗?< /P> 以下是我将wav文件转换为pcm字节数组的代码: int totalFramesRead = 0; File fileIn = new

我目前是新来的,所以请保持简单,让我理解

我有一个项目,我必须把声音分为好的、坏的或中性的。我的计划是获得样本数据集的所有频率和基音,并使用SVM进行训练

以获取所有.wav文件的音调和频率。我做了代码,直到从音频文件中找到PCM数据。现在,我应该如何将这些数据应用到快速傅里叶变换算法中以获得频率?在将字节数组应用到FFT算法之前有更多的事情要考虑吗?< /P> 以下是我将wav文件转换为pcm字节数组的代码:

int totalFramesRead = 0;
File fileIn = new File(inputFile);
try {
    AudioInputStream audioInputStream = AudioSystem.getAudioInputStream(fileIn);
    int bytesPerFrame = audioInputStream.getFormat().getFrameSize();
    if (bytesPerFrame == AudioSystem.NOT_SPECIFIED) {
        // some audio formats may have unspecified frame size
        // in that case we may read any amount of bytes
        bytesPerFrame = 1;
    }
    // Set an arbitrary buffer size of 1024 frames.
    int numBytes = 1024 * bytesPerFrame;
    byte[] audioBytes = new byte[numBytes];
    try {
        int numBytesRead = 0;
        int numFramesRead = 0;
        // Try to read numBytes bytes from the file.


        while ((numBytesRead = audioInputStream.read(audioBytes)) != -1) {
            // Calculate the number of frames actually read.
            numFramesRead = numBytesRead / bytesPerFrame;
            totalFramesRead += numFramesRead;
        }
        return audioBytes[];
    }

尽管FFT频率峰值不一定是基音频率,但在FFT之后或其他方面有很多要考虑的问题。查找基音检测/估计算法,而不是仅仅使用简单的FFT幅度。

我认为您需要考虑表示单个音频样本的字节数。现在大多数音频文件都是16位一个样本。关于StackOverflow已经有很多类似的问题,答案很好-试试看。您的FFT库可能需要float查看它的输入要求,并相应地转换波形数据。