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

Posted

技术标签:

【中文标题】从歌曲中获取当前音频频率 - Java(也许使用 FFT?)【英文标题】:Get current Audio Frequency from song - Java (Maybe use FFT?) 【发布时间】:2014-02-01 22:14:38 【问题描述】:

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

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

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

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

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

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

【问题讨论】:

完整的音乐混合不会有您可以挑选的单一频率。音乐是一种广谱谐波结构。我的建议是选择一个更简单的项目。如果您还不完全了解这些东西,这可能是一项艰巨的任务。 项目已分配给我们。我基本了解 FFT 是什么,但我不确定如何将它实现到歌曲中以获取结果 @Radiodef - 但正如你所说,音乐会有一个频谱,并且在那个频谱中会有波峰和波谷。这当然是一个雄心勃勃的项目,但也不是那么不可行。 我很难相信这个任务正是你所描述的。对于高中班级来说,这对于任何事情来说都是一项可笑的技术任务,除非您几乎可以调用一种自动执行此操作的方法。 @Radiodef 我在 Matric(12 年级),这是我分配的项目,试图获得大学奖学金。我对 Java 很陌生,但我确实知道如何解决它。我的 IT 老师用这个(以及更多)挑战了我,但这是我在用其他东西实现它之前需要完成的工作。 【参考方案1】:

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

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

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

【讨论】:

谢谢,我知道没有单一的“当前频率”,但基本上当它达到某个频率(尖峰)时,我需要在屏幕上输出一些东西【参考方案2】:

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

【讨论】:

【参考方案3】:

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

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

【讨论】:

【参考方案4】:

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

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

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

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

【讨论】:

以上是关于从歌曲中获取当前音频频率 - Java(也许使用 FFT?)的主要内容,如果未能解决你的问题,请参考以下文章

NAudio 获取音频样本

如何从录制原始音频中获取频率?

iOS 如何从歌曲(ipod 库)中获取音频样本?

音频流中的歌曲标题编码

从音频文件中获取专辑封面、歌曲名称、专辑名称和艺术家姓名

iPhone音频流 - 保存状态?