matlab与cuda中FT的图像之间的差异

时间:2011-05-04 19:14:04

标签: c++ cuda fft

我正在尝试实现一个可以进行2D卷积的matlab代码。

matlab代码首先将3x3内核置于Image大小的填充矩阵中。我在C ++代码中做了同样的事情。

我已将我的数组和matlab矩阵输出到.csv文件并确认它们是相同的。然后我在每个上面运行正向FFT。在matlab中,内核的FT图像看起来像你期望的那样 - 在中间基本上是强烈的,在一个圆圈中辐射出来。然而,CUDA FT图像(我将其作为csv导入后在matlab中绘制)看起来像一个椭圆形。

导致这种情况的原因是什么?它看起来好像内核没有在图像中居中,但就像我说的那样,我将填充的内核数据转储到csv并使用imagesc在matlab中查看它,它看起来居中于我,实际上是与填充的matlab内核完全相同。

这是我用来将内核放在填充数组中心的代码:

kSize = 3;
halfl = 0.5*(kSize-1);

if(chipW%2 == 0)
    dcW = (.5*chipW) +1;
else
    dcW = round(chipW*.5);

if(chipH%2 == 0)
    dcH = (.5*chipH) +1;
else
    dcH = round(chipH*.5);

dcH--;
dcW--;


for(int i = dcH-halfl ; i <= dcH+halfl ; i++)

{
    for(int j = dcW -halfl ; j <= dcW+halfl ; j++)

    {
        h_PaddedKernel[i*chipW + j] = make_cuComplex(hp_kernel[(i-(dcH-halfl))*kSize + (j-(dcW-halfl))], 0.0);

    }


}

kSize是我内核的一个大小的宽度,chipW和chipH是我想要处理的图像的宽度和高度

1 个答案:

答案 0 :(得分:0)

两件事:

  • matlab本地计算使用double。你的CUDA代码是否也一样?
  • 显示的matlab尝试在显示它们之前缩放值,在图中有一些选项可以防止这种情况发生。