我正在尝试使用ANN进行音符的音高检测.网络是一个简单的双层MLP,其输入基本上是DFT(平均和对数分布),12个输出对应于特定八度音阶的12个音符.
通过某些乐器演奏的12个音符的一些样本(一次一个音符)和几个"静音"样本训练网络.
结果实际上很好.网络能够准确地检测出不同乐器所演奏的音符,它相对于噪音,甚至在播放歌曲时也不会完全放松.
然而,目标是能够检测复音.因此,当两个或多个音符一起播放时,两个相应的神经元将会发射.令人惊讶的是,网络实际上已经在某种程度上做到了这一点(仅对单声道样本进行训练),但是与单声道音符相比,不那么一致且不太准确.我的问题是如何增强它识别多元音的能力?
问题是我不明白为什么它实际上已经有效了.不同的音符(或它们的DFT)基本上是训练网络的空间中的不同点.所以我明白为什么它会识别出类似的声音(附近的点),而不是它如何"结束"一组音符的输出(它们与每个训练样例形成一个遥远的点).与(0,0)(0,1)(1,0)=(0)训练的AND网络相同的方式不会"结束"(1,1)=(1).
对此采取的蛮力是用尽可能多的复音样本训练网络.然而,由于网络似乎以某种方式模糊地从单声道样本中抓住了这个想法,所以这里可能还有一些更有趣的东西.
有什么指针吗?(抱歉长度,顺便说一句:).
它的工作原因可能很简单,你没有训练它选择一个只有一个输出(至少我假设你没有).在输出只是输入和权重的点积的简单情况下,权重将成为相应音高的匹配滤波器.由于一切都是线性的,如果多个匹配滤波器同时看到良好匹配(如复音音符的情况),则同时激活多个输出.由于您的网络可能包含非线性,因此图片有点复杂,但这个想法可能是相同的.
关于改进它的方法,使用复音样本进行训练肯定是一种可能性.另一种可能性是切换到线性滤波器.复音声音的DFT基本上是每个声音的DFT之和.您希望输入的线性组合成为相应的输出线性组合,因此线性滤波器是合适的.
顺便说一句,为什么你首先使用神经网络呢?看起来只是看DFT,比如说采用最大频率可以更容易地给你更好的结果.