Matlab xcorr дает разные значения для разных реализаций кросс-корреляции

Я пытаюсь выполнить взаимную корреляцию, но заметил, что выполнение этого двумя разными способами приводит к несколько иным результатам.

У меня есть вектор с несколькими шипами ("dual_spikes"), и я хочу перекрестно сопоставить это с "провалами" (используя xcorr в Matlab).

Я заметил разницу, когда я выполняю это двумя разными способами:

  • выполните xcorr, как обычно, с помощью 'dual_spikes'
  • выполнить xcorr с каждым индивидуальным всплеском, добавить их вместе и нормализовать.

Я не знаю, почему должна быть разница. Для иллюстрации используйте следующую функцию ниже.

function [] = xcorr_fault()

dual_spikes = [zeros(1,200),ones(1,200),zeros(1,400),ones(1,100),zeros(1,100)];

dips = 1-[zeros(1,400),ones(1,1),zeros(1,599)];
plot(dips)

single_spike_1 = [zeros(1,200),ones(1,200),zeros(1,600)];
single_spike_2 = [zeros(1,800),ones(1,100),zeros(1,100)];

xcorr_dual = xcorr_div(dual_spikes,dips);
xcorr_single1 = xcorr_div(single_spike_1,dips);
xcorr_single2 = xcorr_div(single_spike_2,dips);

xcorr_single_all = (xcorr_single1+xcorr_single2)/max(xcorr_single1+xcorr_single2);
xcorr_dual_norm = xcorr_dual/max(xcorr_dual);

figure(1)
clf
hold all
plot(xcorr_dual_norm)
plot(xcorr_single_all)
legend('Single xcorr','xcorr with individual spikes')


function [xcorr_norm] = xcorr_div(lines,signal)
 xcorr_signal = xcorr(signal,lines,'none');
 xcorr_signal(xcorr_signal<1e-13) = NaN;
 xcorr_bg = xcorr(ones(1,length(signal)),lines,'none');
 xcorr_norm = xcorr_signal ./ xcorr_bg;
 xcorr_norm(isnan(xcorr_norm)) = 1;

Обратите внимание, что сигнал xcorr должен иметь "фон" (bg), разделенный так, что найдены только провалы. Это происходит в 'xcorr_div'.

IMG http://i60.tinypic.com/wr0592.jpg

1 ответ

Ваша функция xcorr_div вычисляет кросс-корреляцию, затем делит результат на корреляцию с однородным сигналом. Результатом является некоторая нормализованная взаимная корреляция (а не стандартное определение), которая не является линейной. Таким образом, вы не должны ожидать, что сумма результата будет результатом суммы.

Если вы хотите получить один и тот же результат в обоих направлениях, выведите как xcorr_signal и xcorr_norm из xcorr_div, затем выполните сумму на этих двух выходах, затем разделите.

licensed under cc by-sa 3.0 with attribution.