【问题标题】:Convolution using 'valid' in Matlab's conv() function在 Matlab 的 conv() 函数中使用“有效”进行卷积
【发布时间】:2018-10-27 15:10:26
【问题描述】:

Here是一个卷积给出的例子:

我有两个问题:

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

  2. 向我解释以下输出:

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

    valid 在前面展示的向量 ???? 数学背景下在这里做什么?

【问题讨论】:

    标签: matlab convolution


    【解决方案1】:
    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 选项。在您的示例中,只有 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
    

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-06-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-09-05
      相关资源
      最近更新 更多