给定原始和卷积一维数据的内核估计

时间:2019-02-22 01:33:12

标签: python numpy math convolution deconvolution

在给定原始数据和卷积数据的情况下,我不知道如何找到用于卷积的内核。例如,如果我有1D数据X,并且对某些内核phi应用了卷积,我将得到像这样的输出convoluted_x。

[
  {
    "operation": "shift",
    "spec": {
      "address": {
        "*": {
          "@value": "address.&1"
        }
      },
      "id|marital_status|author_id|company": "&",
      "*": {
        "@value": "&1"
      }
    }
  }
]

此处,X_conv为[-2 -2 -2 -2 -2 -2 -2 -2 -2 -2 9]。

我的问题是,如果仅给出X和X_conv,是否有任何方法可以找到用于卷积的内核phi?

1 个答案:

答案 0 :(得分:1)

如果我们用X表示输入向量,而用Y表示输出(卷积)向量,则每个Y(i)都是由{{1 }}:

X

Y(i) = Sum{j} X(j) * kernel(kernelIndex(i, j)) 是为给定卷积提供特定位置来访问内核的函数,并且通常与实现相关(即,如何索引输入/输出)。

出于我们的目的,kernelIndexY(i)是已知的,X(j)是未知的。因此,对于每个输出kernel(…),我们可以陈述一个线性方程(如上所述)。我们可以收集所有这些方程式,并求解未知的内核条目。这是Matlab中的示例实现:

Y(i)

您可以使用此函数获取内核:

function [kernel] = solveConv(source, target, kernelSize)
    sizeOfSource = size(source);
    sizeOfSource = sizeOfSource(2);
    % linear system A x = b
    A = zeros(sizeOfSource, kernelSize);
    b = zeros(sizeOfSource, 1);
    for i = 1 : sizeOfSource
        for j = 1 : kernelSize
            sourceIndex = i + (kernelSize - j) - floor(kernelSize / 2);
            if sourceIndex >= 1 && sourceIndex <= sizeOfSource
                A(i, j) = source(sourceIndex);
            end
        end
        b(i, 1) = target(i);
    end
    % solve the linear system
    kernel = A \ b;
end

或者如果您不确定内核大小,请尝试使用更大的内核:

>> solveConv([1,2,3,4,5,6,7,8,9,10], [-2 -2 -2 -2 -2 -2 -2 -2 -2 9],3)
ans =

   -1.0000
   -0.0000
    1.0000