gpt4 book ai didi

c - DSP 的快速二维卷积

转载 作者:太空狗 更新时间:2023-10-29 17:07:58 25 4
gpt4 key购买 nike

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

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

有人可以帮忙吗?

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

最佳答案

图像和内核的尺寸是多少?如果内核很大,那么您可以使用基于 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
}
}

您可以修改它以支持 K 的偶数值 - 它只需要注意两个内部循环的上限/下限。

关于c - DSP 的快速二维卷积,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3982439/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com