function [MER,perm]=bss_eval_mix(Ae,A) % BSS_EVAL_MIX Ordering and measurement of the quality of an estimated % (possibly frequency-dependent) mixing matrix % % [MER,perm]=bss_eval_mix(Ae,A) % % Inputs: % Ae: either a nchan x nsrc estimated mixing matrix (for instantaneous % mixtures) or a nchan x nsrc x nbin estimated frequency-dependent mixing % matrix (for convolutive mixtures) % A: the true nchan x nsrc or nchan x nsrc x nbin mixing matrix % % Outputs: % MER: nsrc x 1 vector of Mixing Error Ratios (SNR-like criterion averaged % over frequency and expressed in decibels, allowing arbitrary scaling for % each source in each frequency bin) % perm: nsrc x 1 vector containing the best ordering of estimated sources % in the maximum MER sense (estimated source number perm(j) corresponds to % true source number j) % %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% % Copyright 2008 Emmanuel Vincent % This software is distributed under the terms of the GNU Public License % version 3 (http://www.gnu.org/licenses/gpl.txt) % If you find it useful, please cite the following reference: % Emmanuel Vincent, Shoko Araki and Pau Bofill, "The 2008 Signal Separation % Evaluation Campaign: A community-based approach to large-scale % evaluation," In Proc. Int. Conf. on Independent Component Analysis and % Signal Separation (ICA), pp. 734-741, 2009. %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %%% Errors %%% if nargin<2, error('Not enough input arguments.'); end [nchan,nsrc,nbin]=size(Ae); [nchan2,nsrc2,nbin2]=size(A); if ~((nchan2==nchan)&&(nsrc2==nsrc)&&(nbin2==nbin)), error('The estimated and true mixing matrix must have the same size.'); end %%% Performance criterion %%% % Computation of the criterion for all possible pair matches MER=zeros(nsrc,nsrc,nbin); for f=1:nbin, for jest=1:nsrc, for jtrue=1:nsrc, Aproj=A(:,jtrue,f)'*Ae(:,jest,f)/sum(abs(A(:,jtrue,f)).^2)*A(:,jtrue,f); MER(jest,jtrue,f)=10*log10(sum(abs(Aproj).^2)/sum(abs(Ae(:,jest,f)-Aproj).^2)); end end end MER=mean(MER,3); % Selection of the best ordering perm=perms(1:nsrc); nperm=size(perm,1); meanMER=zeros(nperm,1); for p=1:nperm, meanMER(p)=mean(MER((0:nsrc-1)*nsrc+perm(p,:))); end [meanMER,popt]=max(meanMER); perm=perm(popt,:).'; MER=MER((0:nsrc-1).'*nsrc+perm); return;