你好,看起来你对交叉相关如何工作有一些误解。交叉相关需要一个信号,并将其与另一个信号的
平移版本进行比较。如果你还记得,两个信号的(未归一化)交叉相关定义为:
![](https://istack.dev59.com/2hfmo.gif)
(来源:jiracek at www-rohan.sdsu.edu)
s
和 h
是两个信号。因此,我们平移第二个信号h
的版本,并将它们的每个元素相乘并求和。交叉相关图的水平轴表示平移量,而垂直轴表示每个平移位置的交叉相关输出。让我们手动计算该信号的交叉相关,以便更好地理解MATLAB给我们的输出。
为计算输出,两个信号都需要进行零填充以适应两个信号开始重叠的第一个点。具体来说,我们需要进行零填充,使得在交叉相关计算时,在
s
左侧和右侧分别有
N2-1
个零,其中
N2
是
h
的长度。每次计算给定信号
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
的位置。然后对
s
和
h
进行逐点相乘,并将元素求和。在本例中,我们得到:
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
,这是交叉相关的一个属性。
N1
和
N2
分别是
s
和
h
的长度。因此,鉴于
N1 = N2 = 5
,我们可以看到总移位数为
N1 + N2 - 1 = 9
,这也对应于上面计算的最后一个移位。
希望这可以帮到你!
shift = 1
,因为这是我们第一次遇到任何重叠,所以在这种情况下,我们的移位版本具有1个滞后。 - rayryeng