В этом примере показано, как использовать rica распутывать смешанные звуковые сигналы. Можно использовать rica выполнять независимый анализ компонента (ICA), когда предварительное отбеливание включено как шаг предварительной обработки. Модель ICA

Здесь,
-by-1 вектор из смешанных сигналов,
-by-1 вектор из значений смещения,

смесительная матрица и
-by-1 вектор из исходных сигналов. Предположим сначала, что это
- квадратная матрица. Если вы знаете
и
, можно восстановить исходный сигнал
с данных
:

Используя rica функция, можно выполнить это восстановление даже, не зная смесительной матрицы
или среднего значения
. Учитывая набор нескольких наблюдений
..., rica извлекает исходные сигналы
....
Загрузите набор шести звуковых файлов, которые поставляются с MATLAB®. Обрежьте каждый файл к 10 000 выборок.
files = {'chirp.mat'
'gong.mat'
'handel.mat'
'laughter.mat'
'splat.mat'
'train.mat'};
S = zeros(10000,6);
for i = 1:6
test = load(files{i});
y = test.y(1:10000,1);
S(:,i) = y;
end
Смешайте сигналы вместе при помощи случайной матрицы смешивания и добавьте случайное смещение.
rng default % For reproducibility mixdata = S*randn(6) + randn(1,6);
Чтобы слушать исходные звуки, выполните этот код:
for i = 1:6
disp(i);
sound(S(:,i));
pause;
endЧтобы слушать смешанные звуки, выполните этот код:
for i = 1:6
disp(i);
sound(mixdata(:,i));
pause;
endПостройте сигналы.
figure for i = 1:6 subplot(2,6,i) plot(S(:,i)) title(['Sound ',num2str(i)]) subplot(2,6,i+6) plot(mixdata(:,i)) title(['Mix ',num2str(i)]) end

Исходные сигналы имеют четкую структуру. Смешанные сигналы имеют намного меньше структуры.
Чтобы разделить сигналы эффективно, "предварительно побелите" сигналы при помощи prewhiten функция, которая появляется в конце этого примера. Эта функция преобразовывает mixdata так, чтобы это имело нулевое среднее значение и единичную ковариацию.
Идея следующая. Если
нулевой средний источник со статистически независимыми компонентами, то


Затем среднее значение и ковариация


Предположим, что вы знаете
и
. На практике вы оценили бы эти количества от демонстрационного среднего значения и ковариации столбцов
. Можно решить для
в терминах

Последнее уравнение содержит, даже когда
не квадратная обратимая матрица.
Предположим, что это
- 
матрица левых собственных векторов положительной полуопределенной матрицы
и
является 
матрицей собственных значений. То


То

Существует много смесительных матриц
, которые удовлетворяют этому последнему уравнению. Если

ортонормированной матрицей, то


Замена в уравнение для
,


предварительно побеленные данные. rica вычисляет неизвестную матрицу
под предположением, что компоненты
максимально независимы.
mixdata = prewhiten(mixdata);
Супергауссов источник имеет резкий пик около нуля, такого как гистограмма звукового 1 показывает.
figure histogram(S(:,1))

Выполните ICA Реконструкции при выяснении шесть функций. Укажите, что каждый источник является супергауссовым.
q = 6;
Mdl = rica(mixdata,q,'NonGaussianityIndicator',ones(6,1));
Извлеките функции. Если несмесительная процедура успешна, функции пропорциональны исходным сигналам.
unmixed = transform(Mdl,mixdata);
Постройте исходные и несмешанные сигналы.
figure for i = 1:6 subplot(2,6,i) plot(S(:,i)) title(['Sound ',num2str(i)]) subplot(2,6,i+6) plot(unmixed(:,i)) title(['Unmix ',num2str(i)]) end

Порядок несмешанных сигналов отличается, чем первоначальный заказ. Переупорядочьте столбцы так, чтобы несмешанные сигналы совпадали с соответствующими исходными сигналами. Масштабируйте несмешанные сигналы иметь те же нормы как соответствующие исходные сигналы. (rica не может идентифицировать шкалу исходных сигналов, потому что любая шкала может привести к той же смеси сигнала.)
unmixed = unmixed(:,[2,5,4,6,3,1]); for i = 1:6 unmixed(:,i) = unmixed(:,i)/norm(unmixed(:,i))*norm(S(:,i)); end
Постройте исходные и несмешанные сигналы.
figure for i = 1:6 subplot(2,6,i) plot(S(:,i)) ylim([-1,1]) title(['Sound ',num2str(i)]) subplot(2,6,i+6) plot(unmixed(:,i)) ylim([-1,1]) title(['Unmix ',num2str(i)]) end

Несмешанные сигналы выглядят похожими на исходные сигналы. Чтобы слушать несмешанные звуки, выполните этот код.
for i = 1:6
disp(i);
sound(unmixed(:,i));
pause;
endВот код для prewhiten функция.
function Z = prewhiten(X) % X = N-by-P matrix for N observations and P predictors % Z = N-by-P prewhitened matrix % 1. Size of X. [N,P] = size(X); assert(N >= P); % 2. SVD of covariance of X. We could also use svd(X) to proceed but N % can be large and so we sacrifice some accuracy for speed. [U,Sig] = svd(cov(X)); Sig = diag(Sig); Sig = Sig(:)'; % 3. Figure out which values of Sig are non-zero. tol = eps(class(X)); idx = (Sig > max(Sig)*tol); assert(~all(idx == 0)); % 4. Get the non-zero elements of Sig and corresponding columns of U. Sig = Sig(idx); U = U(:,idx); % 5. Compute prewhitened data. mu = mean(X,1); Z = bsxfun(@minus,X,mu); Z = bsxfun(@times,Z*U,1./sqrt(Sig)); end
rica | sparsefilt | ReconstructionICA | SparseFiltering