试图在Matlab中重新创建鸡尾酒会算法,结果错误



使用此声音文件:http://www.ism.ac.jp/~shiro/research/sounds/RSM/X_rsm2.wav

我正在尝试重新制作吴恩达的机器学习演示(https://class.coursera.org/ml-005/lecture)在matlab 中从coursera

我所做的是读取.wav文件(16khz,7秒,2通道)

[x,xfs] = wavread('track.wav')

现在我转置x

x = x'

现在我继续在鸡尾酒会算法上使用x

[W,s,v] = svd((repmat(sum(x.*x,1),size(x,1),1).*x)*x')

MATLAB返回:

W =
   -0.9233   -0.3841
   -0.3841    0.9233

s =
  265.4832         0
         0   13.0768

v =
   -0.9233   -0.3841
   -0.3841    0.9233

分离的音频在哪里?

编辑:通过进一步的研究,我发现W只是分解矩阵。这意味着如果我的目标是获得两个输出分离的声源,那么这个算法是不完整的。我该如何处理这个分解矩阵?

我相信您希望将通过SVD找到的解混矩阵W应用于混合信号x。这可以简单地完成如下操作:

sigs = W*x;

现在sigs(1,:)将是分离的信号之一,而sigs(2,:)将是另一个。

祝你好运。

我相信您的内存不足,因为您试图在错误的维度上repmat(或者可能您的x变量需要转置)。加载x会给你一个大小可变的:

>> size(x) = [110000, 2]

当然,如果你尝试像现在这样repmat,你本质上是在告诉MATLAB:

repmat(x,110000,1);

如果你计算一下,你就试图创建一个大小为[12100000000000,2]的变量。如果你不介意数零的话,那就是120亿。MATLAB中的单个双值大小为8个字节,因此您试图创建一个使用12100000000*8*2字节=~200 GB的变量。很可能你没有那么多内存,因此MATLAB不允许你这么做。

长话短说,在重新映射x之前,请尝试将其转座。

相关内容

  • 没有找到相关文章

最新更新