2017-03-05 52 views
0

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

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

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

那么我怎么能知道,每个音的3或4个频率中的哪个频率是我正在搜索的频率。我需要这个值,从他们的频率中识别C,D,E等音符。我希望这个问题不是脱离主题,因为我真的很努力地找到一个解决方案,我不知道这是API本身的一个可解决的问题,还是我不得不消除一些频率。我将不胜感激任何形式的帮助。

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

+0

声音几乎从不是单一频率 - 唯一(很少)是人为的。我们认为音调的东西实际上是由一个频率为f的内容组成的(这就是所谓的基础,就是你所想的)和一系列“谐波”,它们的内容都是f '('2f,3f,4f,5f等)。要确定正在播放的音符,您必须考虑到这一点。一种方法是查找谱图中谐波之间的距离('f')。 – Linuxios

+0

感谢这个建议,以前不知道。我会考虑这个问题。 – Kuhfleisched

回答

0

我一直在搞同一个问题,并有一些有趣的部分答案。这个网站http://www.phy.mtu.edu/~suits/Physicsofmusic.html有大量的数据解释音乐的信息,是超级有用的。

我写了一个使用网络音频分析器的东西,并且通过音乐音调简单地将fft结果存储到容器中 - 它给出了fft结果的图形,并且可以指示声音中实际的频率。它在https://aerik.github.io/NoteDetector.htm

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

我想通过比较自相关结果和来自fft的信号强度,将他的方法与我的方法结合起来。

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

0

我是一名专业的歌手,钢琴家和语音老师,他们过渡为代码,所以我想我可以谈谈您在这里得到的一些令人困惑的结果。底线:当您在乐器上唱歌或弹奏音符时,您实际上会同时产生许多不同的频率,因此您看到的结果很可能是准确的。然而,你所瞄准的是几乎可以肯定的基本音调,这是最低的一个。

更长,更复杂的物理回答:除非你正在看正弦波(听起来像是一个机械的嘟嘟声,而不会从一个体面的乐器中出来),你听到的声音可能包含很多不同的频率。声音由基本音高(最低频率,通常是我们在讨论音乐时指出的音高)和大量的泛音(其他更高的频率组成乐器,还是歌手,甚至是元音)。

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

请注意,所有泛音都是基数的倍数。这意味着你可以在你看到的所有其他音高中使用该模式来找出底下的基本音高。从音乐的角度来看,您可能还会注意到,您在这个泛音系列中首先看到的音调是我们认为最辅音的音调 - 八度音阶,完美五分音符,三分音符,主要三元音符。这不是巧合,泛音与这些其他音高一致的方式几乎可以肯定我们觉得他们非常喜欢听的原因。

把所有这些都归结为你如何确定基本音调,假设一系列泛音可能来源于相同的基本原理:你基本上是在寻找你将会看到的各种频率的最大公因数。它可能也是您检测到的最低频率,但要小心这种启发式算法,因为您的信号中可能有无关的噪声。任何不属于你的好的倍数列表可能是噪音。

所有这些变得复杂得多,当然,当你一次播放多个(基本)音高时。我自己在思考和弦检测,并在寻找人们已经在这方面做了什么以及如何建立它时发现了你的问题。