% Questa routine calcola le medie (giornaliere o per intervalli definiti) % necessarie per le elaborazioni successive per i TiltLink % ACCdef contiene le medie per l'intervallo definito delle accelerazioni % ARRAYdate contiene le date e il tempo per ogni dato (per media % giornaliera, la data di quel giorno) function [ACCdef_IPL,MAGdef_IPL,ARRAYdateIPL,ACCdefRis_IPL,MAGdefRis_IPL,TempDef_IPL]... = MediaDati_IPL(accIPL,magIPL,TimeIPL,ris_acc_IPL,ris_mag_IPL,tempIPL,tolleranzaAcc,... tolleranzaMag,NdatiMedia,NodoInPlaceLink,MEMS,FileName) fileID = fopen(FileName,'a'); fmt = '%s \r'; text = 'MediaDati_IPL function started'; fprintf(fileID,fmt,text); %% Accelerazione o angoli [r,~] = size(accIPL); if NdatiMedia > r NdatiMedia = r; end ACCdef_IPL = smoothdata(accIPL,'gaussian',NdatiMedia); %% Matrice date ARRAYdateIPL = TimeIPL; %% Risultante acc ACCdefRis_IPL = ris_acc_IPL; % Non faccio la media, mi serve il dato come è per applicare i filtri if MEMS == 1 || MEMS == 2 || strcmp(NodoInPlaceLink(1,4),'g') == 1 % Applico un controllo importante! Se la risultante varia più di 0.01, NON % faccio la media dei dati attorno, che altrimenti ne sono condizionati! [r,c] = size(ACCdefRis_IPL); % Nodi in colonna, date in riga Win = NdatiMedia/2; % Individuo la finestra da NON mediare cont = 0; % Contatore cont2 = 0; for i = 2:r % data for j = 2:c % nodo % se il valore assoluto della differenza è maggiore della % tolleranza, NON faccio la media if abs(ACCdefRis_IPL(i,j)-ACCdefRis_IPL(i-1,j)) > tolleranzaAcc || ACCdefRis_IPL(i,j) < 0.9 || ACCdefRis_IPL(i,j) > 1.1 Sp = i-Win; % Punto di partenza (date) if Sp <= 0 Sp = 1; end if i+Win > r Ep = r; else Ep = i+Win; % Punto di arrivo (date) end Cax = 3*j-2; Cay = 3*j-1; Caz = 3*j; ACCdef_IPL(Sp:Ep,Cax) = accIPL(Sp:Ep,Cax); % ax ACCdef_IPL(Sp:Ep,Cay) = accIPL(Sp:Ep,Cay); % ay ACCdef_IPL(Sp:Ep,Caz) = accIPL(Sp:Ep,Caz); % az cont = cont+1; end end end text = ['' num2str(cont) ' values of In Place Link accelerometer vector of '... 'gravity not subjected to mean process due to values with excessive variations!']; fprintf(fileID,fmt,text); text = ['' num2str(cont2) ' values of In Place Link accelerometer vector of gravity '... 'not subjected to mean process due to not calibrated values!']; fprintf(fileID,fmt,text); %% Campi magnetici MAGdef_IPL = smoothdata(magIPL,'gaussian',NdatiMedia); % Applico un controllo importante! Se la risultante delle accelerazioni % varia più di 0.01, NON faccio la media dei dati di campo magnetico attorno, % che altrimenti ne sono condizionati! [r,c] = size(ACCdefRis_IPL); % Nodi in colonna, date in riga Win = NdatiMedia/2; % Individuo la finestra da NON mediare cont = 0; cont2 = 0; for i = 2:r % data for j = 2:c % nodo % se il valore assoluto della differenza è maggiore della % tolleranza, NON faccio la media if abs(ACCdefRis_IPL(i,j)-ACCdefRis_IPL(i-1,j)) > tolleranzaMag Sp = i-Win; % Punto di partenza (date) if Sp <= 0 Sp = 1; end if i+Win > r Ep = r; else Ep = i+Win; % Punto di arrivo (date) end Cmx = 3*j-2; Cmy = 3*j-1; Cmz = 3*j; MAGdef_IPL(Sp:Ep,Cmx) = magIPL(Sp:Ep,Cmx); % mx MAGdef_IPL(Sp:Ep,Cmy) = magIPL(Sp:Ep,Cmy); % my MAGdef_IPL(Sp:Ep,Cmz) = magIPL(Sp:Ep,Cmz); % mz cont = cont+1; end if ACCdefRis_IPL(i,j) < 0.9 || ACCdefRis_IPL(i,j) > 1.1 % Il nodo è fuori taratura! Sp = i-Win; % Punto di partenza (date) if Sp <= 0 Sp = 1; end if i+Win > r Ep = r; else Ep = i+Win; % Punto di arrivo (date) end Cmx = 3*j-2; Cmy = 3*j-1; Cmz = 3*j; MAGdef_IPL(Sp:Ep,Cmx) = magIPL(Sp:Ep,Cmx); % mx MAGdef_IPL(Sp:Ep,Cmy) = magIPL(Sp:Ep,Cmy); % my MAGdef_IPL(Sp:Ep,Cmz) = magIPL(Sp:Ep,Cmz); % mz cont2 = cont2+1; end end end text = ['' num2str(cont) ' values of In Place Link magnetometer vector not subjected to mean process due to accelerometers values with excessive variations!']; fprintf(fileID,fmt,text); text = ['' num2str(cont2) ' values of In Place Link magnetometer vector of gravity not subjected to mean process due to not calibrated accelerometer values!']; fprintf(fileID,fmt,text); else MAGdef_IPL = []; end %% Risultante campi magnetici MAGdefRis_IPL = ris_mag_IPL; % Non faccio la media, mi serve il dato come è per applicare i filtri %% Temperatura TempDef_IPL = tempIPL; % Non faccio la media, mi serve il dato come è per applicare i filtri text = 'Average mean of In Place Link data executed correctly. MediaDati_IPL function ended'; fprintf(fileID,fmt,text); fclose(fileID); end