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

问题描述:

我目前对此很陌生,所以请保持简单,以便我理解。如何使用java获取pcm字节数组.wav文件的频率和音高?

我有一个项目,我必须将声音分类为好,坏或中性。我的计划是获取样本数据集的所有频率和间距,并使用SVM对其进行训练。

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

这里是我的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[]; 
    } 
+1

我想你需要考虑代表一个音频样本的字节数。现在大多数音频文件都是每个样本16位。 – john16384

+0

已经有很多*的类似问题,并且有很好的答案 - 尝试[搜索jtransforms + audio](http://*.com/search?q=Jtransforms+audio)。 –

+0

您的FFT库可能需要浮点查看其输入要求并相应地转换波数据。 –

有很多考虑后还是不是FFT等,因为FFT频率峰值未必基音频率。查找音调检测/估计算法,而不是仅使用空的FFT幅度。