%% Funzione che calcola gli spostamenti in modalità biassiale per i % Tilt Link HR (ampolle) function [X_IPL,Y_IPL,Z_IPL,Xlocal_IPL,Ylocal_IPL,Zlocal_IPL,HShift_IPL,HShift_local_IPL,... AlfaX_IPL,AlfaY_IPL,Azimuth_IPL,Speed_local_IPL,Speed_IPL,Acceleration_local_IPL,... Acceleration_IPL,TempDef_IPL,ARRAYdateIPL,ErrInPlaceLink] = biax_IPL(IDcentralina,... DTcatena,rIPL,ACCdef_IPL,TempDef_IPL,SpeIPL,PsIPL,NodoInPlaceLink,tolleranzaAcc,... DatiElabInPlaceLink,segnoNS,segnoEO,MEMS,Ndevst,Wdevst,ARRAYdateIPL,NuovoZeroIPL,... Tmax,Tmin,NdatiMedia,Ndatidespike,ErrInPlaceLink,Corr_Azimuth,Inverti,margine,datainiIPL,FileName) %% Inizializzazione fileID = fopen(FileName,'a'); fmt = '%s \r'; text = 'biax_IPL function started'; fprintf(fileID,fmt,text); if NuovoZeroIPL == 1 if NdatiMedia > Ndatidespike Ndati = NdatiMedia; else Ndati = Ndatidespike; end ini = round(Ndati/2)+1; if rem(Ndati,2) == 0 ini = ini+1; end clear NDati ini = ini + margine; if ini < 6 ini = 6; end if Ndevst ~= 0 % Allora prendo tutti i dati e solo in seguito considero i nuovi, a valle della funzione filtro ini = 1; end ACCdef_IPL = ACCdef_IPL(ini:end,:); TempDef_IPL = TempDef_IPL(ini:end,:); DatiElabInPlaceLink = DatiElabInPlaceLink(ini:end,:); ARRAYdateIPL = ARRAYdateIPL(ini:end,1); ErrInPlaceLink = ErrInPlaceLink(ini:end,:); end % Definisco i dati [Ndate,~] = size(ARRAYdateIPL); Nnodi = rIPL; AngoloX = zeros(Ndate,Nnodi); % angoli di inclinazione asse X AngoloY = zeros(Ndate,Nnodi); % angoli di inclinazione asse Y defZ = zeros(Ndate,Nnodi); % posizione del sensore all'interno del suo metro SpeIPL = SpeIPL(2:end,1); % salto il segmento di pertinenza dell'ancora if Inverti == 0 ii = 1; else ii = 3*rIPL; end for i=1:Nnodi if Inverti == 1 AngoloX(:,i) = ACCdef_IPL(:,ii-2); % ax AngoloY(:,i) = ACCdef_IPL(:,ii-1);% ay defZ(:,i) = ACCdef_IPL(:,ii);% ay SpeIPL = flipud(SpeIPL); PsIPL(2:end) = flipud(PsIPL(2:end)); TempDef_IPL = flipud(TempDef_IPL'); ii = ii-3; else AngoloX(:,i) = ACCdef_IPL(:,ii); % ax AngoloY(:,i) = ACCdef_IPL(:,ii+1);% ay defZ(:,i) = ACCdef_IPL(:,ii+2);% ay TempDef_IPL = TempDef_IPL'; ii = ii+3; end end AngoloX = AngoloX'; AngoloY = AngoloY'; defZ = defZ'; %% Costruzione delle matrici spostamento e rotazione sX = zeros(rIPL,Ndate); % in riga i nodi, in colonna le date sY = zeros(rIPL,Ndate); sZ = zeros(rIPL,Ndate); % Inizio del ciclo di elaborazione text = 'Elaboration of In Place Link started'; fprintf(fileID,fmt,text); for d = 1:Ndate % date for n=1:Nnodi % nodi if strcmp(NodoInPlaceLink(1,4),'0-10 V') == 1 % angolo di inclinazione rispetto all'orizzontale registrato da asse x xAng = AngoloX(n,d); % angolo di inclinazione rispetto all'orizzontale registrato da asse y yAng = AngoloY(n,d); % converto gli angoli in radianti (matlab ragiona così) xAng = deg2rad(xAng); yAng = deg2rad(yAng); % calcolo spostamenti lungo x e y sX(n,d) = SpeIPL(n)*sin(xAng); sY(n,d) = SpeIPL(n)*sin(yAng); % Calcolo l'abbassamento sZ(n,d) = defZ(n,d)/1000; % m end end end % dsX, dsY e dsZ raccolgono i dati del singolo nodo nella singola data dsX = diff(sX,1,2); dsY = diff(sY,1,2); dsZ = diff(sZ,1,2); %% Cambio di segno le direzioni! if segnoNS == 0 dsX= -1*dsX; end if segnoEO == 0 dsY = -1*dsY; end %% Filtro su temperatura clear i clear j cont2 = 1; % contatore textT = 'There are not correction of Tilt Link HR V based on temperature filter'; FileTemperature = ['' IDcentralina '-' DTcatena '-TLHR-Therm.csv']; if isfile(FileTemperature) == 1 DatiRaw = csvread(FileTemperature); [rDR,cDR] = size(DatiRaw); DatiRaw(:,1) = DatiRaw(:,1) + 730000; else rDR = 1; cDR = 1; end for j = 1:Ndate % Data for i = 1:Nnodi % Nodo % NON considero i dati al di sopra di Tmax o al di sotto di Tmin if TempDef_IPL(i,j) > Tmax || TempDef_IPL(i,j) < Tmin cont2 = cont2+1; if j == 1 if isfile(FileTemperature) == 1 RawDate = find(DatiRaw(:,1)<=datenum(datainiIPL)); if isempty(RawDate) == 1 cc = 2; while cc <= Ndate if TempDef_IPL(i,cc) > Tmax || TempDef_IPL(i,cc) < Tmin cc = cc+1; else break end end TempDef_IPL(i,j) = TempDef_IPL(i,cc); else if isnan(DatiRaw(RawDate(end),i+1)) == 0 TempDef_IPL(i,j) = DatiRaw(RawDate(end),i+1); ErrInPlaceLink(j,i) = 0.5; wardat = 'Temperature data of In Place Link nodes corrected using Raw Data of reference Csv file.'; fprintf(fileID,fmt,wardat); else cc = 2; while cc <= c if TempDef_IPL(i,cc) > Tmax || TempDef_IPL(i,cc) < Tmin cc = cc+1; else break end end TempDef_IPL(i,j) = TempDef_IPL(i,cc); end end else cc = 2; while cc <= c if TempDef_IPL(i,cc) > Tmax || TempDef_IPL(i,cc) < Tmin cc = cc+1; else break end end TempDef_IPL(i,j) = TempDef_IPL(i,cc); end else dsX(i,j-1) = 0; dsY(i,j-1) = 0; dsZ(i,j-1) = 0; TempDef_IPL(i,j) = TempDef_IPL(i,j-1); ErrInPlaceLink(j,i) = 0.5; end end textT = ['' num2str(cont2) ' correction executed for In Place Link - Temperature filter!']; end end if rDR~=1 && cDR~=1 && isempty(DatiRaw) == 0 RawDate1 = find(DatiRaw(:,1)<=ARRAYdateIPL(1)); if isempty(RawDate1) == 1 RawDate2 = 1; elseif RawDate1(end) == rDR RawDate2 = find(ARRAYdateIPL(:,1)>DatiRaw(end,1)); else RawDate2 = find(ARRAYdateIPL(:,1)>DatiRaw(RawDate1(end)+1,1)); end else RawDate1 = []; RawDate2 = 1; end if isempty(RawDate1) == 0 && isempty(RawDate2) == 0 Dati = [DatiRaw(1:RawDate1(end),:); ARRAYdateIPL(RawDate2(1):end) TempDef_IPL(:,RawDate2(1):end)']; elseif isempty(RawDate1) == 1 && isempty(RawDate2) == 0 Dati = [ARRAYdateIPL TempDef_IPL']; else Dati = DatiRaw; end % Elimino appoggio più vecchio di un mese RawDate3 = find(Dati(:,1) Ndatidespike NdatiF = NdatiMedia; else NdatiF = Ndatidespike; end ini = round(NdatiF/2)+1; if rem(NdatiF,2) == 0 ini = ini+1; end clear NDatiF iniST = round(Wdevst/2); if rem(Wdevst,2) == 0 iniST = iniST+1; end iniST = iniST + margine; if iniST > ini ini = iniST; end if ini < 6 ini = 6; end dsX = dsX(:,ini:end); dsY = dsY(:,ini:end); dsZ = dsZ(:,ini:end); TempDef_IPL = TempDef_IPL(ini:end,:); DatiElabInPlaceLink = DatiElabInPlaceLink(ini:end,:); ARRAYdateIPL = ARRAYdateIPL(ini:end,1); ErrInPlaceLink = ErrInPlaceLink(ini:end,:); end %% Finalizzo i calcoli [rX,cX] = size(dsX); sommaX = zeros(rIPL,1); Xlocal_IPL = zeros(rX,cX+1); % totale del singolo nodo data per data AlfaX_IPL = zeros(rX,cX+1); % Angoli sommaY = zeros(rIPL,1); Ylocal_IPL = zeros(rX,cX+1); AlfaY_IPL = zeros(rX,cX+1); % Angoli sommaZ = zeros(rX,cX+1); Zlocal_IPL = zeros(rX,cX+1); X_IPL = zeros(rX,cX+1); % cumulata del singolo nodo data per data Y_IPL = zeros(rX,cX+1); % il primo valore è 0 Z_IPL = zeros(rX,cX+1); HShift_IPL = zeros(rX,cX+1); HShift_local_IPL = zeros(rX,cX+1); Azimuth_IPL = zeros(rX,cX+1); azim_HR = zeros(rX,cX+1); % matrice di appoggio per il calcolo dell'azimuth Speed_IPL = zeros(rIPL,cX+1); % Velocità 2D Cumulata Speed_local_IPL = zeros(rIPL,cX+1); % Velocità 2D locale Acceleration_IPL = zeros(rIPL,cX+1); % Accelerazione 2D Cumulata Acceleration_local_IPL = zeros(rIPL,cX+1); % Accelerazione 2D Locale % Recupero i dati già elaborati if NuovoZeroIPL == 1 [rE,cE] = size(DatiElabInPlaceLink); cont = 3; n = 1; while cont<=cE if Inverti == 1 sommaX(n,1) = cell2mat(DatiElabInPlaceLink(1,end-cont-10))'; X_IPL(n,1) = cell2mat(DatiElabInPlaceLink(1,end-cont-7))'; sommaY(n,1) = cell2mat(DatiElabInPlaceLink(1,end-cont-9))'; Y_IPL(n,1) = cell2mat(DatiElabInPlaceLink(1,end-cont-6))'; Zlocal_IPL(n,1) = cell2mat(DatiElabInPlaceLink(1,end-cont-8))'; Z_IPL(n,1) = cell2mat(DatiElabInPlaceLink(1,end-cont-5))'; HShift_IPL(n,1) = cell2mat(DatiElabInPlaceLink(1,end-cont-4))'; HShift_local_IPL(n,1) = cell2mat(DatiElabInPlaceLink(1,end-cont-3))'; Azimuth_IPL(n,1) = cell2mat(DatiElabInPlaceLink(1,end-cont-2))'; Speed_IPL(n,1:rE) = cell2mat(DatiElabInPlaceLink(:,end-cont))'; Speed_local_IPL(n,1:rE) = cell2mat(DatiElabInPlaceLink(:,end-cont+1))'; Acceleration_IPL(n,1:rE) = cell2mat(DatiElabInPlaceLink(:,end-cont+2))'; Acceleration_local_IPL(n,1:rE) = cell2mat(DatiElabInPlaceLink(:,end-cont+3))'; else sommaX(n,1) = cell2mat(DatiElabInPlaceLink(1,cont))'; X_IPL(n,1) = cell2mat(DatiElabInPlaceLink(1,cont+3))'; sommaY(n,1) = cell2mat(DatiElabInPlaceLink(1,cont+1))'; Y_IPL(n,1) = cell2mat(DatiElabInPlaceLink(1,cont+4))'; Zlocal_IPL(n,1) = cell2mat(DatiElabInPlaceLink(1,cont+2))'; Z_IPL(n,1) = cell2mat(DatiElabInPlaceLink(1,cont+5))'; HShift_IPL(n,1) = cell2mat(DatiElabInPlaceLink(1,cont+6))'; HShift_local_IPL(n,1) = cell2mat(DatiElabInPlaceLink(1,cont+7))'; Azimuth_IPL(n,1) = cell2mat(DatiElabInPlaceLink(1,cont+8))'; Speed_IPL(n,1:rE) = cell2mat(DatiElabInPlaceLink(:,cont+10))'; Speed_local_IPL(n,1:rE) = cell2mat(DatiElabInPlaceLink(:,cont+11))'; Acceleration_IPL(n,1:rE) = cell2mat(DatiElabInPlaceLink(:,cont+12))'; Acceleration_local_IPL(n,1:rE) = cell2mat(DatiElabInPlaceLink(:,cont+13))'; end Xlocal_IPL(n,1) = sommaX(n,1); Ylocal_IPL(n,1) = sommaY(n,1); for j = 1:rIPL AlfaX_IPL(j,1) = asind(Xlocal_IPL(j,1)/SpeIPL(j)); AlfaY_IPL(j,1) = asind(Ylocal_IPL(j,1)/SpeIPL(j)); end sommaZ(n,1) = SpeIPL(n,1)-Zlocal_IPL(n,1); % Verifica cont=cont+16; n = n+1; end else Zlocal_IPL(:,1) = SpeIPL; Z_IPL(:,1) = PsIPL(2:end); end % elaboro i dati nuovi for iii = 1:cX Xlocal_IPL(:,iii+1) = sum(dsX(:,1:iii),2)+sommaX(:,1); Ylocal_IPL(:,iii+1) = sum(dsY(:,1:iii),2)+sommaY(:,1); for j = 1:rIPL AlfaX_IPL(j,iii+1) = asind(Xlocal_IPL(j,iii+1)/SpeIPL(j)); AlfaY_IPL(j,iii+1) = asind(Ylocal_IPL(j,iii+1)/SpeIPL(j)); end sommaZ(:,iii+1) = sum(dsZ(:,1:iii),2); X_IPL(:,iii+1) = cumsum(Xlocal_IPL(:,iii+1)); Y_IPL(:,iii+1) = cumsum(Ylocal_IPL(:,iii+1)); Z_IPL(:,iii+1) = Z_IPL(:,1) + cumsum(sommaZ(:,iii+1)); % Calcolo con gli anelli magnetici HShift_IPL(:,iii+1) = (X_IPL(:,iii+1).^2+Y_IPL(:,iii+1).^2).^0.5; HShift_local_IPL(:,iii+1) = (Xlocal_IPL(:,iii+1).^2+Ylocal_IPL(:,iii+1).^2).^0.5; Zlocal_IPL(:,iii+1) = SpeIPL(:,1)+sommaZ(:,iii+1); % Zeta è il singolo abbassamento di quel nodo for rr = 1:rIPL azim_HR(rr,iii) = (acos(abs(X_IPL(rr,iii))/HShift_IPL(rr,iii)))*180/3.141592654; % Angolo Teta in gradi 0° - 90° segnoNS = sign(X_IPL(rr,iii)); segnoEO = sign(Y_IPL(rr,iii)); % L'azimuth si calcola con NS = 0, positivo in senso orario % (90° = Est) if segnoNS == 1 && segnoEO == 1 % quadrante 1 Azimuth_IPL(rr,iii+1) = azim_HR(rr,iii); % Teta lo tengo come è (1 quadrante) elseif segnoNS == -1 && segnoEO == 1 % quadrante 2 Azimuth_IPL(rr,iii+1) = 180 - azim_HR(rr,iii); % 180-teta elseif segnoNS == -1 && segnoEO == -1 % quadrante 3 Azimuth_IPL(rr,iii+1) = 180 + azim_HR(rr,iii); % 180+teta elseif segnoNS == 1 && segnoEO == -1 % quadrante 4 Azimuth_IPL(rr,iii+1) = 360 - azim_HR(rr,iii); % 360-teta elseif segnoNS == 0 && segnoEO == -1 % 270° Azimuth_IPL(rr,iii+1) = 270; elseif segnoNS == -1 && segnoEO == 0 % 180° Azimuth_IPL(rr,iii+1) = 180; end end end [rAz,cAz] = size(Azimuth_IPL); for n=1:rAz for c=2:cAz Azimuth_IPL(n,c) = real(Azimuth_IPL(n,c))+Corr_Azimuth; if Azimuth_IPL(n,c)>=360 Azimuth_IPL(n,c)=Azimuth_IPL(n,c)-360; end end end %% Calcolo velocità di spostamento giornaliera [numDate,~] = size(ARRAYdateIPL); % numero di date d = 1; p = 1; diffDate = 0; n = 1; period = 1; % calcolo giornaliero ContSUP = []; for dd = 1:numDate while diffDate < period d = d+1; if d > numDate % Se d supera le date disponibili, esco dal ciclo while break end diffDate = ARRAYdateIPL(d) - ARRAYdateIPL(p); end if d >numDate break end ContSUP(n,1) = d; % Creo matrice indici dell'estremo superiore della differenza ContINF(n,1) = p; % Creo matrice indici dell'estremo inferiore della differenza p = p+1; % passo alla data di partenza successiva d = p; % resetto il conto di d n = n+1; diffDate = 0; end check = isempty(ContSUP); if check == 0 [nDate,~] = size(ContSUP); for s = 1:rIPL N = 1; for dd = 1:nDate Speed_IPL(s,ContSUP(N,1)) = (HShift_IPL(s,ContSUP(N,1))-HShift_IPL(s,ContINF(N,1)))/(ARRAYdateIPL(ContSUP(N,1))-ARRAYdateIPL(ContINF(N,1))); Speed_local_IPL(s,ContSUP(N,1)) = (HShift_local_IPL(s,ContSUP(N,1))-HShift_local_IPL(s,ContINF(N,1)))/(ARRAYdateIPL(ContSUP(N,1))-ARRAYdateIPL(ContINF(N,1))); Acceleration_IPL(s,ContSUP(N,1)) = (Speed_IPL(s,ContSUP(N,1))-Speed_IPL(s,ContINF(N,1)))/(ARRAYdateIPL(ContSUP(N,1))-ARRAYdateIPL(ContINF(N,1))); Acceleration_local_IPL(s,ContSUP(N,1)) = (Speed_local_IPL(s,ContSUP(N,1))-Speed_local_IPL(s,ContINF(N,1)))/(ARRAYdateIPL(ContSUP(N,1))-ARRAYdateIPL(ContINF(N,1))); N = N+1; end end end % Approssimo i dati con il corretto numero di cifre decimali [X_IPL,Y_IPL,Z_IPL,Xlocal_IPL,Ylocal_IPL,Zlocal_IPL,HShift_IPL,... HShift_local_IPL,Azimuth_IPL,Speed_IPL,Speed_local_IPL,Acceleration_IPL,... Acceleration_local_IPL,TempDef_IPL] = approx(X_IPL,Y_IPL,Z_IPL,... Xlocal_IPL,Ylocal_IPL,Zlocal_IPL,HShift_IPL,HShift_local_IPL,Azimuth_IPL,... Speed_IPL,Speed_local_IPL,Acceleration_IPL,Acceleration_local_IPL,TempDef_IPL,FileName); % Riordino matrice errori [r,~] = size(ErrInPlaceLink); Matrice_err = zeros(r,rIPL); if strcmp(NodoInPlaceLink(1,4),'0-10 V') == 1 par = 3; else par = 7; end for i = 1:r % date d = 1; for n = 1:rIPL % nodi j = 1; err = ErrInPlaceLink(i,d:d+par-1); while j <= par if err(1,j) == 1 Matrice_err(i,n) = 1; break end if err(1,j) == 0.5 Matrice_err(i,n) = 0.5; end j = j+1; end d = d+par; end end ErrInPlaceLink = Matrice_err'; if Inverti == 1 X_IPL = flipud(X_IPL); Y_IPL = flipud(Y_IPL); Z_IPL = flipud(Z_IPL); Xlocal_IPL = flipud(Xlocal_IPL); Ylocal_IPL = flipud(Ylocal_IPL); Zlocal_IPL = flipud(Zlocal_IPL); HShift_IPL = flipud(HShift_IPL); HShift_local_IPL = flipud(HShift_local_IPL); Azimuth_IPL = flipud(Azimuth_IPL); Speed_local_IPL = flipud(Speed_local_IPL); Speed_IPL = flipud(Speed_IPL); Acceleration_local_IPL = flipud(Acceleration_local_IPL); Acceleration_IPL = flipud(Acceleration_IPL); AlfaX_IPL = flipud(AlfaX_IPL); AlfaY_IPL = flipud(AlfaY_IPL); TempDef_IPL = flipud(TempDef_IPL); end text = 'In Place Link calculation executed correctly'; fileID = fopen(FileName,'a'); fmt = '%s \r'; fprintf(fileID,fmt,text); fclose(fileID); end