x = 1:360;
r = linspace(-pi,pi,numel(x));
fullCurve = exp(3 *(cos(r+pi/4)-1));
idx = 160:200;
segment = fullCurve(idx);
windowStart = 1:numel(fullCurve)-numel(segment)+1;
windowStop = windowStart + numel(segment)-1;
rho = nan(size(windowStart));
lags = 1:numel(windowStart);
sse = rho;
for i = lags
rho(i) = corr(segment', fullCurve(windowStart(i):windowStop(i))');
sse(i) = sum((segment - fullCurve(windowStart(i):windowStop(i))).^2);
end
[~, maxIdx] = max(rho);
figure('Name', 'CrossCorrDemo')
sh(1) = subplot(3,1,1);
title('Full curve and segment')
hold on
plot(x, fullCurve, 'k-','LineWidth', 3)
plot(x(idx), fullCurve(idx), 'r:','LineWidth', 3)
xlim([min(x),max(x)])
grid on
sh(2) = subplot(3,1,2);
title('Animated cross correlation')
hold on
plot(x, fullCurve, 'k-','LineWidth', 3)
segmentLine = plot(nan(size(segment)), segment, 'r:', 'LineWidth', 4);
xlim([min(x),max(x)])
grid on
xl(1) = xline(min(x), 'k--');
xl(2) = xline(min(x), 'k--');
sh(3) = subplot(3,1,3);
title('Correlation')
hold on
xlabel('Lag (shift index value)')
yyaxis left
ylabel('rho')
cor = plot(nan(size(lags)),nan(size(lags)), 'o','MarkerSize',3, 'Color', sh(3).YAxis(1).Color);
xlim([min(x),max(x)])
ylim([min(rho), max(rho)])
yyaxis right
ylabel('SSE')
sseLine = plot(nan(size(lags)), nan(size(lags)), 'o', 'MarkerSize', 3, 'Color', sh(3).YAxis(2).Color);
ylim([min(sse), max(sse)])
grid on
yyaxis left
for i = 1:numel(rho)
segmentLine.XData = lags(i) + (0:numel(segment)-1);
cor.XData(i) = lags(i);
cor.YData(i) = rho(i);
sseLine.XData(i) = lags(i);
sseLine.YData(i) = sse(i);
xl(1).Value = min(segmentLine.XData);
xl(2).Value = max(segmentLine.XData);
if i == maxIdx
plot(sh(2),segmentLine.XData,segment,'m:','LineWidth',3)
xline(sh(3), lags(i), 'k-', lags(i), 'LabelVerticalAlignment', 'middle');
xline(sh(2),min(segmentLine.XData), 'k:','LineWidth',2);
xline(sh(2),max(segmentLine.XData), 'k:','LineWidth',2);
drawnow()
pause(.4)
end
if mod(i,3)==0
drawnow
end
end