11

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

网络训练有几个乐器演奏的12个音符的样本(每次一个音符)和几个“沉默”样本。

结果其实很好。网络能够准确地检测到由不同乐器演奏的音符,这与噪音相关,甚至在播放歌曲时完全没有问题。

但是,目标是能够检测到复音。所以当两个或更多的音符一起播放时,两个相应的神经元将会发射。令人惊讶的是,网络实际上已经在一定程度上做到了这一点(仅对单音样本进行训练),但是与单音音符相比,一致性和准确性都较差。我的问题是如何提高识别多声道声音的能力?

问题是我不真正理解为什么它实际上已经工作。不同的音符(或它们的DFT)在网络训练的空间中基本上是不同的点。所以我明白了为什么它能识别类似的声音(附近的点),而不是它如何“结束”音符组合(与每个训练例子形成一个距离点)的输出。与(0,0)(0,1)(1,0)=(0)训练的AND网络一样,预计不会“结束”(1,1)=(1)。

蛮力的违规行为是尽可能多的复调样本训练网络。然而,由于网络似乎以某种方式模糊了单音样本的想法,因此这里可能更有趣。

任何指针? (抱歉的长度,顺便说一句:)。

回答

6

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

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

顺便说一句,为什么你首先使用神经网络呢?看起来只要看一下DFT,比如说取最大频率就能更容易地给出更好的结果。

+3

只是采取最大频率是非常不可靠的 – finnw 2010-12-13 00:49:48

2

我在探测2个正弦波之间的差异的同时演化了CTRNN(连续时间递归神经网络)。我获得了温和的成功,但从来没有时间跟进这些神经元库(即与耳蜗类似的频带)。

1

一种可能的方法是采用Genetic Programming(GP)来生成检测音调的短代码片段。这样你就能够生成一个关于音高检测如何工作的规则,这将有希望成为人类可读的。

3

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

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

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

基音检测时和弦录音是一个非常棘手的问题,并包含了许多争议 - 准备做大量的阅读。下面的链接包含了另一种音调检测方法,用于对付多音记录,这是我为一款名为PitchScope Player的免费应用程序开发的。我的C++源代码在GitHub.com上可用,并在下面的链接中引用。一个免费的可执行版本PitchScope播放器也可以在网络上运行并在Windows上运行。

Real time pitch detection