学习笔记
信号分析 原理
DFT: IDFT:
F(μ)为转换后的频域函数,μ为频率,f(x)为时域函数
用欧拉公式展开得
https://www.bilibili.com/video/av49238862 欧拉公式的理解
http://k.sina.com.cn/article_6367168142_17b83468e001004j89.html?sudaref=graph.qq.com&display=0&retcode=0 傅里叶变换
根据三角函数的正交性,三角函数系中任何俩个不同函数的乘积在他们的公共周期内的积分等于0。所以可以利用这个性质在求某一个频率分量的振幅时把其他的频率过滤掉。
首先构造检波器A:f标准正弦信号
输出为和频率f有关的一个量,这个量等于带变换信号中f分量与标准正弦信号f的乘积的积分。但不能保证其输出不为0时待变换信号中就一定含有f分量。因为正弦波具有,相位差为90°(正交)时,一个周期内的乘积的积分为0。相位相同时,积分值达到最大为俩者的有效值的乘积。相位相反时,积分达到最小,为俩者的有效值的乘积取反。如果带变换信号中的f分量的初始相位与标准正弦信号f的相位刚好差90°(270°),那么输出也为0。
所以构造检波器B:f标准余弦信号
如果带变换信号中包含f分量,那么检波器A和B中至少有一个输出不为0。A和B输出的信号的幅值的方和根就等于f分量的幅值。
傅里叶变换是一种信号分析的方法,其选择把信号分解为正弦波的组合,选择正弦波的好处在于正弦波输入至任何线性系统,输出的还是正弦波改变的仅是幅值和相位,而线性系统具备多个正弦波叠加后输入,输出是所有正弦波独立输入时对应输出的叠加。
所以DFT公式的理解就如上俩图所示,最后得到的复数的模就是想求的频率的振幅。
海洋公式
所以复杂海面的生成就需要先生成频谱,再通过IDFT得到多种波叠加出来的复杂海面,所以核心就在于频谱的生成。
海洋高度IDFT公式:
为水平方向坐标
为频域坐标,kx kz均为频率,t为时间
为频谱
表示固定z,只让x变化时频率为kx,固定x,只让z变化时频率为kz
相当于N为64时就有64²=4096个离散频率点
频谱公式:
方向波谱:
海洋水平偏移公式:
这个式子会在之后的浮沫计算出现,具体方向的偏移将公式拆开即可
Ocean Surface Simulation NV的流程图
法线:
精确的法线计算应该是根据高度求空间梯度,再根据向量关系计算得出,需要进行FFT
推导:
而不是很精确的法线也可以用查分来求
计算M0处的法线,需要计算切向量Tx Ty做叉乘,切向量由曲面方程求偏导求得。而对于离散的点,直接取M0俩侧的点差值即可。
偏导数反映的是函数沿坐标轴方向的变化率
梯度为一个向量,其方向为函数在这点的方向导数取得最大值的方向,它的模等于方向导数的最大值
浪尖泡沫区域:
刺穿时,局部发生翻转,数学上的表现为面元有向面积为负值。
求面源有向面积则需要用到二重积分换元法+雅克比矩阵
如何理解雅克比矩阵:https://www.zhihu.com/question/22586361/answer/77898641
雅克比矩阵转雅克比行列式推导,x为叉乘,叉乘的几何意义是俩向量构成的平行四边形的面积
J<0表示生成泡沫的区域,λ为挤压程度。
FFT IFFT
由于直接计算效率非常之底,所以需要引入FFT(快速傅里叶变换) IFFT(快速傅里叶逆变换)
先回到海洋高度IDFT公式
FFT推导:
海洋高度公式
展开
所以计算复杂度为O(N²M²)
引入FFT IFFT
波高方程转为
将一个二维IDFT转为俩个一维的IDFT
到这一步不看,其实就已经将公式转化为了标准的IDFT形式
将F(u,m’,t)进行奇偶划分
所以将N设为2的整数次幂的话,就可以一直像这样向下拆
用蝶形图表示
继续将G和H进行奇偶拆分,一直拆到最后一组只有俩个的时候,比如这里的A B C D,已经可以直接求出他们与的关系
最后就可以得到一个蝶形变换图
上图的蝶形图,左侧的输入是倒序输入,右侧的输出是顺序输出。GPU一般使用Stockham FFT解决序号重映射问题。
Stockham FFT
https://zhuanlan.zhihu.com/p/208511211
这里m是从1开始,所以是m-1,其他一样
的计算,算法原理没变,但由于使用了n' m'表示n m,所以要转换为对应的表示,其推导:
https://www.keithlantz.net/2011/10/ocean-simulation-part-one-using-the-discrete-fourier-transform/
频谱推导
w(k)推导
方向波谱推导
GPU Gem3 37章提到:
对非正态分布进行采样的主要方法是,首先生成均匀分布的随机数。然后使用一个转换把均匀分布的随机数转换为需要的非均匀分布的样本。
Xorshift均匀随机数
https://www.reedbeta.com/blog/quick-and-easy-gpu-random-numbers-in-d3d11/#wide-and-deep
Box-Muller转换高斯随机数
高斯随机数的生成 均匀到高斯的转换Box-Muller
对于GPU来说有很大的优势,它没有分支或循环,只存在一条单一的代码流程。利用了GPU直线型代码和大量数学负载计算的长处,正余弦在GPU中计算很快。
最终效果:
补充:
盗贼之海中浮沫区域的计算 https://dl.acm.org/doi/10.1145/3214745.3214820
对雅克比矩阵进行偏移以获得更大的区域
+渐进模糊 +LOD浮沫图
参考资料:
https://zhuanlan.zhihu.com/p/95482541
https://zhuanlan.zhihu.com/p/64414956
傅里叶
http://k.sina.com.cn/article_6367168142_17b83468e001004j89.html?sudaref=graph.qq.com&display=0&retcode=0
欧拉公式
https://www.bilibili.com/video/av49238862
雅克比行列式 二重积分
https://www.bilibili.com/video/BV1Sb41187NZ?from=search&seid=14933653521092748320
如何理解雅克比矩阵
https://www.zhihu.com/question/22586361
雅克比矩阵雅克比行列式转换
https://www.zhihu.com/question/274450639
海洋高度公式推导
https://www.keithlantz.net/2011/10/ocean-simulation-part-one-using-the-discrete-fourier-transform/
Stockham FFT蝶形变换
https://zhuanlan.zhihu.com/p/208511211
Xorshift均匀随机数
https://www.reedbeta.com/blog/quick-and-easy-gpu-random-numbers-in-d3d11/#wide-and-deep
GPU Gem37章 Box-Muller转换高斯随机数