exponenta event banner

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

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

$$x = \mu + As.$$

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

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

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

Загрузить данные

Загрузите набор из шести аудиофайлов, поставляемых с MATLAB ®. Обрезать каждый файл до 10000 образцов.

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

Чтобы эффективно разделять сигналы, «preshiten» сигналы, используя 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))

Выполните реконструкцию 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

См. также

| | |

Связанные примеры

Подробнее