Mercurial > hg > ltpda
diff m-toolbox/classes/+utils/@math/eigpsd.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/eigpsd.m Wed Nov 23 19:22:13 2011 +0100 @@ -0,0 +1,184 @@ +% EIGPSD calculates TFs from 2D cross-correlated spectra. +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% DESCRIPTION: +% +% Calculates TFs or WFs from 2dim cross correlated spectra +% +% CALL: [h11,h12,h21,h22] = eigpsd(psd1,csd,psd2,varargin) +% +% INPUT: +% +% psd1 is the first power spectral density +% csd is the cross spectrum +% psd2 is the second power spectral density +% Input also the parameters specifying calculation options +% 'USESYM' define the calculation method, allowed values are 0 +% (double precision arithmetic) and 1 (symbolic toolbox variable +% precision arithmetic) +% 'DIG' define the digits used in VPA calculation +% 'OTP' define the output type. Allowed values are 'TF' output the +% transfer functions or 'WF' output the whitening filters frequency +% responses +% +% OUTPUT: +% +% h11, h12, h21 and h22 are the four innovation TFs frequency responses +% or the four whitening filters frequency responses +% +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% HISTORY: 02-10-2008 L Ferraioli +% Creation +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% VERSION: $Id: eigpsd.m,v 1.3 2008/10/24 14:40:20 luigi Exp $ +% +% +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +function [h11,h12,h21,h22] = eigpsd(psd1,csd,psd2,varargin) + + % Init + + S11 = psd1; + S22 = psd2; + S12 = csd; + S21 = conj(S12); + + npts = length(S11); + + % Finding parameters + + % default + usesym = 1; + dig = 50; + otp = 'TF'; + + if ~isempty(varargin) + for j=1:length(varargin) + if strcmp(varargin{j},'USESYM') + usesym = varargin{j+1}; + end + if strcmp(varargin{j},'DIG') + dig = varargin{j+1}; + end + if strcmp(varargin{j},'OTP') + otp = varargin{j+1}; + end + end + end + + % Defining calculation method + if usesym == 1 + method = 'VPA'; + else + method = 'NUM'; + end + + % Finding suppressio + + k = min(sqrt(S11./S22)); + if k>=1 + suppr = floor(k); + else + n=0; + while k<1 + k=k*10; + n=n+1; + end + k = floor(k); + suppr = k*10^(-n); + end + + supmat = [1 0;0 suppr]; + isupmat = [1 0;0 1/suppr]; + + % Core Calculation + + switch method + case 'NUM' + + % initializing output data + h11 = ones(npts,1); + h12 = ones(npts,1); + h21 = ones(npts,1); + h22 = ones(npts,1); + + for phi = 1:npts + + % Appliing suppression + PP = supmat*[S11(phi) S12(phi);S21(phi) S22(phi)]*supmat; + + % Calculate eignevalues Matrix Lp + k = (4*PP(1,2)*PP(2,1))/((PP(1,1)-PP(2,2))^2); + + Lp1 = (PP(1,1)+PP(2,2)+(PP(1,1)-PP(2,2))*sqrt(1+k))/2; + Lp2 = (PP(1,1)+PP(2,2)-(PP(1,1)-PP(2,2))*sqrt(1+k))/2; + + % Calculate eigenvectors Matrix Vp, eigenvectors are on the columns + Vp1 = (-1/sqrt(1+(k/((1+sqrt(1+k))^2))))*[1;2*PP(2,1)/((PP(1,1)-PP(2,2))*(1+sqrt(1+k)))]; + Vp2 = (1/sqrt(1+(((1-sqrt(1+k))^2)/k)))*[(PP(1,1)-PP(2,2))*(1-sqrt(1+k))/(2*PP(2,1));1]; + + % Definition of the transfer functions + switch otp + case 'TF' + HH = isupmat*[conj(Vp1) conj(Vp2)]*[sqrt(Lp1) 0;0 sqrt(Lp2)]; + case 'WF' + HH = [1/sqrt(Lp1) 0;0 1/sqrt(Lp2)]*inv([conj(Vp1) conj(Vp2)])*supmat; + end + + h11(phi,1) = HH(1,1); + h12(phi,1) = HH(1,2); + h21(phi,1) = HH(2,1); + h22(phi,1) = HH(2,2); + + end + + case 'VPA' + % Define the numerical precision + digits(dig) + + % initializing output data + h11 = vpa(ones(npts,1)); + h12 = vpa(ones(npts,1)); + h21 = vpa(ones(npts,1)); + h22 = vpa(ones(npts,1)); + + SS11 = vpa(S11); + SS12 = vpa(S12); + SS21 = vpa(S21); + SS22 = vpa(S22); + + for phi = 1:npts + + % Appliing suppression + PP = supmat*[SS11(phi) SS12(phi);SS21(phi) SS22(phi)]*supmat; + + % Calculate eignevalues Matrix Lp + k = (4*PP(1,2)*PP(2,1))/((PP(1,1)-PP(2,2))^2); + + Lp1 = (PP(1,1)+PP(2,2)+(PP(1,1)-PP(2,2))*sqrt(1+k))/2; + Lp2 = (PP(1,1)+PP(2,2)-(PP(1,1)-PP(2,2))*sqrt(1+k))/2; + + % Calculate eigenvectors Matrix Vp, eigenvectors are on the columns + Vp1 = (-1/sqrt(1+(k/((1+sqrt(1+k))^2))))*[1;2*PP(2,1)/((PP(1,1)-PP(2,2))*(1+sqrt(1+k)))]; + Vp2 = (1/sqrt(1+(((1-sqrt(1+k))^2)/k)))*[(PP(1,1)-PP(2,2))*(1-sqrt(1+k))/(2*PP(2,1));1]; + + % Definition of the transfer functions + switch otp + case 'TF' + HH = isupmat*[conj(Vp1) conj(Vp2)]*[sqrt(Lp1) 0;0 sqrt(Lp2)]; + case 'WF' + HH = [1/sqrt(Lp1) 0;0 1/sqrt(Lp2)]*inv([conj(Vp1) conj(Vp2)])*supmat; + end + + h11(phi,1) = HH(1,1); + h12(phi,1) = HH(1,2); + h21(phi,1) = HH(2,1); + h22(phi,1) = HH(2,2); + + end + h11 = double(h11); + h12 = double(h12); + h21 = double(h21); + h22 = double(h22); + end \ No newline at end of file