检测音频输入的频率 - Java?

Posted

技术标签:

【中文标题】检测音频输入的频率 - Java?【英文标题】:Detect frequency of audio input - Java? 【发布时间】:2010-11-30 16:09:52 【问题描述】:

我断断续续地研究了几个月。

我正在寻找工作示例代码来检测声卡音频输入中的频率,或检测是否存在给定一组频率。我倾向于 Java,但真正的要求是它应该比 C 更高级/更简单,并且最好是跨平台的。 Linux 将成为目标平台,但我想为 Mac 甚至可能是 Windows 保留选项。 Python 也是可以接受的,如果有人知道一种语言可以让这变得更容易/有更好的预先编写的库,我愿意考虑。

基本上我有一个定义的频率对集,它将出现在声卡音频输入中,我需要能够检测到这对,然后......做一些事情,例如录制以下音频最长持续时间,然后执行一些操作。 一个潜在的运行可能包含 5-10 对,在运行时定义,不能编译:类似于频率 1 约 1 秒,最大延迟约 1 秒,频率 2 约1 秒。

我找到了执行 FFT 或 Goertzel 算法的建议,但除了似乎没有给出任何有用结果的最简单示例代码外,找不到任何其他内容。我还发现 Java 音频存在一些限制,无法以足够高的速率进行采样以获得所需的分辨率。

对库使用或工作代码有什么建议吗?我承认我不是最喜欢数学的人,所以我迷失在一些关于算法实际工作原理的技术性描述中。

【问题讨论】:

您是否提前知道音调的频率是多少,即是否只是检测已知频率的情况,或者您是否需要检测,例如,N 个不同的频率之一频率?另外,信噪比是多少?是否有明显的背景噪音? S/N 是……不好。这将通过 VHF 2 路无线电传输。我会说无线电标准的信号相当强,但任何其他标准都非常糟糕。是的,我提前知道频率是多少(在运行时,而不是在编译时),但我需要检测 10 个设置频率中的一个,可能非常接近......一切都在大约 300-2000Hz 范围内,但在10,任何两个可能相隔 20-40Hz。 10 年前,我将 FFT 算法从 C 移植并优化到 Java。最长大约有 80 行。我不确定您是否需要一个“库”来处理诸如 FFT 之类的琐碎事情。遗憾的是,我手边没有那个代码(它在某个备份 CD 上)。 FFT 很简单,即使在存在巨大噪声的情况下也能产生有用的结果。我真的认为你需要至少有一点数学倾向才能做你想做的事,如果你想成为一名程序员,还需要一点数学倾向:( 有一篇很棒的文章,介绍了在 Java 中使用 FFT 检测频率值。 blog.bjornroche.com/2012/07/… 我发现这个正在研究 ios 的类似问题。 【参考方案1】:

如果您的目标是检测频率对,那么您的工作与DTMF 检测器非常相似。

尝试在sourgeforge 等位置搜索DTMF,您会在许多编程语言中找到检测器。沿着频谱放置的频率对似乎比您的规格更严格,因此您应该可以根据您的输入调整 DTMF 检测器

【讨论】:

【参考方案2】:

查看 SNDPeek,它是一个跨平台的 C++ 应用程序,可从现场音频中提取各种信息; https://github.com/RobQuistNL/sndpeek

【讨论】:

以上是关于检测音频输入的频率 - Java?的主要内容,如果未能解决你的问题,请参考以下文章

有没有办法检测 HTML 5 网络音频 API 中的音频频率?

VB.net现场频率检测

检测原始音频 (PCM) 中的特定频率/音调

使用 node.js 检测麦克风的音频频率

Android音频FFT使用audiorecord检索特定频率幅度

我的应用程序“查找麦克风的音频输入频率”总是崩溃。但为啥?