为了便于表示频谱信息和后续的傅里叶变换,我们需要从原本的基于像素位置的坐标空间,通过平移、拉伸,构建出原点在中心的、以基频为单位的波数坐标

平移:居中处理

HLSL
float nx = (float)id.x - (float)Size / 2.0;
float ny = (float)id.y - (float)Size / 2.0;
点击展开查看更多

转换前id.xid.y 是 GPU 线程的索引,范围通常是 $[0, Size-1]$ 转换后:将坐标系的原点从左下角移动到网格的中心

在频率分析中,低频通常位于中心,平移操作后符合离散傅里叶变换(DFT)中对于对称频谱的处理习惯。

拉伸:单位转换

像素波数

求目标函数:

$$ \vec{k} = f(\vec{n}) \quad,其中 \begin{cases} f(\vec{n}) \ne 0 \\ f(\vec{n}) \text{ 单调递增} \end{cases} $$

在物理学中,波数 $k$ 与波长 $\lambda$ 的关系是

$$ k = \frac{2\pi}{\lambda} $$

当波长 $\lambda$ 为 实际海面物理尺寸 $L$ ,即该波恰好覆盖正片海域时,

$$ k=\frac{2\pi}{L} $$

设该波为要模拟的最大波长,则目标函数在零点时等于该值,

$$ k=f(0)=\frac{2\pi}{L} $$

由瞪眼法得,

$$ \vec{k} = f(\vec{n})=(\vec{n} \pm 1)\frac{2\pi}{L} $$

代码表示为,

HLSL
float kx = (nx + sign(nx)) * (2.0 * PI / Length);
float ky = (ny + sign(ny)) * (2.0 * PI / Length);
点击展开查看更多

变换后的意义

从坐标空间(空间域)到波矢量(波数域)示意图

在经过变换后,

  • 靠近中心的坐标点,所表示的波波数越小(波长小、频率低)
  • 靠近边缘的坐标点,所表示的波波数越大(波长小、频率高)

版权声明

作者: Cheyne Xie

链接: https://chaim.eu.org/posts/3bdf1a46/

许可证: CC BY-NC-SA 4.0

This work is licensed under a Creative Commons Attribution-NonCommercial-ShareAlike 4.0 International License. Please attribute the source, use non-commercially, and maintain the same license.

开始搜索

输入关键词搜索文章内容

↑↓
ESC
⌘K 快捷键