目的是使用ios Accelerate框架对两个2D阵列进行相关/卷积(翻转)以获得速度。
我的第一次尝试是vImageConvolve_PlanarF
/ vdsp_imgfir
,这对于较小尺寸的阵列很有用。但随着数组大小的增加,性能急剧下降,因为它是一个O(n 2 )实现,正如Accelerate开发人员自己在这里所提到的那样(1)。
我转而使用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。
因此对于尺寸为640 * 480的2D阵列,在加速与FFTW / OpenCV比较中,它实际上在1024 * 512和640 * 480之间。因此,无论是在尺寸= 2 p * 3 p * 5 - [R
2个查询。
vDSP_DFT_Execute
只执行1D FFT。不太重要:我正在瓦片中进行相关,因为其中一个2D阵列比另一个大得多。比如说1920 * 1024 vs 150 * 100.
答案 0 :(得分:0)
线性卷积或相关无论如何都需要零填充,否则结果将是循环卷积或相关。
1d iOS vDSP /加速FFT确实允许N成为小素数的乘积,而不仅仅是2 ^ M.不确定2d,但可以用1d FFT建立2d FFT。