使用java确定记录音频数据的字节[]的频率

时间:2013-09-09 04:06:55

标签: java audio fft frequency goertzel-algorithm

我一直在研究确定原始音频的频率。似乎有很多关于它的信息,但我还没有找到使用java的简单实现。我想要做的是将44.1K元素的字节数组分成大小为44的样本(丢弃剩余部分)并确定每个样本中是否存在超过18KHz的音调(我试图找到一个音调是什么时候在录音过程中播放的是麦克风拾取的。如果需要,我可以使用更大的样本,但每个样本44个元素是理想的。我知道我可能需要使用FFT,但数学对我来说有点重。我试图使用goertzel算法分析数组,但我无法得到确定的结果。那么我的问题是如何将具有44.1K元素的字节数组分成1002个样本,确定每个样本的频率(或检测样本的频率是否超过18KHz),以及这将是一个示例实现。请给出代码或伪代码。我已经阅读了很多文档,我只需要看一个例子。

1 个答案:

答案 0 :(得分:0)

关于java中的FFT,请查看Reliable and fast FFT in Java

其他一切只是一个循环:

for (int i=0; i<sampleArray.length; i+=44) {
    if (findOver18KHz(sampleArray, i, i++44)) {
        // found tone over 18KHz
    }
}

/**
 * Check for a tone over 18KHz
 */
boolean findOver18KHz(int[] samples, start, end) {
  // call the FFT stuff
  // make sure you don't get an ArrayOutOfBoundsException for samples.
}