GAMES001课程笔记06-傅里叶变换与球谐函数
这个系列是GAMES001-图形学中的数学(GAMES 001: Mathematics in Computer Graphics)的同步课程笔记。课程旨在总结归纳图形学学习过程中重要的数学概念、理论和方法,并将以索引的形式在每一章节中穿插讲解该数学专题在图形学中的应用。本课程既可以作为GAMES系列其它课程学习的基础或「手册」,也可以作为站在不一样的视角复习图形学知识的平台。本节主要介绍谱变换的相关技术。
傅里叶变换
傅里叶展开
傅里叶变换的基础是傅里叶展开。对于任意的周期函数\(f\),我们可以使用一系列周期(频率)不同的正弦、余弦函数来对它进行近似。通过调整这些基函数的权重系数,我们可以恢复原始的周期函数\(f\)。

实际上基函数的权重系数对应它们的振幅,因此我们可以把这些基函数的振幅和频率画在一张图上,这样就得到了原始周期函数\(f\)的频谱(frequency spectrum)。

从更数学的角度来看,傅里叶展开指出周期函数\(f(t)\)可以表示为一系列频率不同的正弦、余弦函数的线性组合:
\[f(t) = \frac{a_0}{2} + \sum_{n=1}^\infty a_n \cos{(n \omega t)} + b_n \sin{(n \omega t)}\]其中频率\(\omega\)以及系数\(a_n\)和\(b_n\)由下列公式给出
\[\begin{cases} \begin{aligned} \omega &= \frac{2 \pi}{T} \\ a_n &= \frac{2}{T} \int_{-\frac{T}{2}}^\frac{T}{2} f(t) \cos{(n \omega t)} \ \mathrm{d} t \\ b_n &= \frac{2}{T} \int_{-\frac{T}{2}}^\frac{T}{2} f(t) \sin{(n \omega t)} \ \mathrm{d} t \\ \end{aligned} \end{cases}\]
更进一步,我们可以利用Euler公式把正弦和余弦函数写成复数的指数函数,这样就能够得到傅里叶展开更统一的指数形式:
\[f(t) = \sum_{n = -\infty}^\infty c_n e^{i n \omega t}\] \[c_n = \frac{1}{T} \int_{-\frac{T}{2}}^\frac{T}{2} f(t) e^{-i n \omega t} \ \mathrm{d} t\]
理解傅里叶变换
对于更一般的非周期函数\(f(t)\),我们可以将其视为周期是\(\infty\)的周期函数。在此基础上可以得到任意函数的傅里叶变换公式:
\[F(\omega) = \frac{1}{2 \pi} \int_{-\infty}^\infty f(t) e^{-i \omega t} \ \mathrm{d} t\] \[f(t) = \int_{-\infty}^\infty F(\omega) e^{i \omega t} \ \mathrm{d} \omega\]


从线性代数的角度来看,傅里叶变换可以理解为把原始函数\(f(t)\)分解到基函数\(\{ e^{i \omega t} \vert \omega \in \mathbb{R} \}\)上,频域函数\(F(\omega)\)则对应了不同基下的坐标。

而原始函数\(f(t)\)则可以看作是以Delta函数\(\delta (t)\)为基的向量,其定义为
\[\delta (t) = \begin{cases} \begin{aligned} &\infty , & t = 0 \\ &0 , & t \neq 0 \end{aligned} \end{cases}\]Delta函数的一个重要性质是它在整个积分域上的积分为1
\[\int_{-\infty}^\infty \delta (t) \ \mathrm{d} t = 1\]
利用Delta函数的积分性质可以推导出积分恒等式
\[\int_{-\infty}^\infty f(a) \delta (t - a) \ \mathrm{d} a = f(t)\]
结合Delta函数的积分恒等式,我们就可以把\(f(t)\)分解到基函数\(\{ \delta (t-a) \vert a \in \mathbb{R} \}\)上,函数值\(f(a)\)即为对应基下的坐标。

在这样的观察下,傅里叶变换实际上就是使用了另一组基函数来描述\(f(t)\):在时域上使用的是Delta函数\(\delta (t - a)\),而在频域上则是三角函数\(e^{i \omega t}\)。

离散傅里叶变换
对于离散的函数我们可以使用离散傅里叶变换DFT来将时域信号转换到频域。

当然更常用的算法是快速傅里叶变换FFT,相关的原理可以参考前面的笔记。

应用
傅里叶变换有非常多的应用。以图像处理为例,通过对图像的频谱进行滤波可以实现不同的滤镜效果。



卷积
卷积的定义
与傅里叶变换相关的另一个重要概念是卷积。通常意义下的卷积是指利用一个卷积核来扫描一幅图像,然后再每个位置按照卷积核对附近的像素值进行加权求和,以此来得到一幅新的图像。

卷积更加严格的数学定义是将两个函数进行积分。以一维函数为例,\(f\)和\(g\)的卷积定义为
\[(f * g) (t) = \int f(\tau) g(t - \tau) \ \mathrm{d} \tau\]注意这里进行积分时,函数\(g\)按照\(\frac{t}{2}\)进行了镜像翻转。

卷积与傅里叶变换
卷积的一个重要性质是卷积定理,它指出时域上的卷积对应于频域上的乘积,而频域上的卷积对应于时域上的乘积。



采样
利用卷积定理我们可以重新认识信号的采样过程。首先定义梳状函数(Dirac comb):
\[C_T (t) = \sum_{n = -\infty}^\infty \delta(t - nT)\]这样对信号\(f(t)\)进行采样就可以表示为时域上的乘积\(f(t) C_T (t)\)

根据卷积定理,我们可以在频域上考察采样的过程。对梳状函数进行傅里叶变换可以得到它的傅里叶级数形式:
\[c_n = \frac{1}{T} \int_{-\frac{T}{2}}^\frac{T}{2} C_T (t) e^{-i \frac{2 n \pi}{T} t} \ \mathrm{d} t = \frac{1}{T}\] \[C_T (t) = \sum_{n = -\infty}^\infty \frac{1}{T} e^{i \frac{2 n \pi}{T} t}\]显然,\(C_T (t)\)的频谱只在\(\frac{2 \pi}{T}\)的整数倍上有取值,其它位置上均为0。

更进一步,我们可以把梳状函数的傅里叶级数形式转换为积分
\[C_T (t) = \sum_{n = -\infty}^\infty \frac{1}{T} e^{i \frac{2 n \pi}{T} t} = \frac{1}{T} \int_{-\infty}^\infty C_{\frac{2 \pi}{T}} (\omega) e^{i \omega t} \ \mathrm{d} t\]上式说明,周期为\(T\)的梳状函数经过傅里叶变换得到一个周期为\(\frac{2 \pi}{T}\)的梳状函数。

根据卷积定理,在时域上使用周期为\(T\)的梳状函数进行采样等价于频域上使用周期为\(\frac{2 \pi}{T}\)的梳状函数进行卷积。这相当于把原始信号的频谱\(F(\omega)\)每隔\(\frac{2 \pi}{T}\)进行平移复制再叠加。


走样
利用上面的推导我们可以很容易地理解采样中的走样问题:当采样的频率不够高时,原始信号的频谱会出现错误的叠加而导致失真。

球谐函数
傅里叶变换的思想还可以应用到其它的领域中。以图形学中的渲染方向为例,在渲染过程中我们往往会使用球坐标来描述环境光照以及BRDF。


在球坐标下我们可以定义球谐函数,它们是球面上傅里叶变换的基函数。


因此,我们可以把任意的球面函数表示为球谐函数的线性组合。

球谐函数在渲染中的经典应用是用来表示环境光照。由于环境光照往往是相对低频的函数,我们只需要存储少量的球谐系数就可以近似原始的光照函数。

从数学的角度来看,球谐函数实际上是球面上Laplace方程的特征向量。

