使用CUDA进行循环卷积

时间:2012-07-03 17:37:24

标签: c++ math cuda fft convolution

在FFT2D论文中

http://developer.download.nvidia.com/compute/cuda/2_2/sdk/website/projects/convolutionFFT2D/doc/convolutionFFT2D.pdf

在图1和图2中说明:

  

假设图像大于卷积核,即   通常在实践中,卷积内核需要   根据图1扩展到图像大小并填充。尽可能   如图2和图3所示(见下文),循环卷积与   扩展内核相当于带初始的循环卷积   卷积核。

如果我在内核和元素的图像之间执行卷积,并且我尝试在扩展内核和相同元素的图像之间执行卷积,则会产生不同的结果。

我在某处读到“循环卷积”与经典的“卷积”相同,这是正确的吗?否则我该怎么解释呢?

1 个答案:

答案 0 :(得分:2)

不,循环卷积(也称为circular convolution)与常规卷积不同。内核以循环卷积“包裹”。

x=[1 2 3 4 5]h=[1 2 3]为例:

首先,您翻转h并使用零填充h'=[0 0 3 2 1]。然后,为了获得第一个元素,你可以使用通常的点积:

(x*h)[0] = 0*1 + 0*2 + 3*3 + 2*4 + 1*5

要获取第二个元素,将内核移过1并再次点:

(x*h)[1] = 0*1 + 1*2 + 2*3 + 3*4 + 0*5

与第三个相同。为了得到第四个,内核包裹起来让你得到:

(x*h)[3] = 2*1 + 3*2 + 0*3 + 0*4 + 1*5