У слайді в рамках вступної лекції про машинне навчання Ендрю Нґ з Стенфорда на Coursera він подає наступне однострочне рішення проблеми коктейлю, враховуючи аудіоджерела, записані двома просторово розділеними мікрофонами:
[W,s,v]=svd((repmat(sum(x.*x,1),size(x,1),1).*x)*x');
Внизу слайда знаходиться "джерело: Сем Роуейс, Яір Вайс, Ееро Сімончеллі", а внизу попереднього слайда - "Аудіокліпи, надані Те-Вон Лі". У відео професор Нг каже:
"Отже, ви можете поглянути на таке навчання без нагляду і запитати:" Наскільки складно це реалізовувати? " Здається, що для того, щоб створити цю програму, схоже, щоб зробити цю аудіо-обробку, ви написали б тонну коду, або, можливо, зв’язали б в купу бібліотек C ++ або Java, які обробляють звук. складна програма для цього аудіо: виділення аудіо тощо. Виявляється, алгоритм робить те, що ви щойно чули, це можна зробити лише за допомогою одного рядка коду ... показано тут. Це зайняло у дослідників багато часу щоб придумати цей рядок коду. Тому я не кажу, що це легка проблема. Але виявляється, що коли ви використовуєте правильне середовище програмування, багато алгоритмів навчання будуть дійсно короткими програмами ".
Окремі звукові результати, відтворені у відеолекції, не є ідеальними, але, на мій погляд, дивовижними. Хто-небудь має уявлення про те, як добре працює один рядок коду? Зокрема, чи знає хтось посилання, яке пояснює роботу Те-Вон Лі, Сем Роуейс, Яір Вайс та Ееро Сімончеллі щодо цього одного рядка коду?
ОНОВЛЕННЯ
Щоб продемонструвати чутливість алгоритму до відстані між мікрофонами, наступне моделювання (в октаві) відокремлює тони від двох просторово розділених генераторів тонів.
% 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 хвилин виконання на моєму портативному комп'ютері моделювання генерує наступні три фігури, що ілюструють, що два ізольованих тони мають правильні частоти.
Однак встановлення нуля відстані між мікрофонами (тобто dMic = 0) змушує моделювання натомість генерувати наступні три фігури, що ілюструють, що моделювання не могло виділити другий тон (підтверджений одним значущим діагональним членом, повернутим у матриці svd).
Я сподівався, що відстань між мікрофонами на смартфоні буде достатньо великою для отримання хороших результатів, але встановлення відстані між мікрофонами на 5,25 дюйма (тобто dMic = 0,1333 метри) змушує симуляцію генерувати наступні, менш обнадійливі цифри, що ілюструють вищі частотні складові в першому ізольованому тоні.
x
є; це спектрограма сигналу, чи що?