Esta página aún no se ha traducido para esta versión. Puede ver la versión más reciente de esta página en inglés.

Extraer señales mixtas

Este ejemplo muestra cómo utilizar para desentrelangular las señales de audio mezcladas.rica Puede utilizar para realizar análisis de componentes independientes (ICA) cuando se incluye el preaclaramiento como paso de preprocesamiento.rica El modelo ICA es

Aquí es una -por-1 vector de señales mixtas, es una -por-1 vector de valores de desfase, es una por matriz de mezcla y es una -por-1 vector de las señales originales. Supongamos primero que es una matriz cuadrada. Si sabe Y , puede recuperar una señal original de los datos :

Mediante la función, puede realizar esta recuperación incluso sin conocer la matriz de mezclarica o la media . Dado un conjunto de varias observaciones , ,..., extrae las señales originalesrica , , ....

Cargar datos

Cargue un conjunto de seis archivos de audio, que se suministran con MATLAB®. Recorte cada archivo a 10.000 muestras.

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 

Las señales de mezcla

Mezcle las señales usando una matriz de mezcla aleatoria y agregue un desplazamiento aleatorio.

rng default % For reproducibility mixdata = S*randn(6) + randn(1,6); 

Para escuchar los sonidos originales, ejecute este código:

   for i = 1:6        disp(i);        sound(S(:,i));        pause;    end

Para escuchar los sonidos mixtos, ejecute este código:

   for i = 1:6        disp(i);        sound(mixdata(:,i));        pause;    end

Trace las señales.

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 

Las señales originales tienen una estructura clara. Las señales mixtas tienen mucho menos estructura.

Prewhiten señales mixtas

Para separar las señales eficazmente, "prewhiten" las señales mediante el uso de la función que aparece al final de este ejemplo.prewhiten Esta función se transforma para que tenga una media cero y una covarianza de identidad.mixdata

La idea es la siguiente. Si es una fuente de media cero con componentes estadísticamente independientes y, a continuación,

Entonces la media y la covarianza de Son

Supongamos que usted sabe Y . En la práctica, debe estimar estas cantidades a partir de la media de la muestra y la covarianza de las columnas de . Puede resolver en términos de Por

Esta última ecuación se mantiene incluso cuando no es una matriz invertible cuadrada.

Supongamos que es una por matriz de vectores propios izquieros de la matriz semidefinida positiva Y es el por matriz de eigenvalues. Entonces

Entonces

Hay muchas matrices de mezcla que satisfacen esta última ecuación. Si es una por matriz oronormal, luego

Sustituyendo a la ecuación por ,

son los datos preblanqueados. calcula la matriz desconocidarica Suponiendo que los componentes de son lo más independientes posible.

mixdata = prewhiten(mixdata); 

Separar todas las señales

Una fuente super-gaussiana tiene un pico agudo cerca de cero, como un histograma de sonido 1 muestra.

figure histogram(S(:,1)) 

Realice la reconstrucción ICA mientras pide seis características. Indique que cada fuente es super-Gaussiana.

q = 6; Mdl = rica(mixdata,q,'NonGaussianityIndicator',ones(6,1)); 

Extraiga las entidades. Si el procedimiento de desmezcla se realiza correctamente, las entidades son proporcionales a las señales originales.

unmixed = transform(Mdl,mixdata); 

Compare las señales sin mezclar con las señales originales

Graficar las señales originales y no mezcladas.

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 

El orden de las señales no mezcladas es diferente de la orden original. Reordenar las columnas para que las señales no mezcladas coincidan con las señales originales correspondientes. Escale las señales no mezcladas para tener las mismas normas que las señales originales correspondientes. (no se puede identificar la escala de las señales originales porque cualquier escala puede conducir a la misma mezcla de señal.)rica

unmixed = unmixed(:,[2,5,4,6,3,1]); for i = 1:6     unmixed(:,i) = unmixed(:,i)/norm(unmixed(:,i))*norm(S(:,i)); end 

Graficar las señales originales y no mezcladas.

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 

Las señales sin mezclar tienen un aspecto similar a las señales originales. Para escuchar los sonidos no mezclados, ejecute este código.

   for i = 1:6        disp(i);        sound(unmixed(:,i));        pause;    end

Aquí está el código para la función.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  

Consulte también

| | |

Ejemplos relacionados

Más acerca de