hanyeah 专注于AS

使用GPU实现快速傅里叶变换

光经过一个物体(可以是小孔,也可以是任意),成的像是物的傅里叶变换。

所以想要显示夫琅禾费衍射的效果,就是求物的傅里叶变换。

二维傅里叶变换的复杂度是n*n*n*n

一个256*256的图像,傅里叶变换需要计算256*256*256*256=4294967296次,4亿次。

计算机CPU计算需要“秒”的量级。

有人发明了快速傅里叶变换,只需要2*n*n*log(n)次计算。

256*256*2*8 = 1048576次。

减少到了100万次。

但是如果是白光的话,至少需要6个颜色叠加,也就是600万次,如果是菲涅尔衍射,还需要做反变换,需要乘以2,也就是1200万次。

假设一次需要10次加减法,计算白光的菲涅尔衍射,就需要1亿2000万次计算。

计算机1秒大概能算3亿次加减法。

所以一秒也就算几次。

会很卡。

达不到一秒60帧。

所以有人提出了,用GPU做快速傅里叶变换。

我试了试,果然很快。

做了好几个星期了,总算初步成功了。

参考:

一小时学会快速傅里叶变换(Fast Fourier Transform) - 知乎 (zhihu.com)

详尽的快速傅里叶变换推导与Unity中的实现 - 知乎 (zhihu.com)

我还是用的先交换数据的顺序,再进行蝶形变换的方式。(时间上没有真的交换,而是第一轮变换的时候按照特定的顺序取值)

有两个难点:

1、蝶形变换

2、第一轮变换取值的顺序。


源码打包下载(原理)

源码打包下载(pixi-demo)

2021年7月1日 | 发布:hanyeah | 分类:算法 | 评论:0

发表留言: