在Matlab的conv()函数中使用“有效”进行卷积

时间:2018-10-27 15:10:26

标签: matlab convolution

Here是给定的卷积示例:

enter image description here

我在这里有两个问题:

  1. 为什么在向量 的两边都填充两个0?同样,内核的长度为3。如果 的两边各填充一个0,则卷积输出的中间元素将在< strong> ,为什么两边都不是一个0?

  2. 向我解释以下输出:

     >> x = [1, 2, 1, 3];  
     >> h = [2, 0, 1];  
     >> y = conv(x, h, 'valid')      
      y =    
          3     8  
     >>   
    

    在先前显示的矢量 的数学背景下,valid在这里做什么?

1 个答案:

答案 0 :(得分:2)

  1. 我不能说出适当的零填充量...。也就是说,任何零填充都构成了不存在的数据。这不一定是错误的,但是您应该意识到,计算此信息的值可能会有偏差。有时您会在乎,有时则不在意。引入1个零(在这种情况下)将始终在数据中保留中间内核值,但是为什么这应该成为停止条件?重要的是,将2个零相加仍会保留数据和内核中实际存在的值的一乘(x [0] * h [0]和x [3] * h [2]-使用基于0的索引)。在第三个零上添加(或更多)将仅在输出中产生零,因为3是内核的长度。换句话说,对于从n = 1到n = length(h)-1(在这种情况下为1或2)的任何零填充,零填充始终会产生部分基于实际数据的输出(但不是完全基于)。

  2. 即使长度2或1的零填充仍然具有基于实际数据的乘法,但是某些值还是在“伪”数据上求和(乘以填充的零)。在这种情况下,Matlab为您提供了3种用于返回数据的方式的选项。首先,您可以获得full卷积,该卷积包含有偏的值,因为它们包括添加了0个实际上不在数据中的值。或者,您可以获得same,这意味着输出的长度就是数据y = [4 3 8 1]的长度。这对应于1个零,但请注意,对于更长的内核,从技术上讲,您可以得到fullsame之间的其他长度,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值都不是仅用hx计算的,它们都包含填充的零,这不一定表示实际数据。例如:

y[4] = h[2]*x[2] + h[1]*x[3] + h[2]*0 <= padded zero