При использовании xcorr
в MATLAB для перекрестного сопоставления 2 связанных наборов данных все работает как ожидается - я вижу корреляционный пик и отмеченное сообщение о задержке. Однако, когда я использую xcorr
для перекрестного сопоставления несвязанных наборов данных, где оба набора данных содержат 1 кластер «спайков», я вижу корреляционный пик, и зарегистрированное отставание - это расстояние между двумя шипами.Перекрестные корреляционные данные, содержащие «всплески»
В этом изображении:
x
является случайной последовательности данных. y
также представляет собой случайную серию данных. Оба x
и y
имеют 30 случайных пиков, вставленных в последовательность последовательно. Теоретически не должно быть никакой корреляции между двумя наборами данных, поскольку они оба очень разные. Однако из 3-го графика видно, что существует очень сильная корреляция между двумя наборами данных. Код, используемый для создания этой цифры, находится внизу этой публикации.
Я попытался отфильтровать шипы, используя несколько разных механизмов (скорость вращения rms и т. Д.) Перед выполнением xcorr
. В некоторых случаях это работает, но не все. Я чувствую, что мне нужен другой подход к проблеме, возможно, альтернатива xcorr
. Я понимаю, почему x
и y
перекрестный коррелятор с использованием xcorr
. Есть ли другой инструмент взаимной коррекции, который я могу использовать? Примечание x
и y
никогда не будут точно такими же, они будут только когда-либо примерно такими же, но при нормальной работе это не шипы, которые должны заставить их коррелировать.
Любые предложения о том, как определить, соответствуют ли x
и y
корреляции, а также игнорируя «всплески»?
Вот некоторые мой пример кода:
x = rand(1, 3000);
x = x - 0.5;
y = rand(1, 3000);
y = y - 0.5;
% insert the impulses into the data
impulse_width = 30;
impulse_max_height = 6;
x_impulse_start = 460;
y_impulse_start = 120;
rand_insert_x = rand(1, impulse_width);
rand_insert_x = (rand_insert_x - 0.5) * 2 * impulse_max_height;
rand_insert_y = rand(1, impulse_width);
rand_insert_y = (rand_insert_y - 0.5) * 2 * impulse_max_height;
x(1,x_impulse_start:x_impulse_start + impulse_width - 1) = rand_insert_x;
y(1,y_impulse_start:y_impulse_start + impulse_width - 1) = rand_insert_y;
subplot(3, 1, 1);
plot(x);
ylim([-impulse_max_height impulse_max_height]);
title('random data series: x');
subplot(3, 1, 2);
plot(y);
ylim([-impulse_max_height impulse_max_height]);
title('random data series: y');
[c, l] = xcorr(x, y);
subplot(3, 1, 3);
plot(l, c);
title('correlation using xcorr');
Я вижу, почему это проблема, но если бы я не читал ваше сообщение, я бы подумал: «xcorr» делает хорошую работу, так как он выравнивает эти очень похожие сигналы вместе! –
Я думаю, первым шагом должно быть то, как вы определяете, считается ли «куча данных» всплеском или нет. – rst