对实际输入数据进行高效的2D FFT?

Gri*_*zly 6 algorithm fft

我目前正在使用opencl为实际输入数据实现二维FFT(更具体地说是使用FFT的快速2D卷积,所以我只需要一些行为类似于足以应用卷积的东西).2D FFT在行上使用1D FFT实现,然后在cols上使用1D FFT.

为了提高效率,我试图将FFT的对称性与实际输入结合使用,以便能够计算出更小的FFT.我发现我可以将两行合并为一个,使用第一个作为实部,第二个作为虚部,在结果行上进行第一个1D FFT,然后使用对称属性构造个体的1D FFT结果那个行.所以我正在做的基本上是以下几点:

让我们fg来自矩阵行.

  1. 构造 x = f + i * g
  2. 变换得到 F(x) = F(f) + i * F(g)
  3. 使用对称来提取F(f)F(g)从中提取F(x)

然而,我不能直接将结果输入到第二个1D FFT中,因为在这种情况下我不会转换整个矩阵,而是转换两个子矩阵.然而,在变换之间提取数据意味着要么存储更多数据(n/2+1表示在实际输入上表示1D FFT结果所需的条目),要么将索引0和索引处的n/2元素组合成一个元素(使用相同技巧组合,因为两个数字都有保证要真实的)并使用相同数量的存储空间,但必须在我的卷积中为此做出特殊情况.

因为我尝试尽可能多地重用缓冲区(由于gpu上有限的RAM),使用更多的存储并不是一个好的解决方案.此外,我的算法无法处理矩阵大小,而矩阵大小不是2/16的倍数(从内核到内核不同).我宁愿避免引入特殊情况,因为那会使我的内核更复杂,影响效率(我已经很难最小化每个内核使用的寄存器数).

所以我的问题是,如果有一个优雅的方法来解决这个问题,这意味着如果没有使用更多的内存或某些元素的特殊情况,它会工作吗?

理想情况下,我希望能够在FFT中间分割我的组合数据来完成整个FFT,但我不确定这是否可能.

小智 2

嗯...我的两个参考是:

http://www.engineeringproductivitytools.com/stuff/T0001/PT10.HTM http://images.apple.com/acg/pdf/FFTapps_20090909.pdf

我认为采用“埃尔米特”数据结构,将 0 和 n/2 值打包到第一个元素中是可行的方法,因为正向/反向和埃尔米特结构会效果更好。

这样,就得到了 rUnWrap(FFT(n/2, Even(x) + i*Odd(x)))= rFFT(x),并且 riFFT 可以作用于“埃尔米特”数组,生成一对数组 Even和奇数,这再次给出了原始结构。

还可以进行其他采样,将原始数组分成 4 n/2xn/2 数组,根为 (0,0),(0,1),(1,0),(1,1 )然后最后使用最后的 radix-4 通道结束...也许这对 GPU 内存更好...我不知道。

艾伦