从歌曲中获取当前音频 - Java(也许使用FFT?)

时间:2014-02-01 22:14:38

标签: java audio spectrum

我正在尝试做一个学校项目,我试图在Java中构建一个我必须分析一首歌的应用程序,并且当歌曲正在播放时,我需要在它们被击中时输出某些频率,即:每当它击中时1hz它将打印到控制台“1Hz”。

我有音频分析的所有文件,即:com.badlogic.audio包。

这是一个非常重要的项目,我对Java相对较新(我在高中,这是我今年的主要项目)。

有人可以告诉我如何将FFT算法应用到歌曲中吗?即:我如何在屏幕上显示:“选择一首歌”然后当他们选择歌曲时,通过媒体播放器或其他东西大声播放,当它正在播放时,无论何时达到某些点,输出一些东西(如1hz示例)上文)。

是否有另一个库可以将歌曲中的当前频率返回给我?

提前感谢您的任何帮助或建议!

4 个答案:

答案 0 :(得分:3)

问题是几乎没有一个当前频率"在一首歌。除非它是一个纯粹的正弦音,否则会有多个泛音;当你有多个仪器变得越来越复杂时。

是的,傅里叶变换可以告诉你哪些频率存在。您必须查看您正在使用的FFT软件包的文档(badlogic代码)以获取有关如何调用它的信息。他们的示例程序,例如FFTTest,可能特别有用。

不是一个简单的项目,但应该是一个有趣的项目。祝你好运!

答案 1 :(得分:0)

为什么不从研究the java sound api开始呢?在分析之前,您需要import your audio file into java。获取不同的代码段。然后映射出代码需要执行的所有操作,并谷歌查找缺少元素的代码。最后,将所有工作元素放在一起。

答案 2 :(得分:0)

您可以使用Commons Math库进行DFT(FFT),因为它包含许多其他有用的方法。可以简单地从FastFourierTransformer对象以及transform(double[] input)transform(Complex[] input)方法调用FFT。因此,您需要将音频文件的数据转换为这样的数组格式。几乎所有的DFT / FFT方法都会期望一个数组输入,并会返回一个包含转换输入的(复杂)数组输出。

但是,请记住,FFT包含没有任何时间信息,因此如果您想查看频率(1Hz)出现以便执行某些操作,那么您需要或者经常进行多次FFT(并决定是否在该时间窗口中记录了一个音符)或使用小波变换。 FFT没有时间分辨率的原因正是因为您正在将时域信号转换为频域信号。如果你想做这个项目,这是一个重要的要点。

答案 3 :(得分:0)

如果你想这样做,首先要找到一个FFT包并熟悉它。 (你想要自己编写。)想出一些绘制输出的方法(如果只是通过“print plot”),这样你就可以了解光谱的样子。

一旦掌握了它,检测特定的峰值就不那么难了(如果您对数学和编程有所了解)。

此外,您可能希望获得可以进行FFT和绘图的独立音频包,因为这些绘图将更清晰,分辨率更高。 (我认为Audacity可以做到这一点。)

另请注意,Signal Processing SO site可以为您提供更专业的帮助。 (一定要解释你是HS学生,而不是专业人士。)