Web Audio API - 获取正确的频率

时间:2017-03-05 21:18:07

标签: javascript audio web frequency-analysis

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

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

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

那我怎么知道,每个音调的3或4个频率的频率是我正在搜索的频率。我需要这个值,从它们的频率识别C,D,E等音符。我希望这个问题不是偏离主题的,因为我真的很努力找到一个解决方案而且我不知道这是否是API本身的可解决问题,或者我是否必须以某种方式消除某些频率。我会感激任何帮助。

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

2 个答案:

答案 0 :(得分:1)

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

我写了一些使用网络音频分析器的东西,只是通过音高将fft结果存储到分档中 - 它为你提供了fft结果的图形,并且表明了声音实际上是什么频率。它位于https://aerik.github.io/NoteDetector.htm

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

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

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

答案 1 :(得分:1)

我是一名专业歌手,钢琴家和语音教师,他们会转换成代码,所以我想我可以谈谈你在这里遇到的一些令人困惑的结果。

结论:当您在乐器上演唱或演奏音符时,您实际上会同时产生许多不同的频率,因此您看到的结果很可能是准确的。然而,你所瞄准的几乎可以肯定是最基本的基调。

更长,更复杂的物理答案:除非你正在看一个正弦波(听起来像一个机械的嘟嘟声,并且不是来自一个体面的乐器),你的声音是什么?重听可能包含许多不同的频率。声音由一个基本音高组成(最低频率,通常是我们在音乐中命名音调时所说的那个),还有很多泛音(其他更高的频率构成了这个特性)乐器的声音,或歌手的声音,甚至是元音。)

让我们选择一个易于使用的数字:想象你的基本音高是100hz。为了方便讨论音乐含义,我们称之为C1(虽然它实际上并不是C),数字代表八度音程,音高从C到B不等。你可能有任何泛音以下节距:200hz(C2),300hz(G2),400hz(C3),500hz(E3),600hz(G3),700hz(Bb3),800hz(C4),900hz(D4),1000hz(E4),不同的乐器可能会使一些泛音比其他乐器弹出更多,或完全跳过其中一些(许多人会跳过其他所有泛音),但所有的泛音都将在这种模式中。

请注意,所有泛音都是基数的倍数。这意味着你可以在你看到的所有其他音高中使用该模式来找出下面的基本音高。从音乐的角度来看,你可能还会注意到,你在这个泛音系列中首先看到的音高是我们认为最有辅音的音符 - 八度音阶,完美的五度,主要的三音阶,主要三重奏。这不是巧合,而且泛音与这些其他音高排列的方式几乎可以肯定,为什么我们发现它们很好听。

将所有这些归结为如何根据相同的基础产生一系列泛音来确定基本音高:你基本上寻找各种频率的最大公因子。我会看到的。它可能也是您检测到的最低频率,但要小心这种启发式,因为您的信号中可能存在无关的噪声。任何不属于你很好的倍数列表的东西都可能是噪音。

当你一次玩多个(基本)音高时,所有这些都变得复杂得多。我自己在思考和弦检测,并在寻找人们已经在这个领域做过的事情以及如何在此基础上进行构建时找到了你的问题。