代码之家  ›  专栏  ›  技术社区  ›  Grizzly

对实际输入数据进行有效的二维FFT?

  •  6
  • Grizzly  · 技术社区  · 14 年前

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

    为了使这更有效,我试图使用真实输入的FFT的对称性,以便能够计算更小的FFT。我发现我可以将两行合并为一行,使用第一行作为实部,第二行作为虚部,对结果行执行第一个1D FFT,然后使用对称性属性从中构造单个行的1D FFT的结果。所以我要做的基本上是:

    f g 是矩阵中的行。

    1. x = f + i * g
    2. 转换为获取 F(x) = F(f) + i * F(g)
    3. F(f) F(g) F(x)

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

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

    理想情况下,我希望能够做整个FFT,而不分裂我的合并数据在FFT中间,但我不确定这是可能的。

    1 回复  |  直到 14 年前
        1
  •  2
  •   Alan Coppola    14 年前

    嗯…我的两份推荐信是:

    http://www.engineeringproductivitytools.com/stuff/T0001/PT10.HTM http://images.apple.com/acg/pdf/FFTapps U 20090909.pdf

    我认为提交一个“hermitian”数据结构,将0和n/2值打包到第一个元素中是一种方法,因为正/逆和hermitian结构会更好地工作。

    这样,就有了rUnWrap(FFT(n/2,偶数(x)+i*Odd(x)))=rFFT(x),riFFT可以在“hermitian”数组上工作,生成偶数和奇数数组对,这再次给出了原始结构。

    还可以进行其他采样,从而将原始数组分成 通过…也许这对GPU内存更好…我不知道。