用神经网络分离音频信号源

时间:2014-02-02 07:22:51

标签: audio machine-learning neural-network signal-processing source-separation

我要做的是分离音频源并从原始信号中提取音高。 我自己模仿了这个过程,如下所示: model to decomposite the raw signal 每个源以normal modes振荡,通常使其分量峰值的频率整数倍增。它被称为Harmonic。然后resonanced,最后线性组合。

如上所述,我对音频信号的频率响应模式有很多提示,但几乎不知道如何“分离”它。我尝试了无数自己的模特。这是其中之一:

  1. FFT PCM
  2. 获得峰值频率箱和振幅。
  3. 计算音高候选频率区。
  4. 对于每个候选音高,使用递归神经网络分析所有峰值并找到适当的峰值组合。
  5. 分析分析的候选人。
  6. 不幸的是,到目前为止,我还没有成功地将信号分离出去。 我想要任何建议来解决这类问题。 特别是在上面的源分离模型中。

1 个答案:

答案 0 :(得分:5)

因为没有人真的试图回答这个问题,并且因为你用neural-network标记来标记它,所以我将解决神经网络对这类问题的适用性。由于这个问题有点非技术性,因此这个答案也将是“高级别”。

神经网络需要某种样本集来学习。为了“教”一个神经网络来解决这个问题,你基本上需要有一套可行的已知解决方案。你有这个吗?如果是这样,请继续阅读。如果不是,神经元可能不是你正在寻找的东西。你说你有“许多提示”,但没有真正的解决方案。这让我相信你可能没有样本集。如果你能得到它们,那很好,否则你可能会失败。

现在假设您有一组样本Raw Signal个样本以及相应的Source 1Source 2输出......好了,现在您需要一种方法来决定拓扑结构。假设你不太了解神经网络是如何工作的(并且不想知道),并假设你也不知道问题的确切复杂程度,我可能会推荐open source NEAT package来帮助你我没有以任何方式参与这个项目,但我已经使用它,它允许你(相对)智能地发展神经网络拓扑以适应问题。

现在,就神经网络如何解决这个特定问题而言。首先想到的是所有音频信号基本上都是时间序列。也就是说,它们传达的信息在某种程度上依赖于并且与先前时间步的数据有关(例如,某些波形的检测不能从单个时间点完成;它也需要关于先前时间步的信息)。同样,有一百万种方法可以解决这个问题,但由于我已经推荐NEAT,我可能建议你看一下C++ NEAT Time Series mod。

如果您沿着这条路走下去,那么可能想要使用某种滑动窗口来提供有关每个时间步的最近过去的信息。有关滑动窗口的快速简洁介绍,请查看此SO问题:

Time Series Prediction via Neural Networks

滑动窗口大小可能很重要,特别是如果你使用循环神经网络。循环网络允许神经网络记住以前的时间步骤(以性能为代价 - NEAT已经反复出现,因此可以在此选择)。您可能希望滑动窗口长度(即每个时间步长提供的过去时间步数)大致等于保守猜测最大之前获得足够时间所需的时间步数分割波形的信息。

我认为这可能足以帮助您入门。

当决定如何为神经网络提供数据时,你首先要对输入信号进行标准化(考虑sigmoid function)并尝试不同的传递函数(sigmoid可能是一个好的起点)。

我想你会想要有2个输出神经元,提供归一化幅度(你可以通过sigmoid函数的反函数去正规化)作为分别代表Source 1Source 2的输出。对于适应值(判断每个测试网络解决问题的能力的方式)将是输出信号的RMS误差与实际已知信号的负相关的线条(即。对我之前提到的你需要采购的样品进行测试。

可以说,这不会是一个微不足道的操作,但如果你有足够的样本来训练网络,它可以工作。什么样的样品数量很多?那么作为一个经验法则,它大致是一个足够大的数字,使得N的简单多项式函数(其中N是解决问题所需的自然网络中神经元的数量)不能准确地拟合所有样本。这基本上是为了确保您不仅仅是overfitting the problem,这是神经网络的一个严重问题。

我希望这对你有所帮助!祝你好运。

附加说明:如果沿着这条路走下去,你迄今为止的工作不会白费。神经网络可能会受益于FFT和其他信号建模“输入”形式的额外“帮助”,因此您可能需要考虑采取已经完成的信号处理,组织成模拟,连续表示并将其馈送作为输入信号的输入。