在 Matlab 的 conv() 函数中使用 'valid' 进行卷积

Convolution using 'valid' in Matlab's conv() function

Here是给定卷积的例子:

我这里有两个问题:

  1. 为什么向量两边各补两个0?因为,kernel的长度为3,如果两边各补一个0,则卷积输出的中间元素在的长度范围,为什么不是每边一个0呢?

  2. 向我解释以下输出:

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

    valid 在前面显示的向量数学 ?[=16 的上下文中做什么=]

  1. 我不能说零填充的数量是正确的....话虽如此,任何零填充都是在弥补不存在的数据。这不一定是错误的,但您应该意识到计算此信息的值可能有偏差。有时你关心这个,有时你不关心。引入 1 个零(在这种情况下)会使中间内核值始终留在数据中,但为什么这应该是一个停止标准?重要的是,添加 2 个零仍然会留下数据和内核中实际存在的值的乘积(x[0]*h[0] 和 x[3]*h[2] - 使用基于 0 的索引)。添加第三个零(或更多)只会在输出中产生零,因为 3 是内核的长度。换句话说,对于从 n=1 到 n = length(h)-1(在本例中为 1 或 2)的任何零填充,零填充将始终产生部分基于实际数据(但不完全)的输出。

  2. 即使长度为 2 或 1 的零填充仍然具有基于实际数据的乘法,一些值会在 "fake" 数据上求和(与填充零相乘的值)。在这种情况下,Matlab 为您提供了 3 个选项,供您选择如何编辑数据 return。首先,您可以获得 full 卷积,其中包括有偏差的值,因为它们包括添加实际上不在数据中的 0 值。或者你可以得到 same,这意味着输出的长度是数据的长度 y = [4 3 8 1]。这对应于 1 个零,但请注意,对于更长的内核,您可以在技术上获得 fullsame 之间的其他长度,Matlab 不会 return 那些适合您的。

最后,也许最重要的是理解所有这些,你有 valid 选项。在您的示例中,只有 2 个输出样本是根据仅对实际数据进行乘法计算得出的总和(即,将内核样本与来自 x 而不是来自零的样本相乘)。更具体地说:

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

注意 none 的其他 y 值仅使用 hx 计算,它们都包含一个填充零,这不一定表示真实数据。例如:

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