1

使用这个声音文件: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 只是分解矩阵。这意味着如果我的目标是让两个输出分离的声源,这个算法是不完整的。我该如何处理这个分解矩阵?

4

2 回答 2

1

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

sigs = W*x;

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

祝你好运。

于 2016-01-21T10:43:30.363 回答
0

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

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

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

repmat(x,110000,1);

如果您进行数学运算,您将尝试创建一个大小为 [12100000000, 2] 的变量。如果你懒得数零,那就是 120 亿。MATLAB 中的单个双精度值大小为 8 个字节,因此您尝试创建一个使用 12100000000*8*2 字节 = ~200 GB 的变量。您可能没有这么多内存,因此 MATLAB 不让您使用。

长话短说,x在重新格式化之前尝试转置。

于 2014-09-24T04:48:58.177 回答