C++ CUDA循环卷积
在FFT2D文件中 图1和图2中指出: 假设图像大于卷积核,即 通常情况下,在实践中,卷积核需要 扩展到图像大小并根据图1填充。尽可能 如图2和图3所示(见下文),使用 扩展核等价于带初始值的循环卷积 卷积核 如果我对一个元素执行内核和映像之间的卷积,并尝试对同一元素执行扩展内核和映像之间的卷积,则会产生不同的结果C++ CUDA循环卷积,c++,math,cuda,fft,convolution,C++,Math,Cuda,Fft,Convolution,在FFT2D文件中 图1和图2中指出: 假设图像大于卷积核,即 通常情况下,在实践中,卷积核需要 扩展到图像大小并根据图1填充。尽可能 如图2和图3所示(见下文),使用 扩展核等价于带初始值的循环卷积 卷积核 如果我对一个元素执行内核和映像之间的卷积,并尝试对同一元素执行扩展内核和映像之间的卷积,则会产生不同的结果 我在某个地方读到,“循环卷积”与经典的“卷积”相同,对吗?否则我该如何解释呢?不,循环卷积,也称为a,与常规卷积不同。内核以循环卷积的形式“环绕” 以x=[12345]和h=[12
我在某个地方读到,“循环卷积”与经典的“卷积”相同,对吗?否则我该如何解释呢?不,循环卷积,也称为a,与常规卷积不同。内核以循环卷积的形式“环绕” 以
x=[12345]
和h=[1235]
为例:
首先翻转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
“正则”卷积不是一个标准术语,事实上“正则”是“周期”或“循环”的同义词。有一点是明确的,谢谢。你知道矩阵之间的循环卷积是如何执行的吗?FFT总是执行循环卷积。如果您不想这样做,则需要同时填充图像和内核,然后裁剪结果。