光经过一个物体(可以是小孔,也可以是任意),成的像是物的傅里叶变换。
所以想要显示夫琅禾费衍射的效果,就是求物的傅里叶变换。
二维傅里叶变换的复杂度是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、第一轮变换取值的顺序。
发表评论:
◎欢迎参与讨论,请在这里发表您的看法、交流您的观点。