使用神经网络进行音高检测

时间:2010-01-29 16:16:58

标签: machine-learning neural-network signal-processing pitch-tracking

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

通过一些乐器播放的12个音符的一些样本(一次一个音符)和一些“静音”样本训练网络。

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

然而,目标是能够检测复音。因此,当两个或多个音符一起播放时,两个相应的神经元将会发射。令人惊讶的是,网络实际上已经在某种程度上做到了这一点(仅受到单声道样本的训练),但是与单声道音符相比,不那么一致且不太准确。我的问题是如何增强它识别多元音的能力?

问题是我不明白为什么它实际上已经有效了。不同的音符(或它们的DFT)基本上是训练网络的空间中的不同点。所以我明白为什么它会识别出类似的声音(附近的点),而不是它如何“结束”一组音符的输出(它们与每个训练样例形成一个遥远的点)。与(0,0)(0,1)(1,0)=(0)训练的AND网络相同的方式不会“结束”(1,1)=(1)。

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

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

4 个答案:

答案 0 :(得分:6)

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

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

顺便说一句,为什么你首先使用神经网络呢?看起来只看DFT,比如说采用最大频率就可以更轻松地获得更好的结果。

答案 1 :(得分:4)

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

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

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

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

Real time pitch detection

答案 2 :(得分:2)

我尝试在检测2个正弦波之间的差异时发展CTRNN(连续时间递归神经网络)。我取得了一定的成功,但从未有时间跟进这些神经元(即与人工耳蜗相似的波段)。

答案 3 :(得分:1)

一种可能的方法是使用Genetic Programming(GP)来生成检测音高的短代码片段。通过这种方式,您可以生成关于音高检测如何工作的规则,这有望成为人类可读的。