我希望能够使用 java 检测预定频率的音调。我正在做的是播放音调(音调的频率因用户输入而异),我试图检测音调是否具有特定频率。如果是,我执行某个方法。根据我的阅读,我需要 FFT,但我不确定如何在 java 中实现它。似乎有很多关于如何做到这一点的文档,但是有哪些文档涉及查看音频文件而不是实时分析。我不需要将音频保存到文件中,只需确定是否以及何时录制了频率为 x 的音调。
理想情况下,我想以 44KHz 的采样率进行记录,并在确定是否检测到音调后,确定何时以 +-3ms 的精度检测到音调。但是,只要不荒谬(即+100ms),低于此的精度是可以接受的。从我查到的资料中,我大致知道我需要做什么,但我需要帮助将它们联系在一起。使用伪代码它看起来大致像这样(我认为)
请注意,我大致知道在 +-1 秒内可以检测到满足频率的音调
for(i = 0, i < 440000 * 2, i++){//*2 because of expected appearance interval;may change
record sound sample
fft(sound sample)
if(frequencySoundSample > x){
do something
return
}
}
播放音调时会有相当大的背景噪音。但是音调会有一个非常高的频率,比如 15-22KHz,所以我相信通过简单地寻找录音机何时检测到一个非常高的频率,我可以确定它是我的音调(音调也将以高幅度可能为 0.5 秒或 1 秒)。我知道不会有其他高频声音作为背景噪音(我预计背景频率可能高达 5KHz)。
那我有两个问题。我提供的伪代码是否足以满足我的需求?如果不是,或者如果有更好的方法可以做到这一点,我完全赞成。其次,我将如何在java中实现它?我知道我需要做什么,但我无法将所有这些联系在一起。我对 java 很熟悉,但我不熟悉与音频有关的语法,而且我对 fft 没有任何经验。请明确并给出带有注释的代码。我一直在试图解决这个问题,我只需要看到它都捆绑在一起。谢谢你。
编辑
我知道使用像我这样的 for 循环不会产生我想要的频率。更多的是粗略地展示我想要的东西。也就是说,随着时间的推移,同时记录、执行 fft 和测试频率。