diff m-toolbox/classes/+utils/@math/loglikelihood.m @ 0:f0afece42f48

Import.
author Daniele Nicolodi <nicolodi@science.unitn.it>
date Wed, 23 Nov 2011 19:22:13 +0100
parents
children
line wrap: on
line diff
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/m-toolbox/classes/+utils/@math/loglikelihood.m	Wed Nov 23 19:22:13 2011 +0100
@@ -0,0 +1,99 @@
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%
+% Compute log-likelihood
+%
+% M Nofrarias 15-06-09
+%
+% $Id: loglikelihood.m,v 1.2 2011/03/24 19:59:50 ingo Exp $
+%
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+function loglk = loglikelihood(xn,in,out,noise,model,params)
+  
+  % parameters
+  fs = noise(1).fs;
+  N = length(noise(1).y);
+  
+  if numel(in) == 1 % 1 input / 1 output case
+    f = in(1).x;
+    % evaluate models
+    eval = model(1).setParams(params,xn);
+    h11 = double(eval);
+    
+    % spectra to variance
+    C11 = (N*fs/2)*noise(1).y;
+    
+    % compute elements of inverse cross-spectrum matrix
+    InvS11 = 1./C11;
+    
+    % compute log-likelihood terms first, all at once does not cancel the
+    % imag part when multiplying x.*conj(x)
+    v1v1 = conj(out(1).y - h11.*in(1).y).*(out(1).y - h11.*in(1).y);
+    
+    loglk = sum(InvS11.*v1v1);
+    
+  elseif numel(in) == 2
+    
+    if(numel(out) == 1) % 2 input / 1 output case
+      f = in(1).x;
+      
+      % evaluate models
+      h11 = model(1).setParams(params,xn).double;
+      h12 = model(2).setParams(params,xn).double;
+      
+      % spectra to variance
+      C11 = (N*fs/2)*noise(1).y;
+      
+      % compute elements of inverse cross-spectrum matrix
+      InvS11 = 1./C11;
+      
+      % compute log-likelihood terms first, all at once does not cancel the
+      % imag part when multiplying x.*conj(x)
+      in1 = in(1).data.getY;
+      f = in(1).data.getX;
+      in2 = in(2).data.getY;
+      out1 = out(1).data.getY;
+      
+      v1v1 = conj(out1 - h11.*in1 - h12.*in2).*(out1 - h11.*in1 - h12.*in2);
+      
+      loglk = sum(InvS11.*v1v1);
+      
+    elseif(numel(out) == 2) % 2 input / 2 output case
+      f = in(1).x;      
+      
+      % evaluate models
+      h11 = model(1).setParams(params,xn).double;
+      h12 = model(2).setParams(params,xn).double;
+      h21 = model(3).setParams(params,xn).double;
+      h22 = model(4).setParams(params,xn).double;
+      
+      % spectra to variance
+      C11 = (N*fs/2)*noise(1).y;
+      C22 = (N*fs/2)*noise(2).y;
+      C12 = (N*fs/2)*noise(3).y;
+      C21 = (N*fs/2)*noise(4).y;
+      
+      % compute elements of inverse cross-spectrum matrix
+      InvS11 = (C22./(C11.*C22 - C12.*C21));
+      InvS22 = (C11./(C11.*C22 - C12.*C21));
+      InvS12 = (C21./(C11.*C22 - C12.*C21));
+      InvS21 = (C12./(C11.*C22 - C12.*C21));
+      
+      % compute log-likelihood terms first, all at once does not cancel the
+      % imag part when multiplying x.*conj(x)
+      in1 = in(1).data.getY;
+      in2 = in(2).data.getY;
+      out1 = out(1).data.getY;
+      out2 = out(2).data.getY;
+      
+      v1v1 = conj(out1 - h11.*in1 - h12.*in2).*(out1 - h11.*in1 - h12.*in2);
+      v2v2 = conj(out2 - h21.*in1 - h22.*in2).*(out2 - h21.*in1 - h22.*in2);
+      v1v2 = conj(out1 - h11.*in1 - h12.*in2).*(out2 - h21.*in1 - h22.*in2);
+      v2v1 = conj(out2 - h21.*in1 - h22.*in2).*(out1 - h11.*in1 - h12.*in2);
+      
+      loglk = sum(InvS11.*v1v1 + InvS22.*v2v2 - InvS12.*v1v2 - InvS21.*v2v1);
+    end
+  end
+  
+end
+