为什么使用DFT进行相关会产生不直观的结果?

时间:2012-02-05 23:26:38

标签: matlab fft correlation convolution

我试图通过Matlab中的DFT(数字傅里叶变换)来比较相似的2个信号的相似性,但是相关函数没有给出真正可预测的结果。例如,如果我比较这两对信号:

  • 相关1和2
  • 相关3和4(自相关)

MATLAB figure screenshot

我认为“corr 3和4”情况下的相关峰值高于“corr 1和2”情况。

我也尝试将信号“平均为零”,但这没有帮助。

这是预期的结果还是我错过了一些预处理等?

2 个答案:

答案 0 :(得分:0)

您需要规范化数据跟踪 - 即在关联之前将它们除以各自的积分。以下代码演示了在规范化数据跟踪时,自相关确实为您提供了更大的值:

%# 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

我放大峰值以显示归一化自相关具有比标准化互相关更高的峰值。

答案 1 :(得分:0)

@Jonas,我无法找到如何插入图片并制作足够好的格式(抱歉,这里是新手)评论你的答案,所以我将此评论留作“回答”。

所以,我发现,为了跟踪数字,你的方法给出了不预期的结果:

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');