【问题标题】:Difference between image of FT in matlab vs. cudamatlab与cuda中FT图像的区别
【发布时间】:2011-08-18 19:44:10
【问题描述】:

我正在尝试实现我拥有的 matlab 代码,它可以进行 2D 卷积。

matlab 代码首先将 3x3 内核置于图像大小的填充矩阵中。我在我的 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 是我要处理的图像的宽度和高度

【问题讨论】:

  • 查看 cuda 如何显示实际值。您可能需要进行某种缩放。 Matlab 在浮点值上运行良好。但不确定 Cuda 是否也这样做。所以这可能会导致仅显示 FFT 的问题。
  • 当你说缩放时,你肯定只是指缩放除以元素数量对吗?实际上没有将数据元素移动到数组中的另一个位置?
  • @ Derek,缩放意味着乘法或除法。不要将这些点移动到任何地方。

标签: c++ cuda fft


【解决方案1】:

两件事:

  • matlab 本机使用双精度计算。您的 CUDA 代码是否也这样做?
  • matlab 显示在显示之前尝试缩放值,绘图中有一些选项可以防止这种情况发生。

【讨论】:

    猜你喜欢
    • 2014-05-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-02-16
    相关资源
    最近更新 更多