Main Content

Align Signals Using Cross-Correlation

Many measurements involve data collected asynchronously by multiple sensors. If you want to integrate the signals and study them in tandem, you have to synchronize them. Use xcorr for that purpose.

For example, consider a car crossing a bridge. The vibrations it produces are measured by three identical sensors located at different spots. The signals have different arrival times.

Load the signals into the MATLAB® workspace and plot them.

load relatedsig

tiledlayout(3,1)

ax(1) = nexttile;
plot(s1)
ylabel("s_1")

ax(2) = nexttile;
plot(s2)
ylabel("s_2")

ax(3) = nexttile;
plot(s3)
ylabel("s_3")
xlabel("Samples")

linkaxes(ax,"x")

Figure contains 3 axes objects. Axes object 1 with ylabel s_1 contains an object of type line. Axes object 2 with ylabel s_2 contains an object of type line. Axes object 3 with xlabel Samples, ylabel s_3 contains an object of type line.

Compute the cross-correlations between the three pairs of signals. Normalize them so their maximum value is 1.

[C21,lag21] = xcorr(s2,s1);
C21 = C21/max(C21);

[C31,lag31] = xcorr(s3,s1);
C31 = C31/max(C31);

[C32,lag32] = xcorr(s3,s2);
C32 = C32/max(C32);

The locations of the maximum values of the cross-correlations indicate time leads or lags.

[M21,I21] = max(C21);
t21 = lag21(I21);

[M31,I31] = max(C31);
t31 = lag31(I31);

[M32,I32] = max(C32);
t32 = lag32(I32);

Plot the cross-correlations. In each plot display the location of the maximum.

tiledlayout(3,1)

nexttile
plot(lag21,C21)
xline(t21,"-","Lag: "+t21,LabelOrientation="horizontal")
ylabel("C_{21}")
title('Cross-Correlations')

nexttile
plot(lag31,C31)
xline(t31,"-","Lag: "+t31,LabelOrientation="horizontal")
ylabel("C_{31}")

nexttile
plot(lag32,C32)
xline(t32,"-","Lag: "+t32,LabelOrientation="horizontal")
ylabel("C_{32}")
xlabel("Samples")

Figure contains 3 axes objects. Axes object 1 with title Cross-Correlations, ylabel C_{21} contains 2 objects of type line, constantline. Axes object 2 with ylabel C_{31} contains 2 objects of type line, constantline. Axes object 3 with xlabel Samples, ylabel C_{32} contains 2 objects of type line, constantline.

s2 leads s1 by 350 samples; s3 lags s1 by 150 samples. Thus s2 leads s3 by 500 samples. Line up the signals by clipping the vectors with longer delays. The signals are now synchronized and ready for further processing.

s1 = s1(-t21:end);
s3 = s3(t32:end);

tiledlayout(3,1)
ax(1) = nexttile;
plot(s1)
ylabel("s_1")

ax(2) = nexttile;
plot(s2)
ylabel("s_2")

ax(3) = nexttile;
plot(s3)
ylabel("s_3")
xlabel("Samples")

linkaxes(ax,"x")

Figure contains 3 axes objects. Axes object 1 with ylabel s_1 contains an object of type line. Axes object 2 with ylabel s_2 contains an object of type line. Axes object 3 with xlabel Samples, ylabel s_3 contains an object of type line.

See Also

| |

Related Topics