Dalam slide dalam kuliah pengantar tentang pembelajaran mesin oleh Andrew Ng dari Stanford di Coursera, dia memberikan solusi Oktaf satu baris berikut untuk masalah pesta koktail mengingat sumber audio direkam oleh dua mikrofon yang terpisah secara spasial:
[W,s,v]=svd((repmat(sum(x.*x,1),size(x,1),1).*x)*x');
Di bagian bawah slide adalah "sumber: Sam Roweis, Yair Weiss, Eero Simoncelli" dan di bagian bawah slide sebelumnya adalah "Klip audio milik Te-Won Lee". Dalam video tersebut, Profesor Ng berkata,
"Jadi, Anda mungkin melihat pembelajaran tanpa pengawasan seperti ini dan bertanya, 'Seberapa rumit menerapkan ini?' Sepertinya untuk membangun aplikasi ini, sepertinya melakukan pemrosesan audio ini, Anda akan menulis banyak kode, atau mungkin menautkan ke sekumpulan pustaka C ++ atau Java yang memproses audio. Sepertinya itu akan menjadi program rumit untuk melakukan audio ini: memisahkan audio dan sebagainya. Ternyata algoritme untuk melakukan apa yang baru saja Anda dengar, yang dapat dilakukan hanya dengan satu baris kode ... ditampilkan di sini. Butuh waktu lama bagi peneliti untuk menghasilkan baris kode ini. Jadi, saya tidak mengatakan ini adalah masalah yang mudah. Tetapi ternyata ketika Anda menggunakan lingkungan pemrograman yang tepat, banyak algoritme pembelajaran akan menjadi program yang sangat pendek. "
Hasil audio terpisah yang diputar di video ceramah memang tidak sempurna tapi menurut saya luar biasa. Adakah yang punya wawasan tentang bagaimana satu baris kode itu bekerja dengan baik? Secara khusus, adakah yang mengetahui referensi yang menjelaskan karya Te-Won Lee, Sam Roweis, Yair Weiss, dan Eero Simoncelli sehubungan dengan satu baris kode tersebut?
MEMPERBARUI
Untuk mendemonstrasikan kepekaan algoritme terhadap jarak pemisahan mikrofon, simulasi berikut (dalam Oktaf) memisahkan nada dari dua generator nada yang dipisahkan secara spasial.
% 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;
Setelah sekitar 10 menit eksekusi di komputer laptop saya, simulasi menghasilkan tiga angka berikut yang menggambarkan dua nada terisolasi memiliki frekuensi yang benar.
Namun, pengaturan jarak pemisah mikrofon ke nol (yaitu, dMic = 0) menyebabkan simulasi malah menghasilkan tiga gambar berikut yang mengilustrasikan simulasi tidak dapat mengisolasi nada kedua (dikonfirmasi oleh istilah diagonal signifikan tunggal yang dikembalikan dalam matriks svd).
Saya berharap jarak pemisahan mikrofon pada smartphone akan cukup besar untuk menghasilkan hasil yang baik, tetapi pengaturan jarak pemisahan mikrofon menjadi 5,25 inci (yaitu, dMic = 0,1333 meter) menyebabkan simulasi menghasilkan yang berikut, kurang dari menggembirakan, gambaran yang menggambarkan lebih tinggi komponen frekuensi dalam nada terisolasi pertama.
x
itu; apakah itu spektogram dari bentuk gelombang, atau apa?