用于DSP的快速2D卷积

sna*_*ile 7 c signal-processing fft convolution beagleboard

我想实现一些旨在在beagleboard上运行的图像处理算法.这些算法广泛使用卷积.我正在尝试为2D卷积找到一个好的C实现(可能使用快速傅立叶变换).我还希望算法能够在beagleboard的DSP上运行,因为我听说DSP针对这些类型的操作进行了优化(使用乘法累加指令).

我没有该领域的背景,所以我认为自己实施卷积不是一个好主意(我可能不会像了解其背后的所有数学一样好).我相信DSP的一个很好的C卷积实现存在于某个地方,但我找不到它?

有人可以帮忙吗?

编辑:原来内核很小.其尺寸为2X2或3X3.所以我想我不是在寻找基于FFT的实现.我正在网上搜索卷积来查看它的定义,所以我可以直接实现它(我真的不知道卷积是什么).我发现的所有东西都是乘法积分,我不知道如何用矩阵来做.有人可以给我一段2X2内核案例的代码(或伪代码)吗?

Pau*_*l R 12

图像和内核的尺寸是多少?如果内核很大,那么你可以使用基于FFT的卷积,否则对于小内核只需使用直接卷积.

虽然DSP可能不是最好的方法 - 只是因为它有MAC指令并不意味着它会更有效率.Beagle Board上的ARM CPU是否具有NEON SIMD?如果是这样,那么这可能是要走的路(也更有趣).

对于一个小内核,你可以这样做直接卷积:

// in, out are m x n images (integer data)
// K is the kernel size (KxK) - currently needs to be an odd number, e.g. 3
// coeffs[K][K] is a 2D array of integer coefficients
// scale is a scaling factor to normalise the filter gain

for (i = K / 2; i < m - K / 2; ++i) // iterate through image
{
  for (j = K / 2; j < n - K / 2; ++j)
  {
    int sum = 0; // sum will be the sum of input data * coeff terms

    for (ii = - K / 2; ii <= K / 2; ++ii) // iterate over kernel
    {
      for (jj = - K / 2; jj <= K / 2; ++jj)
      {
        int data = in[i + ii][j +jj];
        int coeff = coeffs[ii + K / 2][jj + K / 2];

        sum += data * coeff;
      }
    }
    out[i][j] = sum / scale; // scale sum of convolution products and store in output
  }
}
Run Code Online (Sandbox Code Playgroud)

您可以对其进行修改以支持均匀的K值 - 只需要稍微关注两个内部循环的上限/下限.