123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263 |
- 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;
|