Извлечение смешанных сигналов

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

$$x = \mu + As.$$

Здесь,$x$ является $p$вектором -by-1 смешанных сигналов,$\mu$ является $p$вектором -by-1 значений смещения, является$A$ $p$$q$матрицей -by-смешения и является$s$ $q$вектором -by-1 исходных сигналов. Предположим, сначала это$A$ квадратная матрица. Если вы знаете и,$\mu$ можно $A$восстановить исходный сигнал из$s$ данных:$x$

$$s = A^{-1}(x - \mu).$$

Использование rica функция, вы можете выполнить это восстановление даже не зная смешивающую матрицу$A$ или среднее значение. $\mu$Учитывая набор нескольких наблюдений,,.$x(1)$..$x(2)$, rica извлекает исходные сигналы$s(1)$,,....$s(2)$

Загрузка данных

Загрузите набор из шести аудиофайлов, поставляемых с 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

Исходные сигналы имеют четкую структуру. Смешанные сигналы имеют гораздо меньшую структуру.

Предварительные смешанные сигналы

Чтобы эффективно разделять сигналы, «предварительно whiten» сигналы при помощи prewhiten функция, которая появляется в конце этого примера. Эта функция преобразует mixdata так, что это имеет нулевое среднее и тождества ковариации.

Идея следующая. Если$s$ является источником с нулевым значением со статистически независимыми компонентами, то

$$E(s) = 0$$

$$E(ss^T) = I.$$

Тогда среднее и ковариация$x$

$$ E(x) = \mu$$

$${\rm Cov}(x) = AA^T = C.$$

Предположим, что вы знаете$\mu$ и. $C$На практике эти величины оцениваются из среднего выборочного значения и ковариации столбцов. $x$Вы можете решить для с$s$ точки зрения$x$

$$ s = A^{-1}(x-\mu) = (A^TA)^{-1}A^T(x-\mu).$$

Последнее уравнение выполняется, даже когда$A$ не является квадратной инвертируемой матрицей.

Предположим, что$U$ является -$p$by -$q$ матрицей левых собственных векторов положительной полуопределённой матрицы $C$и является$\Sigma$ -by - $q$$q$матрицей собственных значений. Тогда

$$ C = U\Sigma U^T$$

$$U^TU = I.$$

Тогда

$$ AA^T = U\Sigma U^T.$$

Существует много смешивающих матриц$A$, которые удовлетворяют этому последнему уравнению. Если$W$ является -$q$by -$q$ ортонормальной матрицей, то

$$ W^TW = W W^T = I$$

$$ A = U\Sigma^{1/2} W.$$

Подстановка в уравнение на,$s$

$$s = W^T\tilde{x},\ \rm{where}$$

$$ \tilde{x} = \Sigma^{-1/2}U^T(x-\mu).$$

$\tilde{x}$ - предварительно пробитые данные. rica вычисляет неизвестную матрицу$W$ в предположении, что компоненты$s$ максимально независимы.

mixdata = prewhiten(mixdata);

Разделите все сигналы

Супер-Гауссов источник имеет резкий пик около нуля, такой как гистограмма звука 1 показывает.

figure
histogram(S(:,1))

Выполните Reconstruction 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

См. также

| | |

Похожие примеры

Подробнее о