【问题标题】:Cyclic convolution with CUDA使用 CUDA 进行循环卷积
【发布时间】:2012-07-04 04:44:54
【问题描述】:

在 FFT2D 论文中

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

在图 1 和图 2 中指出:

假设图像大于卷积核,即 通常在实践中的情况下,卷积核需要 扩展为图像大小并根据图 1 填充。 在图 2 和图 3(见下文)中可以看到,循环卷积与 扩展核等价于具有初始值的循环卷积 卷积核。

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

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

【问题讨论】:

  • FFT 总是执行循环卷积。如果你不想这样,你需要填充图像和内核,然后裁剪结果。

标签: c++ math cuda fft convolution


【解决方案1】:

不,循环卷积,也称为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

要获得第二个元素,您将内核移动一个并再次点:

(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

【讨论】:

  • “regular”卷积不是一个标准术语,实际上“regular”这个词是“periodic”或“cyclic”的同义词。
  • 还有一点清零,谢谢。你知道矩阵之间的循环卷积是如何进行的吗?
猜你喜欢
  • 2017-11-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-11-01
  • 1970-01-01
  • 2013-06-08
  • 2012-03-06
相关资源
最近更新 更多