Stanford'dan Andrew Ng tarafından Coursera'daki makine öğrenimi üzerine giriş dersinde yer alan bir slaytta, ses kaynaklarının mekansal olarak ayrılmış iki mikrofon tarafından kaydedildiği göz önüne alındığında, kokteyl partisi sorununa aşağıdaki tek satır Octave çözümünü veriyor:
[W,s,v]=svd((repmat(sum(x.*x,1),size(x,1),1).*x)*x');
Slaydın altında "kaynak: Sam Roweis, Yair Weiss, Eero Simoncelli" ve daha önceki bir slaydın altında "Te-Won Lee'nin ses klipleri" yer almaktadır. Videoda Profesör Ng,
"Öyleyse, bunun gibi denetimsiz öğrenmeye bakabilir ve 'Bunu uygulamak ne kadar karmaşık?' Diye sorabilirsiniz. Görünüşe göre bu uygulamayı inşa etmek için, bu ses işlemeyi yapmak gibi görünüyor, bir ton kod yazarsınız ya da belki sesi işleyen bir grup C ++ veya Java kitaplığına bağlanırsınız. Bu sesi yapmak için karmaşık bir program: sesi ayırmak vb. Az önce duyduğunuz şeyi yapmak için algoritma ortaya çıktı, bu sadece bir satır kodla yapılabilir ... tam burada gösteriliyor. Araştırmacılar uzun zaman aldı bu kod satırını bulmak için. Bu yüzden bunun kolay bir problem olduğunu söylemiyorum. Ama doğru programlama ortamını kullandığınızda birçok öğrenme algoritmasının gerçekten kısa programlar olacağı ortaya çıkıyor. "
Video dersinde oynatılan ayrılmış ses sonuçları mükemmel değil ama bence harika. Bu kod satırının nasıl bu kadar iyi performans gösterdiğine dair herhangi bir fikri olan var mı? Özellikle, Te-Won Lee, Sam Roweis, Yair Weiss ve Eero Simoncelli'nin bu tek satır kodla ilgili çalışmalarını açıklayan bir referans bilen var mı?
GÜNCELLEME
Algoritmanın mikrofon ayırma mesafesine olan hassasiyetini göstermek için, aşağıdaki simülasyon (Oktav cinsinden) tonları uzamsal olarak ayrılmış iki ton üretecinden ayırır.
% 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;
Dizüstü bilgisayarımda yaklaşık 10 dakikalık yürütmeden sonra simülasyon, iki izole tonun doğru frekanslara sahip olduğunu gösteren aşağıdaki üç şekli oluşturur.
Bununla birlikte, mikrofon ayırma mesafesinin sıfıra ayarlanması (yani, dMic = 0), simülasyonun bunun yerine, ikinci bir tonu izole edemediğini gösteren aşağıdaki üç şekli oluşturmasına neden olur (svd'nin matrisinde döndürülen tek anlamlı köşegen terim tarafından onaylanır).
Bir akıllı telefondaki mikrofon ayırma mesafesinin iyi sonuçlar üretecek kadar büyük olacağını umuyordum, ancak mikrofon ayırma mesafesini 5,25 inç (yani, dMic = 0,1333 metre) olarak ayarlamak, simülasyonun, cesaret verici olmaktan çok daha yüksek rakamları gösteren aşağıdaki rakamları oluşturmasına neden oluyor. ilk izole edilmiş tondaki frekans bileşenleri.
x
olduğunu hatırlayamıyorum ; dalga formunun spektrogramı mı yoksa ne?