11

我正在尝试使用 ANN 来检测音符的音高。该网络是一个简单的两层 MLP,其输入基本上是 DFT(平均和对数分布),12 个输出对应于特定八度音阶的 12 个音符。

该网络使用某些乐器演奏的这 12 个音符的几个样本(一次一个音符)和几个“沉默”样本进行训练。

结果实际上是好的。该网络能够准确地检测出不同乐器演奏的那些音符,它对噪音的影响比较小,甚至在播放歌曲时也不会完全失去理智。

然而,目标是能够检测和弦声音。这样当两个或多个音符一起演奏时,两个相应的神经元就会被激发。令人惊讶的是,该网络实际上已经在某种程度上做到了这一点(仅在单音样本上进行训练),但与单音音符相比,一致性和准确性更低。我的问题是如何增强它识别复音的能力?

问题是我并不真正理解为什么它实际上已经起作用了。不同的音符(或它们的 DFT)基本上是空间中训练网络的不同点。所以我明白为什么它确实识别出相似的声音(附近的点),但不明白它如何“总结”音符组合的输出(与每个训练示例形成一个遥远的点)。与在 (0,0) (0,1) (1,0) = (0) 上训练的 AND 网络相同,预计不会“得出” (1,1) = (1) 的结论。

对此的蛮力方法是用尽可能多的复音样本来训练网络。然而,由于网络似乎以某种方式模糊地从单声道样本中掌握了这个想法,所以这里可能有更基本的东西。

任何指针?(对不起长度,顺便说一句:)。

4

4 回答 4

7

它已经工作的原因可能很简单,因为您没有训练它选择一个且只有一个输出(至少我假设您没有)。在简单的情况下,当输出只是输入和权重的点积时,权重将成为相应音高的匹配过滤器。由于一切都是线性的,如果多个匹配的过滤器同时看到良好的匹配,则多个输出将同时被激活(如复音音符的情况)。由于您的网络可能包含非线性,因此情况有点复杂,但想法可能相同。

关于改进它的方法,使用复音样本进行训练当然是一种可能性。另一种可能性是切换到线性滤波器。和弦声音的 DFT 基本上是每个单独声音的 DFT 之和。您希望输入的线性组合成为输出的相应线性组合,因此线性滤波器是合适的。

顺便说一句,您为什么首先为此使用神经网络?似乎只看 DFT,比如说,取最大频率会更容易给你更好的结果。

于 2010-01-30T00:55:14.300 回答
5

Anssi Klapuri是一位备受尊敬的音频研究人员,他发表了一种使用神经网络对复音录音执行音高检测的方法。

您可能想将 Klapuri 的方法与您的方法进行比较。在他的硕士论文“音乐自动转录的信号处理方法”中有详细描述。你可以在网上找到他的许多论文,或者购买他解释他的算法和测试结果的书。他的硕士论文链接如下。

https://www.cs.tut.fi/sgn/arg/klap/phd/klap_phd.pdf

复音录音的音高检测是一个非常困难的话题,并且包含许多争议——准备做大量的阅读。下面的链接包含另一种对复音录音进行音高检测的方法,这是我为名为PitchScope Player的免费应用程序开发的。我的 C++ 源代码可在 GitHub.com 上获得,并在下面的链接中引用。PitchScope Player的免费可执行版本也可在网络上获得并在 Windows 上运行。

实时音高检测

于 2016-07-30T23:04:02.960 回答
2

我尝试发展一个 CTRNN(连续时间循环神经网络)来检测 2 个正弦波之间的差异。我取得了一定程度的成功,但从来没有时间跟进这些神经元库(即类似于耳蜗的带状)。

于 2010-10-14T13:39:16.593 回答
0

一种可能的方法是使用遗传编程(GP),生成检测音高的短代码片段。通过这种方式,您将能够生成一个关于音高检测如何工作的规则,该规则有望成为人类可读的。

于 2012-11-19T00:27:50.140 回答