Lai*_*aie 10 audio signal-processing machine-learning neural-network source-separation
我想要做的是分离音频源并从原始信号中提取音高.我自己模仿了这个过程,如下所示:
每个源在正常模式下振荡,通常使其组件峰值的频率整数倍增.它被称为谐波.然后共振,最后线性组合.
如上所述,我对音频信号的频率响应模式有很多提示,但几乎不知道如何"分离"它.我尝试了无数自己的模特.这是其中之一:
不幸的是,我没有成功地将信号分离到现在.我想要任何建议来解决这类问题.特别是像我上面那样的源分离建模.
因为没有人真的试图回答这个问题,并且因为你用neural-network标签标记了它,我将解决神经网络对这类问题的适用性.由于这个问题有点非技术性,这个答案也将是"高水平".
神经网络需要某种样本集来学习.为了"教"一个神经网络来解决这个问题,你基本上需要有一套可行的已知解决方案.你有这个吗?如果是这样,请继续阅读.如果没有,神经可能不是你想要的.你说你有"许多提示",但没有真正的解决方案.这让我相信你可能没有样本集.如果你能得到它们,那很好,否则你可能会失败.
现在,你必须假设的样本集Raw Signal样本和相应Source 1和Source 2输出......好了,现在你将需要决定的拓扑的方法.假设你不太了解神经网络是如何工作的(并且不想知道),并且假设你也不知道问题的确切复杂程度,我可能会推荐开源NEAT包来获取你开始了 我没有以任何方式参与这个项目,但我已经使用过它,它允许你(相对)智能地发展神经网络拓扑以适应问题.
现在,就神经网络如何解决这个特定问题而言.首先想到的是所有音频信号基本上都是时间序列.也就是说,它们传达的信息在某种程度上依赖于并且与先前时间步的数据相关(例如,某些波形的检测不能从单个时间点完成;它还需要关于先前时间步的信息).再一次,有一百万种方法可以解决这个问题,但由于我已经在推荐,NEAT我建议你先看看C++ NEAT Time Series mod.
如果你沿着这条路走下去,你可能会想要使用某种滑动窗口来提供每个时间步的最近过去的信息.有关滑动窗口的快速和脏介绍,请查看此SO问题:
滑动窗口的大小可能很重要,特别是如果您不使用循环神经网络.循环网络允许神经网络记住以前的时间步骤(以性能为代价 - NEAT已经反复出现,因此可以在此选择).您可能希望滑动窗口长度(即每个时间步长提供的过去时间步数)大致等于获得足够信息分割波形所需的最大前一个时间步数的保守猜测.
我想这可能是足以让你入门的信息.
在决定如何为神经网络提供数据时,首先要对输入信号进行归一化(考虑一个sigmoid函数)并尝试不同的传递函数(Sigmoid可能是一个很好的起点).
我想你会想要有2个输出神经元,提供归一化幅度(你可以通过sigmoid函数的倒数进行非正规化)作为输出分别代表Source 1和Source 2.对于适应值(判断每个测试网络解决问题的能力的方式)将是输出信号的RMS误差对实际已知信号的负面影响(即,针对样本I测试)之前提到你需要采购).
可以说,这不会是一个微不足道的操作,但如果你有足够的样本来训练网络,它可以工作.什么样的样品数量很多?根据经验,它大致是一个足够大的数字,这样一个简单的有序多项式函数N(其中N是解决问题所需的神经网络中的神经元数量)不能准确地拟合所有样本.这基本上是为了确保您不仅仅是过度拟合问题,这是神经网络的一个严重问题.
我希望这是有帮助的!祝你好运.
附加说明:如果沿着这条路走下去,你迄今为止的工作不会是徒劳的.神经网络可能会受益于FFT和其他信号建模"输入"形式的额外"帮助",因此您可能需要考虑采取已经完成的信号处理,组织成模拟,连续表示并将其馈送作为输入信号旁边的输入.