10

我正在尝试做的是分离音频源并从原始信号中提取其音高。我自己对这个过程进行了建模,如下所示: 分解原始信号的模型 每个源都以正常模式振荡,通常使其分量峰值的频率整数倍增。它被称为谐波。然后共振,最后线性组合。

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

  1. FFT PCM
  2. 获取峰值频率区间和幅度。
  3. 计算音高候选频率区间。
  4. 对于每个音高候选,使用循环神经网络分析所有峰值并找到合适的峰值组合。
  5. 分离分析的音高候选。

不幸的是,到目前为止,我还没有成功地分离信号。我想要任何建议来解决这类问题。尤其是像我上面的源分离建模。

4

1 回答 1

5

因为没有人真正尝试过回答这个问题,并且因为你已经用neural-network标签标记了它,所以我将讨论神经网络对这类问题的适用性。由于这个问题有点非技术性,这个答案也将是“高水平的”。

神经网络需要某种样本集来学习。为了“教”一个神经网络来解决这个问题,你基本上需要有一组已知的解决方案来工作。你有这个吗?如果是这样,请继续阅读。如果不是,那么神经可能不是您想要的。您说您有“很多提示”,但没有真正的解决方案。这让我相信你可能没有样本集。如果你能得到它们,那就太好了,否则你可能会不走运。

假设现在您有一组Raw Signal样本以及相应的样本Source 1Source 2输出......那么,现在您将需要一种确定拓扑的方法。假设您不太了解神经网络的工作原理(并且不想),并且假设您也不知道问题的确切复杂程度,我可能会推荐开源 NEAT 包来获取你开始了。我与这个项目没有任何关系,但我已经使用过它,它允许你(相对)智能地进化神经网络拓扑以适应问题。

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

如果您沿着这条路线走,您可能希望使用某种滑动窗口来提供有关每个时间步最近过去的信息。有关滑动窗口的快速而肮脏的介绍,请查看这个 SO 问题:

通过神经网络进行时间序列预测

滑动窗口的大小可能很重要,尤其是在您使用循环神经网络的情况下。循环网络允许神经网络记住以前的时间步长(以性能为代价 - NEAT 已经是循环的,因此在这里为您做出选择)。您可能希望滑动窗口长度(即,过去在每个时间步提供的时间步数)大致等于您对获得足够信息以拆分波形所需的最大先前时间步数的保守猜测。

我会说这可能足以让您入门。

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

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

可以说,这不是一个简单的操作,但如果你有足够的样本来训练网络,它可能会起作用。什么是好的样本数量?根据经验,它大致是一个足够大的数字,以至于简单的阶多项式函数N(其中 N 是解决问题所需的神经网络中的神经元数量)不能准确地拟合所有样本。这基本上是为了确保您不会简单地过度拟合问题,这是神经网络的一个严重问题。

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

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

于 2014-08-17T04:09:35.537 回答