DSP的快速2D卷积[英] Fast 2D convolution for DSP

本文是小编为大家收集整理的关于DSP的快速2D卷积的处理方法,想解了DSP的快速2D卷积的问题怎么解决?DSP的快速2D卷积问题的解决办法?那么可以参考本文帮助大家快速定位并解决问题。

问题描述

我想实现一些旨在在 beagle "> beagleboard上运行的图像处理算法.这些算法广泛使用卷积.我试图为2D卷积找到一个良好的C实现(可能使用快速傅立叶变换).我还希望该算法能够在Beagleboard的DSP上运行,因为我听说DSP已针对此类操作进行了优化(具有多重蓄能说明).

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

有人可以帮忙吗?

编辑:事实证明内核很小.它的尺寸为2x2或3x3.因此,我想我不是在寻找基于FFT的实现.我在网上搜索卷积以查看其定义,以便我可以直接实施它(我真的不知道什么是卷积).我发现的只是乘以乘以的东西,我不知道如何使用矩阵来做.有人可以给我一个2x2内核盒的代码(或伪代码)吗?

推荐答案

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

DSP可能不是这样做的最佳方法 - 仅仅因为它具有MAC指令并不意味着它将更有效. Beagle板上的ARM CPU是否有霓虹灯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
  }
}

您可以对此进行修改以支持k的值 - 它只需要在两个内部循环上的上/下限.

上的上/下限.

其他推荐答案

我知道这可能是脱离话题的,但是由于C和JavaScript之间的相似性,我认为这仍然可能会有所帮助. ps.:受@paul r答案的启发.

使用数组中的JavaScript中的二维2D卷积算法

function newArray(size){
    var result = new Array(size);
    for (var i = 0; i < size; i++) {
        result[i] = new Array(size);
    }

    return result;
}

function convolveArrays(filter, image){
    var result = newArray(image.length - filter.length + 1);

    for (var i = 0; i < image.length; i++) {
        var imageRow = image[i];
        for (var j = 0; j <= imageRow.length; j++) {

            var sum = 0;
            for (var w = 0; w < filter.length; w++) {
                if(image.length - i < filter.length) break;

                var filterRow = filter[w];
                for (var z = 0; z < filter.length; z++) {
                    if(imageRow.length - j < filterRow.length) break;
                    sum += image[w + i][z + j] * filter[w][z];
                }
            }

            if(i < result.length && j < result.length)
                result[i][j] = sum;
        }   
    }

    return result;
}

您可以在 http://ec2-54-232-84-48.sa-east-1.com.pute.amazonaws.com/two-dimensional-convolution-convolution-algorithm-with -arrays-in-javascript/

本文地址:https://www.itbaoku.cn/post/359064.html