Почему корреляция с использованием DFT дает не интуитивные результаты? - PullRequest
3 голосов
/ 06 февраля 2012

Я пытался сравнить, насколько похожи 2 сигнала, используя корреляцию через DFT (цифровое преобразование Фурье) в Matlab, но функция корреляции дает не очень предсказуемые результаты.Например, если я сравниваю эти 2 пары сигналов:

  • корреляция 1 и 2
  • корреляция 3 и 4 (автокорреляция)

MATLAB figure screenshot

Я бы ожидал, что пик корреляции в случае «corr 3 и 4» выше, чем в случае «corr 1 и 2».

Я также пытался сделать сигналы «средним на ноль», ноэто не помогло.

Это ожидаемый результат или я пропустил некоторую предварительную обработку и т. д .?

Ответы [ 2 ]

0 голосов
/ 08 февраля 2012

@ Джонас, я не смог найти, как вставить изображение и сделать достаточно хорошее форматирование (извините, новичок здесь), комментируя ваш ответ, поэтому я оставляю этот комментарий как «ответ».

Итак, что я обнаружил, что для следующих цифр ваш метод дал непредвиденные результаты:

enter image description here

как вы видите - пик для автокорреляции ниже, чем для кросс-корреляции.
Код, который я использовал ниже:

trace1=(abs(linspace(-64,64,128))<20)*200;
trace2=trace1-(abs(linspace(-64,64,128))<10)*50;
trace1=trace1-(abs(linspace(-64,64,128))<10)*100;

subplot(321);
plot(trace1); grid on;
subplot(322); 
plot(trace2); grid on;
subplot(323);
plot(xcorr(trace1,trace2)); grid on;
title('unnormalized cross-correlation');
subplot(324);
plot(xcorr(trace2,trace2)); grid on;
title('unnormalized autocorrelation');

subplot(325);
plot(xcorr(trace1/sum(trace1(:)),trace2/sum(trace2(:)))); grid on;
title('normalized cross-correlation');
subplot(326);
plot(xcorr(trace2/sum(trace2(:)),trace2/sum(trace2(:)))); grid on;
title('normalized autocorrelation');
0 голосов
/ 07 февраля 2012

Вам необходимо нормализовать ваши следы данных - то есть разделить их на их соответствующие интегралы перед корреляцией. Следующий код демонстрирует, что когда вы нормализуете трассировки данных, автокорреляция действительно дает вам большее значение:

%# producing your data
trace1=(abs(linspace(-64,64,128))<20)*200;
trace2=trace1-(abs(linspace(-64,64,128))<10)*50;
figure;
subplot(321);
plot(trace1);
subplot(322);
plot(trace2);
subplot(323);
plot(xcorr(trace1,trace2))
title('unnormalized cross-correlation');
subplot(324);
plot(xcorr(trace2,trace2))
title('unnormalized autocorrelation');
%
%# what you should be doing:
subplot(325);
plot(xcorr(trace1/sum(trace1(:)),trace2/sum(trace2(:))))
title('normalized cross-correlation');
subplot(326);
plot(xcorr(trace2/sum(trace2(:)),trace2/sum(trace2(:))))
title('normalized autocorrelation');

ведет к

figure screenshot - produced using the code above

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

...