Julia 中的fft慢的问题


#1

对于同样的一张图片,我在matlab上进行快速傅里叶变换,只要0.08秒
image

但在Julia上,却要消耗0.5秒左右(使用的是FFTW库)
image
已经经过多次编译,时间在0.5-0.8秒直接。这是为什么,请问有什么可以优化的地方么


#2
fftshift(fft!(fftshift(A)))

如果你能用 circshift 来算可以考虑用inplace版本的 circshift! 。MATLAB在计算的时候不会区分inplace(虽然这并不正确),所以有些inplace的函数需要你在Julia里找对应的版本(带 ! 的版本)。

注意你的图片需要转成复数。因为fft运算需要复数。


#3

从测试来看这里面大部分时间应该是花在内存分配上了,看起来这65M的内存分配上可以优化的余地还很多

另外一个值得注意的地方是,FFTW下区分了一般的fft和对实数优化的版本rfft。对于图像类型来说用rfft就好了


#4

我试了一下inplace版本的 发现速度会变慢 而且需要另外将图片转成复数,运行时间变长了。不过还是谢谢哈


#5

谢谢 我有试过rfft版本 但会让最终的图片显示不完整

而且会错位。不知道是不是我的rfft使用错误 我是直接将fft换成了rfft


#6

我后来将fft分成两步:先P = plan_fft(holo_img), 再将P与holo_img相乘 这样只要我的图片大小不变,我后面的循环就可以减少第一步的内存开销了


#7

这是我目前想到的最优的解决方案


#8

会让最终的图片显示不完整

ifft也需要换成irfft

img = testimage("cameraman") .|> float32
img_freq = rfft(channelview(img))
img_spatial = irfft(img, size(img, 1))

错位的话大概是因为fftshift的使用有点问题,如果可以的话请把你的代码贴出来才好判断。

如果不清楚如何贴代码的话,直接用markdown语法复制julia代码就可以了

# 大概类似于这样子(去掉#)
#```julia
# codes
#```

#9

在利用fft做图像处理的时候,fftshift并不是一定要做的一个操作。例如imfilter的fft部分是这样写的:


#10

FYI, FFT performance compared to MATLAB