diff m-toolbox/classes/+utils/@math/ndeigcsd.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/ndeigcsd.m	Wed Nov 23 19:22:13 2011 +0100
@@ -0,0 +1,173 @@
+% NDEIGCSD calculates TFs from ND cross-correlated spectra.
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%
+% DESCRIPTION:
+%
+%     Calculates TFs or WFs from Ndim cross correlated spectra. Input
+%     elemnts of a cross-spectral matrix in 2D are assumed to be:
+%
+%                / csd11(f)  csd12(f) \
+%      CSD(f) =  |                    |
+%                \ csd21(f)  csd22(f) /
+%
+%
+% CALL:             h = eigcsd(csd,varargin)
+%
+% INPUT:
+%
+%     csd are the elements of the cross spectra matrix. It is a (n,n,m)
+%     matrix where n is the dimensionality of the system and m is the
+%     number of frequency samples
+% 
+%     Input also the parameters specifying calculation options
+%     
+%     'OTP' define the output type. Allowed values are 'TF' output the
+%     transfer functions or 'WF' output the whitening filters frequency
+%     responses. Default 'TF'
+%     'MTD' define the method for the calculation of the csd matrix of a
+%     multichannel system. Admitted values are 'PAP' referring to Papoulis
+%     [1] style calculation in which csd = TF*I*TF' and 'KAY' referring to
+%     Kay [2] style calculation in which csd = conj(TF)*I*TF.'.
+%     Default 'PAP'
+%
+% OUTPUT:
+%
+%     h are the TFs or WFs frequency responses. It is a (n,n,m) matrix in
+%     which n is the dimensionality of the system and m is the number of
+%     frequency samples.
+% 
+% REFERENCES:
+% 
+% [1] A. Papoulis, Probability Random Variable and Stochastic Processes,
+% McGraw-Hill, third edition, 1991.
+% [2] S. M. Kay, Modern Spectral Estimation, Prentice Hall, 1988.
+%
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+% HISTORY:     23-04-2009 L Ferraioli
+%                 Creation
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%
+% VERSION: $Id: ndeigcsd.m,v 1.4 2009/11/06 16:55:51 luigi Exp $
+%
+%
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+function h = ndeigcsd(csd,varargin)
+  
+  [l,m,npts] = size(csd);
+  if m~=l
+    error('!!! The first two dimensions of csd must be equal. csd must be a square matrix frequency by frequency.')
+  end
+  
+  % Finding parameters
+  
+  % default
+  otp = 'TF';
+  mtd = 'PAP';
+  
+  if ~isempty(varargin)
+    for j=1:length(varargin)
+      if strcmp(varargin{j},'OTP')
+        otp = upper(varargin{j+1});
+      end
+      if strcmp(varargin{j},'MTD')
+        mtd = upper(varargin{j+1});
+      end
+    end
+  end
+  
+  % Finding suppression  
+  suppr = ones(l,l);
+  for ii = 2:l
+    k = ones(l,1);  
+    for jj = ii-1:-1:1
+      k(jj) = min(sqrt(csd(jj,jj,:)./csd(ii,ii,:)));
+      if k(jj)>=1
+        suppr(jj,ii) = floor(k(jj));
+      else
+        n=0;
+        while k(jj)<1
+          k(jj)=k(jj)*10;
+          n=n+1;
+        end
+        k(jj) = floor(k(jj));
+        suppr(jj,ii) = k(jj)*10^(-n);
+      end
+    end
+    %     csuppr(ii) = prod(suppr(:,ii));
+  end
+  csuppr = prod(suppr,2);
+  supmat = diag(csuppr);
+  ssup = supmat*supmat.';
+  
+  supmat = rot90(rot90(supmat));
+  isupmat = inv(supmat);
+  
+  % Core Calculation
+  
+  
+  % initializing output dat
+  
+  h = ones(l,m,npts);
+  
+  for phi = 1:npts
+    
+    % Appliing suppression
+    
+    PP = csd(:,:,phi);
+    PP = supmat*PP*supmat;
+    
+%     [V,D] = eig(PP,ssup);
+    [V,D,U] = svd(PP,0);
+%     [V,D] = eig(PP);
+    
+    % Correcting the output of eig
+%     V = fliplr(V);
+%     D = rot90(rot90(D));
+    
+%     % Correcting the output of eig
+%     Vp = fliplr(V);
+%     Lp = rot90(rot90(D));
+%     
+%     % Correcting the phase
+%     [a,b] = size(PP);
+%     for ii=1:b
+%       Vp(:,ii) = Vp(:,ii).*(cos(angle(Vp(ii,ii)))-1i*sin(angle(Vp(ii,ii))));
+%       Vp(ii,ii) = real(Vp(ii,ii));
+%     end
+%     
+%     V = Vp;
+%     D = Lp;
+    
+    
+    % Definition of the transfer functions
+    
+    switch otp
+      case 'TF'
+        switch mtd
+          case 'PAP'
+%             HH = ssup*V*sqrt(D);
+            HH = isupmat*V*sqrt(D);
+%             HH = V*sqrt(D);
+          case 'KAY'
+%             HH = conj(ssup*V*sqrt(D));
+            HH = conj(isupmat*V*sqrt(D));
+%              HH = conj(V*sqrt(D));
+        end
+      case 'WF'
+        switch mtd
+          case 'PAP'
+            %HH = inv(ssup*V*sqrt(D));
+            HH = inv(isupmat*V*sqrt(D));
+          case 'KAY'
+            %HH = inv(conj(ssup*V*sqrt(D)));
+            HH = inv(conj(isupmat*V*sqrt(D)));
+        end
+    end
+    
+    
+    h(:,:,phi) = HH;
+    
+  end
+  
+  
+end
\ No newline at end of file