当在MATLAB中使用xcorr
交叉关联两个相关的数据集时,一切都如预期的那样工作-我看到了一个相关峰值,并且报告的滞后是正确的。然而,当我使用xcorr
交叉关联不相关的数据集,其中两个数据集都包含1个“尖峰”集群时,我看到了一个相关峰值,报告的滞后是两个尖峰之间的距离。
在此图像中:
x
是一个随机数据序列。y
也是一个随机数据序列。x
和y
都有30个随机峰依次插入到序列中。从理论上讲,这两个数据集之间应该没有相关性,因为它们都非常不同。然而,从第三张图可以看出,两个数据集之间存在非常强的相关性。用于生成此图形的代码位于本文的底部。
我试着用几种不同的机制来过滤尖峰(滚动均方根电源...等),然后执行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');
发布于 2015-10-07 23:17:03
解决这个问题的方法是使用归一化互相关。
在归一化互相关中,当信号完全相同时,相关性为1,而当信号不完全相同时,相关性更小。你可以把它看作“相似度百分比”。
要在MATLAB中做到这一点,您只需将'coeff'
作为参数添加到代码中。
所以,如果我把你的代码改成[c, l] = xcorr(x, y,'coeff');
,我得到的图就是巢:
(请注意,我将样本大小更改为600,以使其更具可读性)
互相关度达到0.3,所以不是很多。但是,如果我们将您的代码行更改为
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_x;
并在两个信号中插入相同的随机模式,然后我们得到:
现在,互相关值变得很高,几乎是1,但不是1,因为那里的大随机模式是相同的,但信号的其余部分不是。
发布于 2015-10-07 22:57:16
互相关是两个信号的convolution。想象一下,在互相关过程中,两个信号像我在这里展示的那样处于滞后状态(x轴标签应该完全忽略):
序列x (~样本490)中的正(+)尖峰乘以序列y (~样本121)中的负(-)尖峰,导致xcorr中有很大的负值,这实际上是我们在底图(~样本315)中看到的。这个大的负值将被添加到接近0的值,因为其余的信号确实是低功率噪声。我担心无论您使用什么xcorr函数,您都应该得到相同的结果。事实上,如果有另一个函数声称是交叉相关器,但没有给出与xcorr()
相同的结果,那么该函数就不应该被称为交叉相关器。我希望这能帮到你。
发布于 2015-10-07 23:48:03
我对这个问题的理解是“如何从我的数据中删除这些峰值?”
答案是找到这些峰值的一些特征,然后测试每个时间窗口的特征。如果测试通过,那么您已经检测到一个峰值,您应该删除该数据。
例如,您可能会说“峰值是绝对值大于某个阈值的任何时间点。”您可以使用您的数据来确定阈值,例如0.2。然后你可以做一些类似这样的事情
spikeless_data = data .* (abs(data)<0.2);
它在abs(data)<0.2
时复制数据,如果不是,则将其设置为0。
您还可以注意到,尖峰的一个特征是它们的导数非常大,这可能比简单的阈值更健壮。这将对应于spikeless_data = data .* ([abs(diff(data)), 0] < some_threshold);
您将不得不尝试寻找适合您的数据的东西。
https://stackoverflow.com/questions/32993690
复制相似问题