试图在Matlab中重建鸡尾酒会算法,错误的结果呢?

时间:2014-09-24 04:36:12

标签: matlab machine-learning octave linear-algebra source-separation

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

我正在尝试从matlab中的coursera重新创建Andrew Ng的机器学习演示文稿(https://class.coursera.org/ml-005/lecture

我所做的是阅读.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只是解混矩阵。如果我的目标是获得两个输出分离的声源,这意味着这个算法是不完整的。我该怎么做这个解混矩阵?

2 个答案:

答案 0 :(得分:1)

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

sigs = W*x;

现在sigs(1,:)将是其中一个分开的信号,sigs(2,:)将成为另一个信号。

祝你好运。

答案 1 :(得分:0)

我相信你的内存耗尽是因为你试图repmat跨越错误的维度(或者你的x变量可能需要转置)。如您所载,加载x会为您提供一个大小变量:

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

当然,如果您尝试repmat这样,那么您实际上是在告诉MATLAB:

repmat(x,110000,1);

如果您进行数学计算,则需要尝试创建大小为[12100000000,2]的变量。如果你不能计算零点,这就是120亿。 MATLAB中的单个double值大小为8个字节,因此您尝试创建一个使用12100000000 * 8 * 2 bytes = ~200 GB的变量。你可能没有这么多记忆,因此MATLAB不会让你这么做。

长话短说,在重新编辑之前尝试调换x