二维阵列FFT - ios加速API限制无效的性能提升

时间:2015-04-22 09:26:38

标签: fft accelerate-framework

目的是使用ios Accelerate框架对两个2D阵列进行相关/卷积(翻转)以获得速度。

  1. 我的第一次尝试是vImageConvolve_PlanarF / vdsp_imgfir,这对于较小尺寸的阵列很有用。但随着数组大小的增加,性能急剧下降,因为它是一个O(n 2 )实现,正如Accelerate开发人员自己在这里所提到的那样(1)。

  2. 我转而使用FFT实现(2)将复杂度降低到O(nlog 2 n)。使用vDSP_fft2d_zip,在一定程度上获得了速度。但是在非幂2的2D阵列上使用vDSP_fft2d_zip,我们需要填充零。对于例如在尺寸为640 * 480的二维阵列上,我们需要填充零点使其为1024 * 512.其他FFT实现(如FFTW或OpenCV的DFT)允许的大小可以表示为size = 2 p * 3 p * 5 r 。这允许FFTW / OpenCV以相同的尺寸进行640 * 480 2D阵列的FFT。

  3. 因此对于尺寸为640 * 480的2D阵列,在加速与FFTW / OpenCV比较中,它实际上在1024 * 512和640 * 480之间。因此,无论是在尺寸= 2 p * 3 p * 5 - [R

    2个查询。

    1. 我是否缺少任何加速功能来轻松执行此操作?对于例如任何可以在尺寸= 2 p * 3 p * 5 r 下执行2D阵列FFT的加速函数。我假设vDSP_DFT_Execute只执行1D FFT。
    2. 更好的2D FFT或相关方法。就像在这个答案(3)中一样,它要求分割数组,如480 = 256 + 128 + 64 + 32,重复的1D FFT在行上然后在列上。但这需要太多的函数调用,我认为,这对性能没有帮助。
    3. 不太重要:我正在瓦片中进行相关,因为其中一个2D阵列比另一个大得多。比如说1920 * 1024 vs 150 * 100.

1 个答案:

答案 0 :(得分:0)

线性卷积或相关无论如何都需要零填充,否则结果将是循环卷积或相关。

1d iOS vDSP /加速FFT确实允许N成为小素数的乘积,而不仅仅是2 ^ M.不确定2d,但可以用1d FFT建立2d FFT。