# fft海面模拟(三) [![杨超](FftSeaSurfaceSimulation_2.assets/b295454f981e959f6d8656ac70ceea19_xs.jpg)](https://www.zhihu.com/people/wantnon) [杨超](https://www.zhihu.com/people/wantnon) 图形学、科幻、游戏 [YivanLee](https://www.zhihu.com/people/SuperPandaGX) 等 接上一篇:[杨超:fft海面模拟(二)](https://zhuanlan.zhihu.com/p/64726720) 本篇说如何用IFFT计算海面IDFT模型。 将海面IDFT模型 ![[公式]](FftSeaSurfaceSimulation_2.assets/equation.svg) 写成标量形式: ![[公式]](FftSeaSurfaceSimulation_2.assets/equation.svg) 接下来将 kx和kz展开,因为: ![[公式]](FftSeaSurfaceSimulation_2.assets/equation.svg) ![[公式]](FftSeaSurfaceSimulation_2.assets/equation.svg) 故: ![[公式]](FftSeaSurfaceSimulation_2.assets/equation.svg) 为使下标从0开始,令m'=m+N/2,n'=n+N/2,则 ![[公式]](FftSeaSurfaceSimulation_2.assets/equation.svg) 。得: ![[公式]](FftSeaSurfaceSimulation_2.assets/equation.svg) 令 ![[公式]](https://www.zhihu.com/equation?tex=%5Ctilde%7Bh%7D%27%28n%27%2Cm%27%2Ct%29%3D%5Ctilde%7Bh%7D%28%5Cfrac%7B2+%5Cpi+%28n%27-%5Cfrac%7BN%7D%7B2%7D%29%7D%7BL%7D%2C%5Cfrac%7B2%5Cpi+%28m%27-%5Cfrac%7BN%7D%7B2%7D%29%7D%7BL%7D%2Ct%29),并将 ![[公式]](FftSeaSurfaceSimulation_2.assets/equation.svg) 由内层求和号中提出,得: ![[公式]](https://www.zhihu.com/equation?tex=h%28x%2Cz%2Ct%29%3D%5Csum_%7Bm%27%3D0%7D%5E%7BN-1%7De%5E%7Bi%5Cfrac%7B2%5Cpi%28m%27-%5Cfrac%7BN%7D%7B2%7D%29z%7D%7BL%7D%7D%5Csum_%7Bn%27%3D0%7D%5E%7BN-1%7D%5Ctilde%7Bh%7D%27%28n%27%2Cm%27%2Ct%29e%5E%7Bi%5Cfrac%7B2+%5Cpi%28n%27-%5Cfrac%7BN%7D%7B2%7D%29x%7D%7BL%7D%7D) 上式可拆成: ![[公式]](FftSeaSurfaceSimulation_2.assets/equation.svg) ![[公式]](FftSeaSurfaceSimulation_2.assets/equation.svg) 由于L长度可随意选取,为向IDFT形式靠拢,取L=N,得: ![[公式]](FftSeaSurfaceSimulation_2.assets/equation.svg) ...(a) ![[公式]](FftSeaSurfaceSimulation_2.assets/equation.svg) ...(b) 接下来把x和z展开。因为: ![[公式]](FftSeaSurfaceSimulation_2.assets/equation.svg) ![[公式]](FftSeaSurfaceSimulation_2.assets/equation.svg) 又因为L=N,且为使下标变为从零开始,令u'=u+N/2,v'=v+N/2,得: ![[公式]](FftSeaSurfaceSimulation_2.assets/equation.svg) ![[公式]](FftSeaSurfaceSimulation_2.assets/equation.svg) 代入(a)、(b)得: ![[公式]](FftSeaSurfaceSimulation_2.assets/equation.svg) ...(c) ![[公式]](FftSeaSurfaceSimulation_2.assets/equation.svg) ...(d) 令: ![[公式]](https://www.zhihu.com/equation?tex=A%28u%27%2Cv%27%2Ct%29%3Dh%28u%27-%5Cfrac%7BN%7D%7B2%7D%2Cv%27-%5Cfrac%7BN%7D%7B2%7D%2Ct%29%2F%28-1%29%5E%7Bv%27-%5Cfrac%7BN%7D%7B2%7D%7D) ![[公式]](FftSeaSurfaceSimulation_2.assets/equation.svg) ![[公式]](FftSeaSurfaceSimulation_2.assets/equation.svg) ![[公式]](FftSeaSurfaceSimulation_2.assets/equation.svg) 则(c)、(d)变为: ![[公式]](FftSeaSurfaceSimulation_2.assets/equation.svg) ...(1) ![[公式]](FftSeaSurfaceSimulation_2.assets/equation.svg) ...(2) 至此,已化成非归一化的IDFT形式,可以套用IFFT了! 总结起来海面IFFT计算流程如下: 1,根据菲利普频谱公式得到各 ![[公式]](https://www.zhihu.com/equation?tex=%5Ctilde%7Bh%7D%28k_x%2Ck_z%2Ct%29) 。(参见:[杨超:fft海面模拟(一)](https://zhuanlan.zhihu.com/p/64414956))。 2,根据 ![[公式]](https://www.zhihu.com/equation?tex=%5Ctilde%7Bh%7D%27%28n%27%2Cm%27%2Ct%29%3D%5Ctilde%7Bh%7D%28k_x%2Ck_z%2Ct%29)得到各 ![[公式]](FftSeaSurfaceSimulation_2.assets/equation.svg) 。 3,根据 ![[公式]](FftSeaSurfaceSimulation_2.assets/equation.svg) 得到各 ![[公式]](FftSeaSurfaceSimulation_2.assets/equation.svg) 。(符号校正1)。 4,根据(2)式计算行IFFT,得到各 ![[公式]](FftSeaSurfaceSimulation_2.assets/equation.svg) 。 5,根据 ![[公式]](https://www.zhihu.com/equation?tex=B%28u%27%2Cm%27%2Ct%29%3DC%28u%27%2Cm%27%2Ct%29%28-1%29%5E%7Bm%27%2Bu%27-%5Cfrac%7BN%7D%7B2%7D%7D) 得到各 ![[公式]](FftSeaSurfaceSimulation_2.assets/equation.svg) 。(符号校正2)。 6,根据(1)式计算列IFFT,得到各 ![[公式]](FftSeaSurfaceSimulation_2.assets/equation.svg) 。 7,根据 ![[公式]](https://www.zhihu.com/equation?tex=h%28x%2Cz%2Ct%29%3DA%28u%27%2Cv%27%2Ct%29%28-1%29%5E%7Bv%27-%5Cfrac%7BN%7D%7B2%7D%7D) 得到各 ![[公式]](FftSeaSurfaceSimulation_2.assets/equation.svg) 。(符号校正3)。 8,结束。 可见,计算量主要集中在1,4,6步,其余步骤均为简单转换。 以N=4为例: 假设1,2,3步已执行完,而后便是核心的计算行、列IFFT步骤(4~6步),图示如下: ![img](FftSeaSurfaceSimulation_2.assets/v2-a58065f242d28d8ffbd72b7f5d685f77_hd.jpg) 图中IFFT(1)表示式(1)对应的IFFT,IFFT(2)表示式(2)对应的IFFT。 可见总共需要计算8个4 point IFFT。(一般情况需要计算2N个N point IFFT)。 最后再执行步骤7得到各h(x,z,t)即可。 如果是gpu实现,则那4个IFFT(2)可以并行,4个IFFT(1)也可以并行。故一般情况下gpu实现只相当于计算2个N point IFFT的量。飞起。 ![img](FftSeaSurfaceSimulation_2.assets/v2-b12ebf4f1c3b887dff28c8ee2f6182e9_hd.jpg) 至此,FFT海面整个逻辑链条都理清了。 关于实现和优化细节也有一些技巧值得一说,例如“蝶形lut生成”、“stage乒乓”、“分帧插值”,或许以后再另写一篇。本系列重在原理,就先这样了。 参考文章: [http://citeseerx.ist.psu.edu/viewdoc/download?doi=10.1.1.161.9102&rep=rep1&type=pdf](https://link.zhihu.com/?target=http%3A//citeseerx.ist.psu.edu/viewdoc/download%3Fdoi%3D10.1.1.161.9102%26rep%3Drep1%26type%3Dpdf) [http://www.keithlantz.net/2011/10/ocean-simulation-part-one-using-the-discrete-fourier-transform/](https://link.zhihu.com/?target=http%3A//www.keithlantz.net/2011/10/ocean-simulation-part-one-using-the-discrete-fourier-transform/) [http://www.keithlantz.net/2011/11/ocean-simulation-part-two-using-the-fast-fourier-transform/](https://link.zhihu.com/?target=http%3A//www.keithlantz.net/2011/11/ocean-simulation-part-two-using-the-fast-fourier-transform/) [OpenStax CNX](https://link.zhihu.com/?target=https%3A//cnx.org/contents/zmcmahhR%407/Decimation-in-time-DIT-Radix-2-FFT) 编辑于 2019-05-16