Mercurial > hg > ltpda
diff m-toolbox/test/test_ao_ltp_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/test_ao_ltp_ifo2acc.m Wed Nov 23 19:22:13 2011 +0100 @@ -0,0 +1,371 @@ +% MDC1 Conversion to acceleration +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% Test script for the MDC1 conversion to acceleration of IFO data +% +% $Id: test_ao_ltp_ifo2acc.m,v 1.6 2009/12/10 15:35:38 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)); + +%% Save + +% save(ch1, 'C:\Dati\mock_data\interferometer\mdc1_ch1.mat') +% save(ch2, 'C:\Dati\mock_data\interferometer\mdc1_ch12.mat') + +%% Check data spectra + +ch1xx = ch1.psd; +ch2xx = ch2.psd; +iplot(ch1xx,ch2xx) + +%% Convert to acceleration + +% default settings +[a1,ad] = ltp_ifo2acc(ch1,ch2); + +%% check spectra + +a1xx = a1.psd; +adxx = ad.psd; +iplot(a1xx,adxx) + + +%% ************************************************************************ + +%% Set useful params +% corresponding to default values + +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 + +m1 = 1.96; % TM1 mass +m2 = 1.96; % TM2 mass +msc = 422.7; % SC mass +Gamma = 4.92e-9; % Gravitational gradient + + +%% Do step-by-step Checks + +% get mdc1 ifo noise psd models +currPath = cd; +cd 'C:\Users\Luigi\ltp_data_analysis\MDCs\MDC1_UTN\'; + + +So = matrix([cd '\CSD_mod.mat']); + +cd(currPath) + +% frequency range for TFs calculation +f = So.objs(1,1).x; + +% set units for So +for ii=1:numel(So.objs) + So.objs(ii).setYunits('m^2 Hz^-1'); +end + + +%% Get intermediate steps + +% get just Free Dynamics +[a1fd,adfd] = ltp_ifo2acc(ch1,ch2,plist('Hdf',0,'Hsus',0,'Adf',0,'Asus',0)); + +% get actuated force per unit of mass +[a1c,adc] = ltp_ifo2acc(ch1,ch2,plist('FreeDyn_1',0,'FreeDyn_Delta',0)); + + +%% IFO TFs *** + +% Getting models +IFO11 = smodel('S11'); +IFO11.setParams({'S11'},{S11}); +IFO11.setXvar('f'); +IFO11.setXvals(f); +IFO11.setXunits('Hz'); +IFO11.setName; + +IFO1D = smodel('S1D'); +IFO1D.setParams({'S1D'},{S1D}); +IFO1D.setXvar('f'); +IFO1D.setXvals(f); +IFO1D.setXunits('Hz'); +IFO1D.setName; + +IFOD1 = smodel('SD1'); +IFOD1.setParams({'SD1'},{SD1}); +IFOD1.setXvar('f'); +IFOD1.setXvals(f); +IFOD1.setXunits('Hz'); +IFOD1.setName; + +IFODD = smodel('SDD'); +IFODD.setParams({'SDD'},{SDD}); +IFODD.setXvar('f'); +IFODD.setXvals(f); +IFODD.setXunits('Hz'); +IFODD.setName; + +% Build the matrix +IFO = matrix([IFO11 IFO1D;IFOD1 IFODD]); + + +%% Free Dynamics TFs *** + +% Getting models +FD11 = smodel('(2.*pi.*1i.*f).^2 + (1+m1/msc)*(w1^2) + (m2/msc)*(w2^2)'); +FD11.setParams({'m1','m2','msc','w1','w2'},{m1,m2,msc,w1,w2}); +FD11.setXvar('f'); +FD11.setXvals(f); +FD11.setYunits('s^-2'); +FD11.setXunits('Hz'); +FD11.setName; + +FD12 = smodel('(m2/msc)*(w2^2) + Gamma'); +FD12.setParams({'m2','msc','w2','Gamma'},{m2,msc,w2,Gamma}); +FD12.setXvar('f'); +FD12.setXvals(f); +FD12.setYunits('s^-2'); +FD12.setXunits('Hz'); +FD12.setName; + +FD21 = smodel('(w2^2) - (w1^2)'); +FD21.setParams({'w1','w2'},{w1,w2}); +FD21.setXvar('f'); +FD21.setXvals(f); +FD21.setYunits('s^-2'); +FD21.setXunits('Hz'); +FD21.setName; + +FD22 = smodel('(2.*pi.*1i.*f).^2 + (w2^2) - 2*Gamma'); +FD22.setParams({'w2','Gamma'},{w2,Gamma}); +FD22.setXvar('f'); +FD22.setXvals(f); +FD22.setYunits('s^-2'); +FD22.setXunits('Hz'); +FD22.setName; + +% Build the matrix +FD = matrix([FD11 FD12;FD21 FD22]); + +% Transfer function from IFO output --> total acceleration +FDO = FD*inv(IFO); + +FDO11 = eval(FDO.objs(1,1)); +FDO12 = eval(FDO.objs(1,2)); +FDO21 = eval(FDO.objs(2,1)); +FDO22 = eval(FDO.objs(2,2)); + +FDOe = matrix([FDO11 FDO12;FDO21 FDO22]); + +% expected PSD for total acceleration +Sfd = FDOe*So*conj(transpose(FDOe)); + +% eval results +Sfd11 = (2/fs).*abs(Sfd.objs(1,1)); +Sfd12 = (2/fs).*Sfd.objs(1,2); +Sfd22 = (2/fs).*abs(Sfd.objs(2,2)); + +% get PSD from data +plpsd = plist('nfft',1e5); +Pfd11 = psd(a1fd,plpsd); +Pfd22 = psd(adfd,plpsd); +% plcsd = plist('nfft',5e3); +% Pfd12 = csd(a1fd,adfd,plcsd); + +%% plot +plpl1 = plist('Legends', {'S_{a1a1} data','S_{a1a1}','S_{aDaD} data','S_{aDaD}'},... + 'LineStyles', {'', '--', '', '--'},'LineWidths',{'All',3}); +iplot(sqrt(Pfd11),sqrt(Sfd11),sqrt(Pfd22),sqrt(Sfd22),plpl1) +% iplot(Pfd11,Sfd11,Pfd22,Sfd22,plpl1) + +% plpl2 = plist('Legends', {'S_{a1aD} data','S_{a1aD}'},... +% 'LineStyles', {'', '--'},'LineWidths',{'All',3}); +% iplot(Pfd12,Sfd12,plpl2) + + +%% Controllers TFs *** + +% Get expected transfer functions +Cdf = miir(plist('built-in','DFACS_x_Hdf')); +Cdfr = resp(Cdf,plist('f',f,'bank','parallel')); + +Csus = miir(plist('built-in','DFACS_M3_x_Hsus')); +Csusr = resp(Csus,plist('f',f,'bank','parallel')); + +% Control matrix +H = matrix([Cdfr ao(0);ao(0) Csusr]); + +%% Actuation TFs *** +% 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)); + +% Get expected transfer functions +pl = plist('built-in','mdc1_Adf'); +Adf = miir(pl); +Adfr = resp(Adf,plist('f',f)); + +pl = plist('built-in','mdc1_Asus'); +Asus = miir(pl); +Asusr = resp(Asus,plist('f',f)); + +% Actuation matrix +A = matrix([Adfr ao(0);ao(0) Asusr]); + +%% Get expected spectra and measured + +C = matrix([ao(1) ao(-m2/msc);ao(0) ao(-1)]); +Hnorm = matrix([ao(1/msc) ao(0);ao(0) ao(1/m2)]); +tfc = C*A*Hnorm*H; +for ii =1:numel(tfc.objs) + tfc.objs(ii).setYunits(tfc.objs(ii).yunits/unit('kg')); + tfc.objs(ii).simplifyYunits; +end +Sc = tfc*So*conj(transpose(tfc)); + +% get PSD from data +plpsd = plist('nfft',1e5); +Pc11 = psd(a1c,plpsd); +Pc22 = psd(adc,plpsd); +% plcsd = plist('nfft',5e3); +% Pc12 = csd(a1c,adc,plcsd); + +% plot +plpl1 = plist('Legends', {'S_{a1a1} data','S_{a1a1}','S_{aDaD} data','S_{aDaD}'},... + 'LineStyles', {'', '--', '', '--'},'LineWidths',{'All',3}); +% iplot(Pc11,(2/fs).*abs(Sc.objs(1,1)),Pc22,(2/fs).*abs(Sc.objs(2,2)),plpl1) +iplot(sqrt(Pc11),sqrt((2/fs).*abs(Sc.objs(1,1))),sqrt(Pc22),sqrt((2/fs).*abs(Sc.objs(2,2))),plpl1) + +% plpl2 = plist('Legends', {'S_{a1aD} data','S_{a1aD}'},... +% 'LineStyles', {'', '--'},'LineWidths',{'All',3}); +% iplot(Pc12,Sc.objs(1,2),plpl2) + + +%% Full model of acceleration noise + +TF = FDOe + tfc; +Stot = TF*So*conj(transpose(TF)); + +% plot +plpl = plist('Legends', {'Ch1 data','Ch1','Ch12 data','Ch12'},... + 'LineStyles', {'', '--', '', '--'},'LineWidths',{'All',3}); +iplot(sqrt(a1xx),sqrt((2/fs).*abs(Stot.objs(1,1))),sqrt(adxx),sqrt((2/fs).*abs(Stot.objs(2,2))),plpl) +% iplot(a1xx,(2/fs).*abs(Stot.objs(1,1)),adxx,(2/fs).*abs(Stot.objs(2,2)),plpl) + + + +%% Test with zero input + +nsecs = ch1.nsecs; + +ch1_0 = ao(plist('tsfcn', 'zeros(size(t))', 'fs', 10, 'nsecs', nsecs, 'yunits','m')); +ch2_0 = ao(plist('tsfcn', 'zeros(size(t))', 'fs', 10, 'nsecs', nsecs, 'yunits','m')); + +%% %%% %%% %%% + +[a1_0,ad_0] = ltp_ifo2acc(ch1_0,ch2_0); + +% output must be zero +plpsd = plist('nfft',1e5); +a1_0xx = psd(a1_0,plpsd); +ad_0xx = psd(ad_0,plpsd); + +% plot +plpl = plist('Legends', {'Ch1 data','Ch12 data'},... + 'LineStyles', {'', ''},'LineWidths',{'All',3}); +iplot(sqrt(a1_0xx),sqrt(ad_0xx),plpl) + +%% %%% %%% %%% + +[a1_1,ad_1] = ltp_ifo2acc(ch1,ch2_0); + +TF = FDOe + tfc; +So1 = copy(So,1); +for ii = 2:numel(So1.objs) + So1.objs(ii).setY(zeros(size(So1.objs(ii).x))); +end +Stot1 = TF*So1*conj(transpose(TF)); + +plpsd = plist('nfft',1e5); +a1_1xx = psd(a1_1,plpsd); +ad_1xx = psd(ad_1,plpsd); + +% plot +plpl = plist('Legends', {'Ch1 data','Ch1','Ch12 data','Ch12'},... + 'LineStyles', {'', '--', '', '--'},'LineWidths',{'All',3}); +iplot(sqrt(a1_1xx),sqrt((2/fs).*abs(Stot1.objs(1,1))),sqrt(ad_1xx),sqrt((2/fs).*abs(Stot1.objs(2,2))),plpl) + +%% %%% %%% %%% + +[a1_2,ad_2] = ltp_ifo2acc(ch1_0,ch2); + +TF = FDOe + tfc; +So2 = copy(So,1); +for ii = 1:numel(So2.objs)-1 + So2.objs(ii).setY(zeros(size(So2.objs(ii).x))); +end +Stot2 = TF*So2*conj(transpose(TF)); + +plpsd = plist('nfft',1e5); +a1_2xx = psd(a1_2,plpsd); +ad_2xx = psd(ad_2,plpsd); + +% plot +plpl = plist('Legends', {'Ch1 data','Ch1','Ch12 data','Ch12'},... + 'LineStyles', {'', '--', '', '--'},'LineWidths',{'All',3}); +iplot(sqrt(a1_2xx),sqrt((2/fs).*abs(Stot2.objs(1,1))),sqrt(ad_2xx),sqrt((2/fs).*abs(Stot2.objs(2,2))),plpl) + + + + + + + + + +