Blind Source Separation in 2 lines of MATLAB code (BSS):
Lucas C Parra

    % BSS MATLAB code:
    [W,D] = eig(X*X',Q);       % compute unmixing matrix W
    S = W'*X;                          % compute sources S.


X is a N*T matrix containing T samples of N sensor readings presumably generated by X=A*S, with A=inv(W').
[V,D]=eig(A,B) is the generalized eigenvalue procedure such that A*V = B*V*D, i.e. V jointly diagonalizes A and B.
Use if you assume sources S are Details simple version of  reference
Q=X(:,1:T-tau)*X(:,tau+1:T)'+X(:,tau+1:T)*(:,1:T-tau)'; non-white and decorrelated. Q is the symmetrized cross-correlation for some time delay tau. Use tau with 
non-zero auto-correlation in the sources.
simultaneous decorrelation [1,2,4,6]
Q = X(:,1:t)*X(:,1:t)'; non-stationary and decorrelated. Q is the covariance computed for the first t samples. Use t in the order of magnitude of  the stationarity time of the signal. simultaneous decorrelation [1,3,6]
Q=((T*ones(N,1)*sum(abs(X).^2)).*X)*X' ... -X*X'*X*X'-X*X'*trace(X*X')-(X*X.')*conj(X*X.'); non-Gaussian and independent. Q is the sum over 4th order cumulants: sumklCum(xi,xj,xk,xl)
This method is really not robust. Included here only for tutorial purposes.
ICA [1,2]
Q = eye(N); decorrelated and mixing A is orthogonal. Q is identity, which reduces generalized eigenvalue to regular eigenvalue. PCA any linear algebra book

Time t and time delay tau can be replaced by distance and shift in space if dealing with images and volumes rather than time series.


No claims are made for correlated sources. The method above is thoroughly unrobust with poor statistical and numerical performance, in particular in high dimensional problems (where you do not have T>>N) and in particular for the higher moments case. But what can you expect from two lines of code?! This information is provided for people with little patience to read papers or implement code. It's just a teaser really.   If you want to get good results consider diagonalizing for multiple tau, t, or multiple cumulant terms. How? Not in two lines ... you will have to read some papers.


[1] Lucas Parra, Paul Sajda, "Blind Source Separation via Generalized Eigenvalue Decomposition", Journal of Machine Learning Research, vol. 4, pp. 1261-1269, 2003 (.pdf)

[2] Cardoso, J.F., Souloumiac A., "Blind beamforming for non Gaussian signals",  IEE Proceedings-F, vol. 140, no. 6, pp. 362-370, December 1993

[3] Weinstein, E. and Feder, M. and Oppenheim, A.V, "Multi-Channel Signal Separation by Decorrelation", IEEE Trans. Speech Audio Processing, vol. 1, no. 4, pp. 405-413, April 1993

[4] Molgedey, L. and Schuster, H.,G., "Separation of a mixture of independent signals using time delayed correlations", Physical Review Letters, vol.  72, no. 23, pp. 3634-3637, 1994

[5] Cardoso, J.F. "Blind signal separation: statistical principles",  Proc. of the IEEE, vol. 9, no. 10, pp. 2009-2026, October 1998

[6] Parra L., Spence C., "Convolutive blind source separation of non-stationary sources", IEEE Trans. on Speech and Audio Processing pp. 320-327, May 2000.

[7] Roberts, S., Everson, R. "Independent Components Analysis : Principles and Practice" Cambridge University Press, June 2001


Find here a short tutorial talk and overview on some of my work in BSS: slides.

Lucas Parra, Jan 12, 2003