Synchronising two different signals

41 views (last 30 days)
Hello,
I am quite new to signal processing and I am trying my best to synchronize and align two signals that come from different devices.
One has a sample rate of 50 Hz and is recording acceleration with 3 axis (x, y and z). The other is recording ECG at 250Hz.
I have time marks of when both devices are turned on and off (which is different by max 10-20 seconds). Both seems to have 'time-drift', meaning that when looking at the data size, it never perfectly equals the size of Time*SampleRate. And even after resampling the 250Hz signal at 50Hz both data sizes have a small difference.
I have been trying different methods to align those signals but there is always a little delay between the two of them and I don't know what to do. I tried removing the time drift, synchronizing them with time-series, even the cross-correlation (even though I am not sure this can work since one of my signal has 3 axis)… Nothing seems to work.
So is there a way to know if there is major problem in one of the signals ?
Or is there another way of aligning/synchronizing those signals ?
I linked the two unfiltered signals.
Thanks,
Marine
  2 Comments
Star Strider
Star Strider on 15 Oct 2022
What are we to do with these?
Uz = unzip('https://www.mathworks.com/matlabcentral/answers/uploaded_files/1157478/Data.zip')
Uz = 1×8 cell array
{'Data/'} {'__MACOSX/._Data'} {'Data/.DS_Store'} {'__MACOSX/Data/._.DS_Store'} {'Data/ECG.csv'} {'__MACOSX/Data/._ECG.csv'} {'Data/Acceleration.csv'} {'__MACOSX/Data/._Acceleration.csv'}
EKG = readtable(Uz{5})
EKG = 904000×1 table
ECG_DATA ________ 680 1372 1740 1774 1805 1832 1853 1870 1883 1889 1884 1870 1850 1832 1815 1800
Acc = readtable(Uz{7})
Acc = 181412×18 table
Var1 Var2 Var3 Var4 Var5 Var6 Var7 Var8 Var9 Var10 Var11 Var12 Var13 Var14 Var15 Var16 Var17 Var18 ____ ____ _____ ____ ____ ____ ____ ____ ____ ______________________ _____ _____ _____ ______ _____ _____ _____ _____ -106 -203 -1969 -157 151 -17 -32 54 -178 {0×0 char } NaN NaN NaN NaN NaN NaN NaN NaN 18 -87 -2052 -169 159 -17 -230 309 -296 {0×0 char } NaN NaN NaN NaN NaN NaN NaN NaN 129 -13 -2062 -169 151 -13 -140 245 -250 {0×0 char } NaN NaN NaN NaN NaN NaN NaN NaN 108 -85 -2073 -159 149 -23 -93 166 -129 {0×0 char } NaN NaN NaN NaN NaN NaN NaN NaN 66 -152 -2119 -169 149 -15 47 89 -143 {0×0 char } NaN NaN NaN NaN NaN NaN NaN NaN 81 -114 -2010 -165 145 -11 116 4 -155 {0×0 char } NaN NaN NaN NaN NaN NaN NaN NaN 59 -109 -2118 -170 148 -26 68 77 -144 {0×0 char } NaN NaN NaN NaN NaN NaN NaN NaN 154 -53 -1999 -163 143 -25 189 -35 -117 {0×0 char } NaN NaN NaN NaN NaN NaN NaN NaN 125 12 -1975 -158 156 -26 221 -132 56 {0×0 char } NaN NaN NaN NaN NaN NaN NaN NaN 9 -110 -2064 -162 142 -20 220 -267 108 {'22-10-11T09:55:47Z'} 105 266 236 1016.5 0.06 25.17 0 4.1 -59 -226 -1893 -162 152 -26 220 -182 78 {0×0 char } NaN NaN NaN NaN NaN NaN NaN NaN -107 -329 -2100 -160 152 -22 -321 271 -124 {0×0 char } NaN NaN NaN NaN NaN NaN NaN NaN 13 -156 -2148 -158 154 -28 -371 359 -235 {0×0 char } NaN NaN NaN NaN NaN NaN NaN NaN 197 -5 -2076 -166 154 -26 -249 290 -205 {0×0 char } NaN NaN NaN NaN NaN NaN NaN NaN 175 -65 -2140 -162 154 -22 21 32 -70 {0×0 char } NaN NaN NaN NaN NaN NaN NaN NaN 84 -178 -1973 -159 141 -27 201 -198 -47 {0×0 char } NaN NaN NaN NaN NaN NaN NaN NaN
Just looking at them, I have no idea.
.
Marpe
Marpe on 15 Oct 2022
Yes sorry I forgot to share my code. This one of my trial to better understand.

Sign in to comment.

Accepted Answer

Star Strider
Star Strider on 15 Oct 2022
I got this far, however I have no idea what you want to do with them at this point —
% clear
% close all
% datapathECG = %Data path;
% dECG = dir(datapathECG);
% nd = length(dir);
Uz = unzip('https://www.mathworks.com/matlabcentral/answers/uploaded_files/1157478/Data.zip');
% EKG = readtable(Uz{5})
% Acc = readtable(Uz{7})
%ECG data
for n=10
% file=[datapathECG,dECG(n).name];
% tbl = readtable(file);
tbl = readtable(Uz{5});
ecg=table2array(tbl);
[~,~]=size(ecg);
Fs1 = 250;
%Resampling of ECG from 250Hz to 50Hz
ecg=resample(ecg,50,Fs1);
[Necg,~]=size(ecg);
end
%Acceleration data
% close all
% datapathAcc= % Data path to data files
% dAcc=dir(datapathAcc);
% nd=length(dir);
for n=5
% file=[datapathAcc,dAcc(n).name];
% tbl = readtable(file);
tbl = readtable(Uz{7});
acctab=tbl(:,1:3);
Tacc=tbl(:,10);
acctab = table2array(acctab);
[Nacc,dum]=size(acctab);
Fs2=50;
end
%Remove drift in both
%ECG
StartECG = datetime(2022,10,11,07,56,40,'TimeZone','UTC');
StartECG.Format = 'hh:mm:ss';
Stop = datetime(2022,10,11,08,57,10,'TimeZone','UTC');
Stop.Format = 'hh:mm:ss';
Fs = 50;
Time = seconds(Stop - StartECG);
Nth = (Time.*Fs);
drift = Nth - Necg;
drift = drift/Fs;
drift = Nth/drift;
drift1 = round(drift/Fs);
ecg(drift1:drift1:end,:) = [];
[Necg,d]=size(ecg);
%Acceleration
DT = datetime(Tacc.Var10, 'InputFormat','yy-MM-dd''T''HHH:mm:ss''Z''','TimeZone','UTC');
DT.Format = 'hh:mm:ss';
DTnew = fillmissing(DT,'linear');
StartR = DTnew(1,1);
disp('Real = ');
Real =
disp(StartR);
09:55:47
StartR = datetime(StartR,"TimeZone","UTC");
StartR.Format = 'hh:mm:ss';
%Have to change everytime
StartTH = datetime(2022,10,11,07,55,20,'TimeZone','UTC');
StartTH.Format = 'hh:mm:ss';
disp('Theory = ');
Theory =
disp(StartTH);
07:55:20
delay = abs(StartR - StartTH);
StartACC = StartR - delay;
Stop = datetime(2022,10,11,08,56,10,'TimeZone','UTC');
Stop.Format = 'hh:mm:ss';
Fs = 50;
Time = seconds(Stop - StartACC);
Nth = (Time.*Fs);
drift = Nth - Nacc;
drift = drift/Fs;
drift = Nth/drift;
drift2 = round(drift/Fs);
acctab(drift2:drift2:end,:) = [];
[Nacc,d]=size(acctab);
%Time for ECG
time=StartECG;
time.Format= 'hh:mm:ss';
s1=seconds(1/Fs2:1/Fs2:Necg/Fs2);
T=time+s1;
Tecg = timetable(T',ecg);
%Time for Acceleration data
time=StartACC;
time.Format= 'hh:mm:ss';
s1=seconds(1/Fs2:1/Fs2:Nacc/Fs2);
T=time+s1;
Tacc = timetable(T',acctab);
TT = synchronize(Tecg,Tacc,"union","nearest");
stackedplot(TT.Time,TT.Variables);
Or, to put it differently, I do not see a problem. You have several different signals all sharing the same time vector. (I have no idea what they refer to, or what you want to wo with them.)
.
  6 Comments
Marpe
Marpe on 15 Oct 2022
Thank you very much for your help !

Sign in to comment.

More Answers (0)

Categories

Find more on EEG/MEG/ECoG in Help Center and File Exchange

Community Treasure Hunt

Find the treasures in MATLAB Central and discover how the community can help you!

Start Hunting!