1

используя этот звуковой файл: http://www.ism.ac.jp/~shiro/research/sounds/RSM/X_rsm2.wavПопытка воссоздать алгоритм коктейля в Matlab, Неверные результаты?

Я пытаюсь воссоздать Machine Learning презентации Эндрю Нг (https://class.coursera.org/ml-005/lecture) от Coursera в MATLAB

Что я делаю, чтобы прочитать .wav файл (16кГц, 7 сек, 2 канала)

[x,xfs] = wavread('track.wav') 

Теперь транспонирование х

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 

Где находится отделенный аудио?

EDIT: Из дальнейших исследований я выяснил, что W является только матрицей смешения. Это означает, что этот алгоритм является неполным, если моя цель состоит в том, чтобы получить два выходных источника звука. Что мне делать с этой матрицей смешения?

ответ

0

Я считаю, что у вас заканчивается память, потому что вы пытаетесь выполнить repmat по неправильному размеру (или, возможно, вам нужно транспонировать переменную x). Загрузка x, как у вас есть дает переменную размер:

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

Конечно, если вы попытаетесь repmat это, как вы есть, вы сообщаете MATLAB для:

repmat(x,110000,1); 

Если вы математика, вы пытаетесь создать переменную размера [12100000000, 2]. Это 12 миллиардов, если вы не можете беспокоиться о подсчете нулей. Одно двойное значение в MATLAB имеет размер 8 байт, поэтому вы пытаетесь создать переменную, которая будет использовать 12100000000 * 8 * 2 байта = ~ 200 ГБ. Скорее всего, у вас нет такой памяти, поэтому почему MATLAB не позволяет вам.

Короткий рассказ, попробуйте транспонирование x перед тем, как его пересолить.

+0

Теперь, прежде чем я подключу x к алгоритму, я сначала перенести его, как вы сказали. Я больше не получаю ошибку «Из памяти»! Но я смущен результатами W, s, v. Они имеют размер 2x2. Разве они не должны быть отделенным звуком? – Shonos

+0

Возможно, попробуйте перенести результат 'repmat'? – MrAzzaman

+0

В действительности это не была функция svd, это были умножения матриц, которые не могут быть умножены из-за их размера. – Shonos

1

Я считаю, что вы хотите применить матрицу смешения W, найденную через SVD, к смешанным сигналам x. Это может быть сделано просто следующим образом:

sigs = W*x; 

Теперь sigs(1,:) будет один из разделенных сигналов и sigs(2,:) будет другой.

Удачи.