Web Audio API - 获取正确的频率

Posted

技术标签:

【中文标题】Web Audio API - 获取正确的频率【英文标题】:Web Audio API - Get correct frequency 【发布时间】:2017-03-05 21:18:07 【问题描述】:

我正在使用 Web Audio API 来获取来自麦克风的声音频率。为此,我在这个 github repo 上找到了一些有用的代码:https://gist.github.com/giraj/250decbbc50ce091f79e。

现在我的问题是,我得到了很多不同的频率,但只有一点点声音。这个声音可能来自我的声音,也可能来自乐器。

这些频率在 90 到 4000Hz 之间。但据我所知,人声或乐器的一个音符只能有一个以赫兹为单位的单一频率量。而且我很确定,我只演奏一种单音。

那么我怎么知道每个音调的 3 或 4 个频率中的哪个频率是我正在搜索的频率。我需要这个值,以便从频率中识别 C、D、E 等音符。我希望这个问题不是题外话,因为我真的很努力地寻找解决方案,但我不知道这是否是 API 本身可以解决的问题,或者我是否必须以某种方式消除一些频率。我将不胜感激。

编辑:我想补充一点,我从未达到与此频率列表中列出的相同的音符值:http://www.phy.mtu.edu/~suits/notefreqs.html。我正在使用钢琴应用程序,它始终在 Play 商店的频率应用程序上提供正确的频率。所以我什至怀疑我收到的结果。

【问题讨论】:

声音几乎从来都不是单一的频率——唯一(很少)是人造的。我们认为是音调的东西实际上是由一个频率的内容f(这被称为基频,这就是你所想的)和一系列“谐波”组成,内容是@987654324的所有倍数@ (2f, 3f, 4f, 5f, etc.)。要确定正在播放的音符,您必须考虑到这一点。一种方法是查找频谱图中谐波之间的距离 (f)。 感谢您的建议,以前不知道。我会考虑这个问题。 【参考方案1】:

我一直在处理同样的问题,并且有一些有趣的部分答案。这个网站http://www.phy.mtu.edu/~suits/Physicsofmusic.html 有大量的用数学术语解释音乐的信息,非常有帮助。

我写了一些东西,它使用网络音频分析器,并简单地将 fft 结果按音高分桶 - 它为您提供 fft 结果的图形,并指示声音中的实际频率。在https://aerik.github.io/NoteDetector.htm。

在我开始使用它之后,我发现另一个人的代码使用“自相关”来检测基本面。这可能更接近您正在寻找的内容:https://github.com/cwilso/PitchDetect 我遇到的问题是,虽然它适用于相当纯的音调,但仍然有很多噪音。

我正在考虑将他的方法与我的方法相结合,将自相关结果与来自 fft 的信号强度进行比较。

这是一个有趣的项目,但我认为没有任何简单的答案。

【讨论】:

【参考方案2】:

我是一名专业的歌手、钢琴家和语音教师,正在向代码过渡,所以我想我可以谈谈你在这里得到的一些令人困惑的结果。

底线:当您在乐器上唱歌或弹奏音符时,实际上会同时产生许多不同的频率,因此您看到的结果很可能是准确的。但是,您的目标几乎可以肯定是基本音高,也就是最低的音高。

更长、更复杂的物理答案:除非您正在查看正弦波(听起来像机械哔声,而且不会来自像样的乐器),否则您听到的声音可能包含许多不同的频率。声音由基本音高(最低频率,通常是我们在音乐中命名音高时所谈论的频率)和大量泛音(构成音乐特征声音的其他更高频率)组成。一种乐器,对于歌手来说,甚至是元音)。

让我们选择一个易于使用的数字:假设您的基本音高是 100hz。为了方便讨论音乐含义,我们将其称为 C1(尽管它实际上不是 C),并且数字代表八度音阶的跳跃,八度音阶从 C 到 B。您可能在以下任何音高处都有泛音:200hz ( C2), 300hz (G2), 400hz (C3), 500hz (E3), 600hz (G3), 700hz (Bb3), 800hz (C4), 900 hz (D4), 1000hz (E4) 等。一些泛音比其他泛音更突出,或者完全跳过其中一些(许多会跳过其他泛音),但所有泛音都将在此模式内。

请注意,所有泛音都是基音的倍数。这意味着您可以在您看到的所有其他音高中使用该模式来计算下面的基本音高。从音乐的角度来看,您可能还会注意到,您在这个泛音系列中首先看到的音高是我们认为最辅音的音高——八度、纯五度、大三度、大三和弦。这不是巧合,泛音与这些其他音高对齐的方式几乎可以肯定是我们觉得它们很好听的原因。

所有这些都归结为在给定一系列泛音的情况下如何确定基本音高,这些泛音可能是由相同的基本音引起的:您实际上是在寻找您将看到的各种频率的最大公因数。它可能也是您检测到的最低频率,但要小心这种启发式方法,因为您的信号中可能有不相关的噪声。任何不属于你漂亮的倍数列表的东西都可能是噪音。

当然,当您同时演奏多个(基本)音高时,所有这些都会变得复杂得多。我自己也在思考和弦检测,并在寻找人们在这方面已经做了什么以及如何在此基础上进行构建时发现了你的问题。

【讨论】:

以上是关于Web Audio API - 获取正确的频率的主要内容,如果未能解决你的问题,请参考以下文章

Web Audio Api:通过套接字从nodejs服务器播放数据块的正确方法

如何使用 Web Audio API 移动/调制音频缓冲频率

Web Audio API -- Chrome / Safari 中的频率调制听起来不同

可以使用Web Audio API和createMediaElementSource分析来自Icecast的流式音频吗?

在 Web Audio API 中导出音频强度

Web Audio API:当使用媒体流时,Firefox 中的 FFT 数据与 chrome 中的不同?