Here是给定的卷积示例:
我在这里有两个问题:
为什么在向量 的两边都填充两个0?同样,内核ℎ的长度为3。如果 的两边各填充一个0,则卷积输出的中间元素将在< strong> ,为什么两边都不是一个0?
向我解释以下输出:
>> x = [1, 2, 1, 3];
>> h = [2, 0, 1];
>> y = conv(x, h, 'valid')
y =
3 8
>>
在先前显示的矢量 和ℎ的数学背景下,valid
在这里做什么?
答案 0 :(得分:2)
我不能说出适当的零填充量...。也就是说,任何零填充都构成了不存在的数据。这不一定是错误的,但是您应该意识到,计算此信息的值可能会有偏差。有时您会在乎,有时则不在意。引入1个零(在这种情况下)将始终在数据中保留中间内核值,但是为什么这应该成为停止条件?重要的是,将2个零相加仍会保留数据和内核中实际存在的值的一乘(x [0] * h [0]和x [3] * h [2]-使用基于0的索引)。在第三个零上添加(或更多)将仅在输出中产生零,因为3是内核的长度。换句话说,对于从n = 1到n = length(h)-1(在这种情况下为1或2)的任何零填充,零填充始终会产生部分基于实际数据的输出(但不是完全基于)。
即使长度2或1的零填充仍然具有基于实际数据的乘法,但是某些值还是在“伪”数据上求和(乘以填充的零)。在这种情况下,Matlab为您提供了3种用于返回数据的方式的选项。首先,您可以获得full
卷积,该卷积包含有偏的值,因为它们包括添加了0个实际上不在数据中的值。或者,您可以获得same
,这意味着输出的长度就是数据y = [4 3 8 1]
的长度。这对应于1个零,但请注意,对于更长的内核,从技术上讲,您可以得到full
和same
之间的其他长度,Matlab不会为您返回这些长度。
最后,也是最重要的是要了解所有这些,您可以使用valid
选项。在您的示例中,仅通过对实数据进行乘法运算得出的总和(即,将内核的样本与x
的样本相乘,而不是零的乘积)得出输出的2个样本。更具体地说:
y[2] = h[2]*x[0] + h[1]*x[1] + h[2]*x[2] = 3 //0 based indexing like example
y[3] = h[2]*x[1] + h[1]*x[2] + h[2]*x[3] = 8
请注意,其他y
值都不是仅用h
和x
计算的,它们都包含填充的零,这不一定表示实际数据。例如:
y[4] = h[2]*x[2] + h[1]*x[3] + h[2]*0 <= padded zero