1

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

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

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

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

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

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

4

4 回答 4

3

问题是歌曲中几乎没有单一的“当前频率”。除非是纯正弦音,否则会有多个泛音;当您有多种乐器变得越来越复杂时。

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

不是一个微不足道的项目,但应该是一个有趣的项目。祝你好运!

于 2014-02-01T22:22:19.463 回答
0

如果你想这样做,第一件事就是找到一个 FFT 包并熟悉它。(你不想自己写。)想出一些方法来绘制输出(如果只是通过“打印图”),这样你就可以了解光谱的样子。

一旦你掌握了窍门,检测特定的峰值就不是那么难了(如果你对数学和编程有心的话)。

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

另请注意,有一个Signal Processing SO 站点可以为您提供更专业的帮助。(请务必说明您是 HS 学生,而不是专业人士。)

于 2014-02-01T22:36:57.307 回答
0

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

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

于 2014-02-01T22:28:26.113 回答
0

为什么不从学习java sound api开始呢?在分析之前,您需要将音频文件导入 java 。让不同的代码段工作。然后绘制出你的代码需要做的所有事情,然后用谷歌搜索缺失元素的代码。最后,将所有工作元素放在一起。

于 2014-02-01T22:25:43.993 回答