sol*_*old 9 signal-processing machine-learning pitch-tracking neural-network
我正在尝试使用ANN进行音符的音高检测.网络是一个简单的双层MLP,其输入基本上是DFT(平均和对数分布),12个输出对应于特定八度音阶的12个音符.
通过某些乐器演奏的12个音符的一些样本(一次一个音符)和几个"静音"样本训练网络.
结果实际上很好.网络能够准确地检测出不同乐器所演奏的音符,它相对于噪音,甚至在播放歌曲时也不会完全放松.
然而,目标是能够检测复音.因此,当两个或多个音符一起播放时,两个相应的神经元将会发射.令人惊讶的是,网络实际上已经在某种程度上做到了这一点(仅对单声道样本进行训练),但是与单声道音符相比,不那么一致且不太准确.我的问题是如何增强它识别多元音的能力?
问题是我不明白为什么它实际上已经有效了.不同的音符(或它们的DFT)基本上是训练网络的空间中的不同点.所以我明白为什么它会识别出类似的声音(附近的点),而不是它如何"结束"一组音符的输出(它们与每个训练样例形成一个遥远的点).与(0,0)(0,1)(1,0)=(0)训练的AND网络相同的方式不会"结束"(1,1)=(1).
对此采取的蛮力是用尽可能多的复音样本训练网络.然而,由于网络似乎以某种方式模糊地从单声道样本中抓住了这个想法,所以这里可能还有一些更有趣的东西.
有什么指针吗?(抱歉长度,顺便说一句:).
它的工作原因可能很简单,你没有训练它选择一个只有一个输出(至少我假设你没有).在输出只是输入和权重的点积的简单情况下,权重将成为相应音高的匹配滤波器.由于一切都是线性的,如果多个匹配滤波器同时看到良好匹配(如复音音符的情况),则同时激活多个输出.由于您的网络可能包含非线性,因此图片有点复杂,但这个想法可能是相同的.
关于改进它的方法,使用复音样本进行训练肯定是一种可能性.另一种可能性是切换到线性滤波器.复音声音的DFT基本上是每个声音的DFT之和.您希望输入的线性组合成为相应的输出线性组合,因此线性滤波器是合适的.
顺便说一句,为什么你首先使用神经网络呢?看起来只是看DFT,比如说采用最大频率可以更容易地给你更好的结果.
Anssi Klapuri是一位备受尊敬的音频研究人员,他发表了一种使用神经网络对复音录音进行音调检测的方法。
您可能想将 Klapuri 的方法与您的方法进行比较。这在他的硕士论文《用于音乐自动转录的信号处理方法》中有详细描述。你可以在网上找到他的许多论文,或者买他的书,解释他的算法和测试结果。他的硕士论文链接如下。
https://www.cs.tut.fi/sgn/arg/klap/phd/klap_phd.pdf
复音录音的音高检测是一个非常困难的话题,并且包含许多争议——准备好进行大量阅读。下面的链接包含另一种检测和弦录音音高的方法,这是我为名为PitchScope Player的免费应用程序开发的。我的 C++ 源代码可在 GitHub.com 上找到,并在下面的链接中引用。PitchScope Player 的免费可执行版本也可在网络上获得并在 Windows 上运行。
| 归档时间: |
|
| 查看次数: |
4170 次 |
| 最近记录: |