两个信号的互相关

4

我想要找到两个信号x1和x2之间的相关性。

x1 = [1 1 1 1 1]
x2 = [1 1 1 1 1]
r1 = xcorr(x1,x2) //function in matlab to find cross correlation of x1 and x2

x1和x2长得像这样 x1或x2

它们的互相关看起来像这样 r1

我知道相关性测量两个信号之间的相似程度,给出最高值对应于最大相似性的点(为了测量不同点的相似性,两个信号相对移动对齐)。那么,在这种情况下,交叉相关应该在所有点上都具有较高的值,但事实并非如此。最大值在第5个位置上。为什么?有人能解释一下吗?

1个回答

10
你好,看起来你对交叉相关如何工作有一些误解。交叉相关需要一个信号,并将其与另一个信号的平移版本进行比较。如果你还记得,两个信号的(未归一化)交叉相关定义为:


(来源:jiracek at www-rohan.sdsu.edu

sh 是两个信号。因此,我们平移第二个信号h的版本,并将它们的每个元素相乘并求和。交叉相关图的水平轴表示平移量,而垂直轴表示每个平移位置的交叉相关输出。让我们手动计算该信号的交叉相关,以便更好地理解MATLAB给我们的输出。

为计算输出,两个信号都需要进行零填充以适应两个信号开始重叠的第一个点。具体来说,我们需要进行零填充,使得在交叉相关计算时,在s左侧和右侧分别有N2-1个零,其中N2h的长度。每次计算给定信号h的移位后的交叉相关时,您会创建一个大小与s的零填充版本相同的全零信号,然后将原始信号h放置在这个更大的信号中。您将使用这个新信号与s的零填充版本进行比较。
实际上,交叉相关的一个属性是它是可交换的。如果您有一个信号比较长,而另一个信号比较短,您可以将长信号保持静止,而将短信号进行移位。请记住,无论选择哪个信号进行移位,您肯定会得到相同的结果,但您应该始终选择更简单的方法!
回到我们之前的地方,这是交叉相关的第一个值的样子(shift = 1)。
s = [0 0 0 0 1 1 1 1 1 0 0 0 0]
h = [1 1 1 1 1 0 0 0 0 0 0 0 0]

第二个信号从左到右滑动,我们从h的右端开始重叠第一个信号s的位置。然后对sh进行逐点相乘,并将元素求和。在本例中,我们得到:
s ** h = (0)(1) + (0)(1) + (0)(1) + (0)(1) + (1)(1) + (0)(1) + (0)(1) + (0)(1) + (0)(1) 
       = 1

在这种情况下,** 是(我版本的)互相关运算符。让我们看一下 shift = 2:
s = [0 0 0 0 1 1 1 1 1 0 0 0 0]
h = [0 1 1 1 1 1 0 0 0 0 0 0 0]

请记住,我们将向右移动1个单位,s保持不变。重复上述计算,应该得到:

s ** h = (0)(1) + (0)(1) + (0)(1) + (0)(1) + (1)(1) + (1)(1) + (0)(1) + (0)(1) + (0)(1) 
       = 2

如果您对其他班次重复此操作,您会发现值会不断增加1,直到我们有完全重叠的情况,即第五个班次(shift = 5)。在这种情况下,我们得到:
s = [0 0 0 0 1 1 1 1 1 0 0 0 0]
h = [0 0 0 0 1 1 1 1 1 0 0 0 0]

当您计算交叉相关时,我们得到了5。现在,当我们计算第六个位移(shift = 6)时,我们向右移动1个位置,这时交叉相关开始下降。具体来说:
s = [0 0 0 0 1 1 1 1 1 0 0 0 0]
h = [0 0 0 0 0 1 1 1 1 1 0 0 0]

如果你计算交叉相关,你会发现结果是4。你不断向右移动,你会发现值每次移动都会减少1。你最终到达只有一个点重叠的最后一点,即这里:
s = [0 0 0 0 1 1 1 1 1 0 0 0 0]
h = [0 0 0 0 0 0 0 0 1 1 1 1 1]

通过计算交叉相关,我们只得到了值为1。您还会看到这是在shift = 9处。因此,这解释了您的图表,其中交叉相关开始增加,因为重叠的数量在增加。然后它在shift = 5时达到最大值,因为两个信号完全重叠。然后,交叉相关开始减少,因为重叠的数量也开始减少。
您还会注意到,我们需要计算的总移位数为N1 + N2 - 1,这是交叉相关的一个属性。N1N2分别是sh的长度。因此,鉴于N1 = N2 = 5,我们可以看到总移位数为N1 + N2 - 1 = 9,这也对应于上面计算的最后一个移位。
希望这可以帮到你!

你提到了零填充。因此,N1 + N2 - 1 = 9。这意味着 s = [1 1 1 1 1 0 0 0 0 0 0 0 0 0] 和 h = [1 1 1 1 1 0 0 0 0 0 0 0 0 0]。移位一位。所以 shift = 1 应该是 s = [0 1 1 1 1 1 0 0 0 0 0 0 0 0] 和 h = [1 1 1 1 1 0 0 0 0 0 0 0 0 0]? - Clive
@Clive - 自上次您查看以来,我已修改了我的帖子。 我在零填充语句中并不完全正确。 我进行了更改,请查看我的编辑。 如有必要,请刷新页面。 - rayryeng
为什么当 shift=1 时,s = [0 0 0 0 1 1 1 1 1 0 0 0 0]? - Clive
那么我应该在一个信号的左右两侧进行零填充,而对于另一个信号只需在右侧进行填充?所以第一种情况是shift=0? - Clive
是的,但从技术上讲,第一次计算时,它的 shift = 1,因为这是我们第一次遇到任何重叠,所以在这种情况下,我们的移位版本具有1个滞后。 - rayryeng
显示剩余3条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接