鸡尾酒会算法SVD的实现…在一行代码中?

问题描述 投票:77回答:2

[Stanford的Andrew Ng在Coursera的机器学习入门演讲中的幻灯片中,他给出了鸡尾酒会问题的以下一行八度音阶解决方案,因为音频源是由两个空间分开的麦克风录制的。

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

[幻灯片的底部是“来源:Sam Roweis,Yair Weiss,Eero Simoncelli”,而在较早的幻灯片的底部是“由Te-Won Lee提供的音频剪辑”。在视频中,吴教授说,

“因此,您可能会看这样的无监督学习,并问,'实施此过程有多复杂?似乎要构建此应用程序,似乎要进行音频处理,您将编写大量代码,或者链接到处理音频的一堆C ++或Java库中。处理音频的复杂程序:分离音频等,结果证明该算法可以完成您刚刚听到的操作,只需一行代码即可完成……如此处所示,这花费了研究人员很长时间提出这一行代码。因此,我并不是说这是一个简单的问题。但是事实证明,当您使用正确的编程环境时,许多学习算法实际上都是很短的程序。“

在视频讲座中播放的单独音频结果并不完美,但在我看来,这是惊人的。有人对那一行代码的性能有何见解?特别是,没有人知道参考文献来解释Te-Won Lee,Sam Roweis,Yair Weiss和Eero Simoncelli在那一行代码方面的工作吗?

UPDATE

为了证明算法对麦克风分离距离的敏感性,以下模拟(以八度为单位)将音调与两个空间分离的音调发生器分开。

% define model 
f1 = 1100;              % frequency of tone generator 1; unit: Hz 
f2 = 2900;              % frequency of tone generator 2; unit: Hz 
Ts = 1/(40*max(f1,f2)); % sampling period; unit: s 
dMic = 1;               % distance between microphones centered about origin; unit: m 
dSrc = 10;              % distance between tone generators centered about origin; unit: m 
c = 340.29;             % speed of sound; unit: m / s 

% generate tones
figure(1);
t = [0:Ts:0.025];
tone1 = sin(2*pi*f1*t);
tone2 = sin(2*pi*f2*t);
plot(t,tone1); 
hold on;
plot(t,tone2,'r'); xlabel('time'); ylabel('amplitude'); axis([0 0.005 -1 1]); legend('tone 1', 'tone 2');
hold off;

% mix tones at microphones
% assume inverse square attenuation of sound intensity (i.e., inverse linear attenuation of sound amplitude)
figure(2);
dNear = (dSrc - dMic)/2;
dFar = (dSrc + dMic)/2;
mic1 = 1/dNear*sin(2*pi*f1*(t-dNear/c)) + \
       1/dFar*sin(2*pi*f2*(t-dFar/c));
mic2 = 1/dNear*sin(2*pi*f2*(t-dNear/c)) + \
       1/dFar*sin(2*pi*f1*(t-dFar/c));
plot(t,mic1);
hold on;
plot(t,mic2,'r'); xlabel('time'); ylabel('amplitude'); axis([0 0.005 -1 1]); legend('mic 1', 'mic 2');
hold off;

% use svd to isolate sound sources
figure(3);
x = [mic1' mic2'];
[W,s,v]=svd((repmat(sum(x.*x,1),size(x,1),1).*x)*x');
plot(t,v(:,1));
hold on;
maxAmp = max(v(:,1));
plot(t,v(:,2),'r'); xlabel('time'); ylabel('amplitude'); axis([0 0.005 -maxAmp maxAmp]); legend('isolated tone 1', 'isolated tone 2');
hold off;

在我的便携式计算机上执行大约10分钟后,模拟生成以下三个图形,说明两个孤立的音调具有正确的频率。

“图1”“图2”“图3”

但是,将麦克风间距设置为零(即dMic = 0)会使模拟生成以下三个图形,说明模拟无法隔离第二个音调(由svd矩阵中返回的单个有效对角线项确认) )。

“没有麦克风分离的图”“没有麦克风分离的图2”“没有麦克风分离的图3”

我希望智能手机上的麦克风间距足够大,以产生良好的结果,但是将麦克风间距设置为5.25英寸(即dMic = 0.1333米)会导致模拟产生以下结果,但并不令人鼓舞说明第一个隔离音中的高频分量。

“智能手机上的图1”“智能手机上的图2”“智能手机上的图3”

matlab machine-learning octave linear-algebra svd
2个回答
21
投票

两年后,我也试图弄清楚这一点。但是我得到了答案。希望它将对某人有所帮助。


15
投票

x(t)是来自一个通道/麦克风的原始语音。

© www.soinside.com 2019 - 2024. All rights reserved.