【发布时间】: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,缩放意味着乘法或除法。不要将这些点移动到任何地方。