图像和内核的尺寸是多少?如果内核很大,那么您可以使用基于 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 的偶数值 - 只需注意两个内部循环的上限/下限。