最近,我通过Paul Bourke举行了一篇论文,概述了一种使用傅里叶变换(FT)产生3D地形(或简单分形噪声)的方法。它似乎不应该工作,但它已经做到了,我只是不得不找出原因。
这种好奇心导致了我的朋友Shubham Gupta实现了这个算法的几周,并找到了这项工作的原因,如果有效。
在这里,我将分享我们在研究这种方法的同时发现的,原因是它的工作原因。您可以在ME或Shubham中找到更新的代码和特定实施的代码和特定实现。
我们需要找出答案,所以我们做了每个人,谷歌和谷歌和谷歌......我们所发现的是描述完全相同算法的其他论文,但具有完全相同的缺乏细节。我们还发现了一些GitHub存储库,但代码复杂且难以理解,并且记录不足。
使用这样的FTS有多种海洋模拟实现,这样我们就知道它必须工作。我们旨在为自己创建清洁且可读的算法。
在19世纪初,Jean-Baptiste Joseph Fourier证明,任何波形都可以表示为无限一组正弦波的总和。这被称为傅里叶系列。
这是如何适用于地形的?好吧,让' s创造了一些正弦波(a,b和c)。
将它们汇总在一起产生光滑,滚动的山丘或地形。如您所见,每个后续波具有更高的频率(波峰和槽的数量),而是较低的幅度(每个波峰的高度和槽的高度)。这种类型的噪声称为相干噪声。
这种频率的增加给出了地形微观细节,幅度的减少确保微细节不会超过宏细节。加入的波浪数量决定了地形中的拘留量。
如果我们刚刚学到的东西,我们发现1D地形只是一组正弦波的总和,幅度降低和频率增加。
我们可以通过思考任何2D噪声作为2D波的噪声来将这一思想扩展到两个维度,想到涟漪。所以…
以超薄的方式,1D傅立叶变换将来自时间域的信号转换为频域。这意味着它将信号断开到其组成频率中,并给出每个频率的幅度。
如您所见,频率侧的图表中的峰值对应于构成输入信号的主导频率(时间侧的图表)。
当我们添加第二维时,2D傅立叶变换将来自空间域的信号(图像)转换为频域。这意味着与1D情况相同,但这时间我们正在将输入图像分解为2D波,进入其组成频率。事实上,2D FTS仅仅是两个1D FTS。一个用于每个水平组件,每个垂直组件一个。
当我们代表2D FT作为图像时,它乍一看通常没有意义。我们在这里有什么,中心是奈奎斯特频率,当我们远离中心时,我们接近零频率。每个像素的亮度是像素位置处的频率幅度的表示。
当在中心具有零频率时,可以更直观地查看2D FTS。要将其带到中心,我们执行另一个称为Shift(Creative,I知道)的其他转型来居中。
值得注意的是,空间或时间域中点的傅里叶变换由复数表示。讨论这些可视化时,只能可视化数量的实数。
如果我们应用2D傅里叶变换并转移到白噪声......我们没有太多。但休息保证结果已转换为频域。
如前所述,相干噪声是一组正弦波的总和,其中每个波的幅度与频率成反比 - 每个连续波作为更大的频率和更小的幅度。
我们还可以将频率提高到一些电源,使其更快地脱落,这导致了更平滑的地形。
其中A是幅度,F是频率,R是粗糙度因子。这种转变的结果是A' 。由于我们正在将过滤器应用于当前幅度,因此我们将过滤器乘以它。
我们可以将此过滤器应用于FT的结果,都是真实和虚部。这具有对每个频率幅度进行缩放,与所述频率成反比的效果。
我们基本上通过缩放构成白噪声的每个频率的幅度来构建我们所需的变化的正弦波。当“求和”时,这些波产生相干噪音。
当我们在应用此转换后可视化FT的真实部分时,我们在中心看到一个小白点
这是预期的频率越高,幅度越小,因此调光像素。
顾名思义,逆傅里叶变换(IFT)与傅里叶变换相反。它采用频域中的信号,并将其转换为时间(1D)或空间域中的信号。
如果我们采取IFT的应用频率滤波器,我们得到...
为了产生相干噪声,我们必须总结一组正弦(或余弦)波,每个后续波具有比前一个更大的频率和较低幅度的较大波浪。
该算法使用2D傅里叶变换(FT)来将白噪声分解到频域中。因此,我们可以获得和修改白噪声中存在的每个频率的幅度。
我们缩放每个频率的幅度,使得频率越高,使用这种关系越低:
这样做,我们已经建立了一组波,每个随后的频率和较低幅度的频率比前一个较低的波。
现在,我们只是执行逆傅里叶变换以获得这些波的“总和”,这出现了相干噪声。
这种产生噪音的方法不是最有效的。事实上,我不建议在生产环境中使用它。
这是对佩林和Simplex基于FBM算法的正式基准。您可以读取GitHub存储库中的数字。
这对其同时代人的唯一好处是它是笨重的。虽然,考虑到Perlin和单纯x噪声是不重复和无限的,它确实重复了使这种好处无用。
尽管如此,这是傅里叶变换的另一个非常有趣的应用,探索真的很有趣。 在下一篇文章中,我或Shubham都会深入了解我们写作的代码,以实现这一目标。