Machine learning 基于神经网络的基音检测

Machine learning 基于神经网络的基音检测,machine-learning,neural-network,signal-processing,pitch-tracking,Machine Learning,Neural Network,Signal Processing,Pitch Tracking,我正在尝试使用ANN来检测音符的音调。该网络是一个简单的两层MLP,其输入基本上是DFT(平均和对数分布),12个输出对应于特定倍频程的12个音符 该网络通过一些乐器演奏的12个音符中的几个样本(一次一个音符)和几个“沉默”样本进行训练 结果实际上是好的。网络能够准确地检测到不同乐器演奏的音符,它对噪音相对敏感,甚至在播放歌曲时也不会完全失去理智 然而,我们的目标是能够检测出复调声音。因此,当两个或多个音符一起演奏时,两个相应的神经元就会激发。令人惊讶的是,在某种程度上,网络实际上已经做到了这一

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

该网络通过一些乐器演奏的12个音符中的几个样本(一次一个音符)和几个“沉默”样本进行训练

结果实际上是好的。网络能够准确地检测到不同乐器演奏的音符,它对噪音相对敏感,甚至在播放歌曲时也不会完全失去理智

然而,我们的目标是能够检测出复调声音。因此,当两个或多个音符一起演奏时,两个相应的神经元就会激发。令人惊讶的是,在某种程度上,网络实际上已经做到了这一点(仅在单声道样本上进行训练),但其一致性和准确性不如单声道音符。我的问题是如何提高它识别多声部声音的能力

问题是我真的不明白为什么它已经起作用了。不同的音符(或其DFT)基本上是空间中训练网络的不同点。因此,我明白了为什么它能够识别相似的声音(附近的点),而不是它如何“总结”音符组合的输出(这些音符与每个训练示例形成一个遥远的点)。同样,在(0,0)(0,1)(1,0)=(0)上训练的AND网络也不会“得出”(1,1)=(1)的结论

解决这一问题的办法是用尽可能多的复调样本训练网络。然而,由于网络似乎在某种程度上模糊地掌握了单声道样本的想法,这里可能有更基本的东西


有什么建议吗?(抱歉这么长,顺便说一句:)。

它之所以能够工作,很可能是因为您没有训练它选择一个且仅选择一个输出(至少我认为您没有)。在简单的情况下,当输出只是输入和权重的点积时,权重将成为对应音高的匹配滤波器。由于一切都是线性的,如果多个匹配的过滤器同时看到良好的匹配,那么多个输出将同时被激活(就像合成音音符的情况一样)。由于您的网络可能包含非线性,因此情况稍微复杂一些,但想法可能是相同的

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


顺便提一句,你为什么要首先使用神经网络来实现这一点?看起来,只要看看DFT,比如说,取最大频率,就可以更容易地得到更好的结果。

我尝试进化一个CTRNN(连续时间递归神经网络)来检测两个正弦波之间的差异。我取得了中等程度的成功,但从来没有时间去追踪这些神经元库(即类似于耳蜗的带)。

一种可能的方法是使用(GP),生成检测音调的短代码片段。通过这种方式,您将能够生成基音检测工作原理的规则,希望能够让人可读。

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

你可能想把克拉普里的方法和你的方法进行比较。他的硕士论文《音乐自动转录的信号处理方法》对此进行了详细描述。你可以在网上找到他的许多论文,或者买他的书,解释他的算法和测试结果。他的硕士论文链接如下

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


仅采用最大频率是非常不可靠的