从song-Java获取当前音频(可能使用FFT?)

从song-Java获取当前音频(可能使用FFT?),java,audio,spectrum,Java,Audio,Spectrum,我正在尝试做一个学校项目,我正在尝试用Java构建一个应用程序,我必须分析一首歌曲,当歌曲播放时,我需要输出特定的频率,即:每当它达到1hz,它就会打印到控制台“1hz” 我有音频分析的所有文件,例如:com.badlogic.audio包 这是一个非常重要的项目,我对Java还比较陌生(我在高中,这是我今年的主要项目) 有人能告诉我如何将FFT算法实现成一首歌吗?ie:我如何在屏幕上显示:“选择一首歌曲”,然后当他们选择歌曲时,通过媒体播放器或其他东西大声播放,播放时,每当它击中某些点时,输出

我正在尝试做一个学校项目,我正在尝试用Java构建一个应用程序,我必须分析一首歌曲,当歌曲播放时,我需要输出特定的频率,即:每当它达到1hz,它就会打印到控制台“1hz”

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

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

有人能告诉我如何将FFT算法实现成一首歌吗?ie:我如何在屏幕上显示:“选择一首歌曲”,然后当他们选择歌曲时,通过媒体播放器或其他东西大声播放,播放时,每当它击中某些点时,输出一些东西(如上面的1hz示例)

有没有其他库可以将歌曲中的当前频率返回给我


提前感谢您的帮助或建议

问题是一首歌中几乎没有一个“当前频率”。除非是纯正弦音调,否则有多重泛音;当你有多个越来越复杂的仪器时

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


这不是一个琐碎的项目,但应该是一个有趣的项目。祝你好运

为什么不从学习开始呢?在分析它之前,您需要先检查它。让不同的代码段工作。然后列出你的代码需要做的所有事情,用谷歌搜索代码中缺少的元素。最后,将所有工作元素放在一起。

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


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

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

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

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


还请注意,有一种方法可以为您提供更专业的帮助。(一定要说明你是HS的学生,而不是专业人士。)

一个完整的音乐混音不会有一个单一的频率,你可以选择。音乐是一种广谱和声结构。我的建议是选择一个更简单的项目。如果你还不完全了解这些东西,这可能太难了。这个项目是分配给我们的。我基本上了解FFT是什么,但我不确定如何将其实现为一首歌曲来获得结果back@Radiodef-但正如你所说,音乐会有一个光谱,在这个光谱中会有波峰和波谷。这当然是一个雄心勃勃的项目,但并不是真的不可行。我很难相信这个任务正是你所描述的。对于高中班级来说,这是一项荒谬的技术性任务,除非有一种几乎可以自动调用的方法。@Radiodef我在Matric(12年级),这是我分配给我的项目,试图获得大学奖学金。我对Java相对来说是新手,但我确实知道如何应对它。我的IT老师向我提出了挑战(还有更多),但这是我在用其他东西实现它之前需要做的。谢谢,我知道没有一个“当前频率”,但基本上当它达到某个频率(峰值)时,我需要在屏幕上输出一些东西