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

时间:2010-10-18 12:50:10

标签: 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)
  4. 中提取F(g)F(x)

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

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

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

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

1 个答案:

答案 0 :(得分: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,偶数(x)+ i *奇数(x)))= rFFT(x),riFFT可以在“hermitian”数组上工作,产生对阵列偶数和奇数,再次给出原始结构。

还可以进行其他采样,从而将原始数组分解为 4 n / 2xn / 2阵列,以(0,0),(0,1),(1,0),(1,1)为根,最后用最终基数-4包裹起来 通过...也许这对GPU内存来说更好......我不知道。

阿兰