diff m-toolbox/test/MDC1/test_mdc1_ifo2acc.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/test/MDC1/test_mdc1_ifo2acc.m	Wed Nov 23 19:22:13 2011 +0100
@@ -0,0 +1,262 @@
+% MDC1 Conversion to acceleration
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+% Test script for the MDC1 conversion to acceleration of IFO data
+% 
+% $Id: test_mdc1_ifo2acc.m,v 1.2 2009/09/24 15:17:36 luigi Exp $
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%% Clear
+
+clear all
+
+%% Loading data
+
+currPath = cd;
+cd 'C:\Users\Luigi\Dati\mock_data\interferometer\';
+
+j=1;
+fs = 10;
+
+disp(sprintf('*** Reading data %d', j));
+in = load(sprintf('mockdata_16_48_17_11_2007_%d.dat', j));
+d1  = in(:,2);
+d12 = in(:,3);
+
+% Build O1
+eval('ts = tsdata(d1, fs);');
+eval(sprintf('o1_%d = ao(ts);', j));
+eval(sprintf('o1_%d = setName(o1_%d, ''o1'');', j, j));
+eval(sprintf('o1_%d = setXunits(o1_%d, ''s'');', j, j));
+eval(sprintf('o1_%d = setYunits(o1_%d, ''m'');', j, j));
+
+% Build O12
+eval('ts = tsdata(d12, fs);');
+eval(sprintf('o12_%d = ao(ts);', j));
+eval(sprintf('o12_%d = setName(o12_%d, ''o12'');', j, j));
+eval(sprintf('o12_%d = setXunits(o12_%d, ''s'');', j, j));
+eval(sprintf('o12_%d = setYunits(o12_%d, ''m'');', j, j));
+
+cd(currPath)
+
+eval(sprintf('ch1 = o1_%d;',j));
+eval(sprintf('ch2 = o12_%d;',j));
+
+%% Check data spectra
+
+ch1xx = ch1.psd;
+ch2xx = ch2.psd;
+iplot(ch1xx,ch2xx)
+
+%% Set useful params
+
+fs = ch1.fs; % Hz - sampling frequency
+
+TAU_th = 0.1; % s - time constant of thrusters actuation
+DELTAT_Th = 0.315; % s - delay introduced to command the force to thrusters system
+
+TAU_el = 0.01; % s - time constant of electrostatic actuation
+DELTAT_el = 0.305; % s - delay introduced to command the force to electrostatic actuators
+
+w1 = 0.00114i; % TM1 stiffness
+w2 = 0.00141i; % TM2 stiffness
+
+S11 = 1; % Calibration of IFO CH1
+S1D = 0; % Cross-talk diff channel to channel 1
+SD1 = -1e-4; % Cross-talk channel 1 to diff channel
+SDD = 1; % Calibration of IFO diff channel
+
+%% Load built in model for Drag Free
+
+pl = plist('built-in','mdc1_Cdf','gain',1);
+Cdf = rational(pl);
+
+%% Load Built in model for Thrusters
+
+pl = plist('built-in','mdc1_actuation','fs',fs,'tau',TAU_th,'DeltaT',DELTAT_Th);
+ThAct = miir(pl);
+
+%% Load built in model for Suspension controller
+
+pl = plist('built-in','mdc1_Csus','gain',1);
+Csus = rational(pl);
+
+%% Load Built in model for Electrostatic actuators
+
+pl = plist('built-in','mdc1_actuation','fs',fs,'tau',TAU_el,'DeltaT',DELTAT_el);
+ElAct = miir(pl);
+
+%% Convert to acceleration
+
+pl = plist('w1',w1,'w2',w2,'S11',S11,'S1D',S1D,'SD1',SD1,'SDD',SDD,...
+  'Cdf',Cdf,'Csus',Csus,'ThAct',ThAct,'ElAct',ElAct,'method','parfit');
+[a1,ad] = ltp_ifo2acc(ch1,ch2,pl);
+
+%% plotting output psd
+
+a1xx = a1.psd;
+adxx = ad.psd;
+iplot(a1xx,adxx)
+
+%% plotting output lpsd
+
+a1xx = a1.lpsd;
+adxx = ad.lpsd;
+iplot(a1xx,adxx,plist('LineWidths',{'All',3}))
+
+%% Do step-by-step Checks
+
+% frequency range for TFs calculation
+f = [logspace(-6,log10(5),300)]';
+
+
+%% Get intermediate steps
+
+%%% IFO2POS conversion
+ifod = S11*SDD - S1D*SD1;
+x1 = (ch1.*SDD - ch2.*S1D)./ifod;
+xd = (ch2.*S11 - ch1.*SD1)./ifod;
+
+
+%%% Free Dynamics
+sw1 = w1^2;
+sw2 = w2^2;
+
+D0COEFF = -3/35;
+D1COEFF = -1/5;
+D2COEFF = 2/7;
+
+pldyn = plist('ALPHA0',sw1,'ALPHA1',0,'ALPHA2',1,...
+  'D0COEFF',D0COEFF,'D1COEFF',D1COEFF,'D2COEFF',D2COEFF,...
+  'X0',0,'TARGETUNITS',x1.yunits./(unit('s').^2));
+a1fd = eqmotion(x1,pldyn);
+
+% Total Differential force per unit of mass
+pldyn = plist('ALPHA0',sw2,'ALPHA1',0,'ALPHA2',1,...
+  'D0COEFF',D0COEFF,'D1COEFF',D1COEFF,'D2COEFF',D2COEFF,...
+  'X0',0,'TARGETUNITS',x1.yunits./(unit('s').^2));
+adfd = eqmotion(xd,pldyn);
+
+% calculate dynamical cross talk
+adct = x1.*(sw2 - sw1);
+adct.setYunits(adfd.yunits);
+
+% Total differential force
+adfd = adfd + adct;
+
+%%% DF Controller
+
+parfrCdf = parfrac(Cdf);
+filtCdf = miir(parfrCdf,plist('FS',fs));
+ac1 = filter(ch1, filtCdf);
+
+%%% Thrusters actuation
+acomm1 = filter(ac1, ThAct);
+
+%%% Sus controller
+parfrCsus = parfrac(Csus);
+filtCsus = miir(parfrCsus,plist('FS',fs));
+acd = filter(ch2, filtCsus);
+
+%%% Electrostatic actuation
+acommd = filter(acd, ElAct);
+
+
+%% Free Dynamics TFs ***
+
+% get transfer functions from data
+tffd1 = ltfe(ch1,a1fd);
+tffd2 = ltfe(ch2,adfd);
+
+% Get expected transfer functions
+FD1 = ao(plist('fsfcn', '(2.*pi.*1i.*f).^2 + -1.3e-6', 'f', f));
+FD2 = ao(plist('fsfcn', '-(-1e-4).*(2.*pi.*1i.*f).^2 + (-2e-6) - (-1.3e-6) - (-1e-4)*(-2e-6) + (2.*pi.*1i.*f).^2 + (-2e-6)', 'f', f));
+
+% plot
+plpl = plist('Legends', {'Dyn ch1','Dyn ch1 data','Dyn ch12','Dyn ch12 data'},...
+  'LineStyles', {'', '--', '', '--'},'LineWidths',{'All',3});
+iplot(abs(FD1),abs(tffd1),abs(FD2),abs(tffd2),plpl)
+
+%% Controllers TFs ***
+
+% get transfer functions from data
+tffd1 = ltfe(ch1,ac1);
+tffd2 = ltfe(ch2,acd);
+
+% Get expected transfer functions
+pl = plist('built-in','mdc1_Cdf','gain',1);
+Cdf = rational(pl);
+Cdfr = resp(Cdf,plist('f',f));
+
+pl = plist('built-in','mdc1_Csus','gain',1);
+Csus = rational(pl);
+Csusr = resp(Csus,plist('f',f));
+
+% plot
+plpl = plist('Legends', {'Cdf','Cdf data','Csus','Csus data'},...
+  'LineStyles', {'', '--', '', '--'},'LineWidths',{'All',3});
+iplot(Cdfr,tffd1,Csusr,tffd2,plpl)
+
+%% Actuation TFs
+
+% get transfer functions from data
+tffd1 = ltfe(ac1,acomm1);
+tffd1.simplifyYunits;
+tffd2 = ltfe(acd,acommd);
+tffd2.simplifyYunits;
+
+% TAU_th = 0.1; % s - time constant of thrusters actuation
+% DELTAT_Th = 0.315; % s - delay introduced to command the force to thrusters system
+% 
+% TAU_el = 0.01; % s - time constant of electrostatic actuation
+% DELTAT_el = 0.305; % s - delay introduced to command the force to electrostatic actuators
+
+% Get expected transfer functions
+ThActr = ao(plist('fsfcn', '10.*(1./(1 + (2.*pi.*1i.*f)*0.1)).*(1./(2.*pi.*1i.*f)).*(exp(-(2.*pi.*1i.*f).*0.315)-exp(-(2.*pi.*1i.*f).*(0.315+0.1)))', 'f', f));
+ElActr = ao(plist('fsfcn', '10.*(1./(1 + (2.*pi.*1i.*f)*0.01)).*(1./(2.*pi.*1i.*f)).*(exp(-(2.*pi.*1i.*f).*0.305)-exp(-(2.*pi.*1i.*f).*(0.305+0.1)))', 'f', f));
+
+% plot
+plpl = plist('Legends', {'Thrusters','Thrusters data','Electrostatic','Electrostatic data'},...
+  'LineStyles', {'', '--', '', '--'},'LineWidths',{'All',3});
+iplot(ThActr,tffd1,ElActr,tffd2,plpl)
+
+
+%% Full model of acceleration noise
+
+% get mdc1 ifo noise psd models
+CSD = get_2D_test_obj_tf_psd(f);
+
+% free dynamics
+FD11 = ao(plist('fsfcn', '(2.*pi.*1i.*f).^2 + -1.3e-6', 'f', f));
+FD21 = ao(plist('fsfcn', '-(-1e-4).*(2.*pi.*1i.*f).^2 + (-2e-6) - (-1.3e-6) - (-1e-4)*(-2e-6)', 'f', f));
+FD22 = ao(plist('fsfcn', '-(-1e-4).*(2.*pi.*1i.*f).^2 + (-2e-6) - (-1.3e-6) - (-1e-4)*(-2e-6) + (2.*pi.*1i.*f).^2 + (-2e-6)', 'f', f));
+
+Cdfr = resp(Cdf,plist('f',f));
+Csusr = resp(Csus,plist('f',f));
+ThActr = ao(plist('fsfcn', '10.*(1./(1 + (2.*pi.*1i.*f)*0.1)).*(1./(2.*pi.*1i.*f)).*(exp(-(2.*pi.*1i.*f).*0.315)-exp(-(2.*pi.*1i.*f).*(0.315+0.1)))', 'f', f));
+ElActr = ao(plist('fsfcn', '10.*(1./(1 + (2.*pi.*1i.*f)*0.01)).*(1./(2.*pi.*1i.*f)).*(exp(-(2.*pi.*1i.*f).*0.305)-exp(-(2.*pi.*1i.*f).*(0.305+0.1)))', 'f', f));
+
+
+TF11 = FD11 + Cdfr.*ThActr;
+
+TF22 = FD22 + Csusr.*ElActr;
+
+Acc1 = (2/fs).*TF11.*CSD(1,1).*conj(TF11);
+Accd = (2/fs).*(FD21.*CSD(2,1).*conj(FD21) + TF22.*CSD(2,2).*conj(TF22));
+
+% plot
+plpl = plist('Legends', {'Ch1 data','Ch1','Ch12 data','Ch12'},...
+  'LineStyles', {'', '--', '', '--'},'LineWidths',{'All',3});
+iplot(a1xx,abs(Acc1),adxx,abs(Accd),plpl)
+
+
+
+
+
+
+
+
+
+
+
+
+
+