本文不会严格地从泛函分析或者调和分析的角度展开,而是从直觉上理解傅里叶变换和谱域的含义。重点不是证明定理,而是弄清楚为什么换到谱域之后,很多原本缠在一起的问题会突然变得清楚。

谱域

一个信号最直接的表示方式,是看它在每个位置或者每个时刻的取值。

比如一个关于时间的函数:

$$ f(t) $$

这时候我们关心的是:在时间 $t$ 这个位置上,信号的值是多少。

但还有另一种看法:不再直接盯着每个时刻的值,而是问这个信号由哪些基本的振动模式组成。也就是说,我们不问“这里的值是多少”,而是问“这个信号里面有哪些频率”。

这就是谱域的视角。

时域关心的是:

某个时刻发生了什么。

频域或者谱域关心的是:

某种频率成分有多强。

同一个信号,在两个域里描述的是同一件事,只是观察的坐标系不同。

从波开始

最简单的周期波可以写成:

$$ \sin(\omega t) $$

其中 $\omega$ 控制振动的快慢。

如果 $\omega$ 很小,函数变化得比较慢;如果 $\omega$ 很大,函数变化得就比较快。

从图像上看,低频信号通常比较平滑,高频信号则变化得更剧烈。

更一般地,可以写成:

$$ A\sin(\omega t + \varphi) $$

这里有三个比较重要的量:

  • $A$ 是振幅,控制这段波有多强
  • $\omega$ 是频率,控制这段波变化得多快
  • $\varphi$ 是相位,控制这段波整体偏移到哪里

如果只看一个简单的正弦波,这些东西并不复杂。但问题在于,现实中的信号通常不是这么干净的一个波,而是很多波混在一起。

复杂信号是简单波的叠加

傅里叶分析最核心的想法是:

很多复杂信号都可以看成一堆简单波的叠加。

比如我们可以把一个周期函数写成类似这样的形式:

$$ f(t) = a_0 + \sum_{n=1}^{\infty} a_n\cos(n\omega t) + b_n\sin(n\omega t) $$

这里每一项都对应一个频率。

$a_n$ 和 $b_n$ 这些系数描述的是:某个频率的成分在原信号中占多少。

所以原来的 $f(t)$ 是在时间上描述信号,而这些系数是在频率上描述信号。傅里叶分析做的事情,就是在这两种描述之间切换。

这件事情和向量的坐标表示很像。一个二维向量可以用标准基表示,也可以换一组基表示。向量本身没有变,变的是我们描述它的方式。

傅里叶变换也是类似的:信号本身没有变,只是从“按时间描述”变成了“按频率描述”。

频谱

频谱可以理解成一个信号在不同频率上的分布。

如果某个频率对应的幅值很大,就说明这个信号里这个频率的成分很强。

如果某个频率对应的幅值接近 $0$,就说明这个信号里几乎没有这个频率。

因此频谱并不是原信号之外额外多出来的东西,而是原信号的另一种表达方式。

举个比较直观的例子,假设一个信号是两个正弦波叠加出来的:

$$ f(t) = \sin(t) + 0.5\sin(5t) $$

在时域里,我们看到的是一个起伏的曲线。

但在频域里,它主要就只有两个成分:一个频率是 $1$,另一个频率是 $5$,而且频率 $5$ 的强度更弱一些。

时域里的图像可能看起来有些复杂,但频域里反而很清楚。

低频和高频

低频通常代表变化缓慢的整体结构。

高频通常代表变化剧烈的局部细节。

对于图像来说,低频部分通常包含大致的明暗和轮廓,高频部分则包含边缘、纹理、噪声这些东西。

对于声音来说,低频可能更接近低沉的部分,高频则更接近尖锐的部分。

当然这不是绝对的,只是一种常见的直觉。真正重要的是:频率描述的是变化的尺度。

低频变化慢,高频变化快。

所以很多去噪、压缩、平滑方法都会在频域里做文章。因为在频域里,我们可以比较自然地说:

  • 哪些频率要保留
  • 哪些频率要削弱
  • 哪些频率可以直接丢掉

这比直接在原始信号上动手,有时候要清楚很多。

傅里叶变换

傅里叶级数主要用来处理周期信号,而傅里叶变换可以处理更一般的非周期信号。

连续傅里叶变换通常写成:

$$ \hat{f}(\omega) = \int_{-\infty}^{+\infty} f(t)e^{-i\omega t}dt $$

这里的 $\hat{f}(\omega)$ 表示信号 $f(t)$ 在频率 $\omega$ 上的成分。

也可以通过反变换从频域回到时域:

$$ f(t) = \frac{1}{2\pi}\int_{-\infty}^{+\infty}\hat{f}(\omega)e^{i\omega t}d\omega $$

所以傅里叶变换不是把信息丢掉了,而是把同一个对象换了一种写法。

只要条件合适,从时域到频域,再从频域回到时域,理论上是可以恢复原信号的。

为什么会出现复数

傅里叶变换里经常会出现:

$$ e^{i\omega t} $$

这看起来好像突然把问题变复杂了,但其实复指数只是把正弦和余弦统一写在了一起。

根据欧拉公式:

$$ e^{i\theta} = \cos\theta + i\sin\theta $$

因此 $e^{i\omega t}$ 本质上仍然是在描述振动。

使用复数的好处是很多运算会变得更统一。比如求导、积分、平移、卷积这些操作,在复指数形式下通常会有很漂亮的表达。

这也是数学里经常出现的一种情况:引入一个看起来更抽象的对象,不是为了让问题更玄,而是为了让结构更清楚。

离散傅里叶变换

实际计算机里处理的通常不是连续函数,而是一串离散采样值。

比如:

$$ x_0,x_1,\cdots,x_{N-1} $$

这时候用的是离散傅里叶变换,也就是 DFT:

$$ X_k = \sum_{n=0}^{N-1} x_n e^{-i2\pi kn/N} $$

其中 $X_k$ 表示第 $k$ 个离散频率上的成分。

这个式子的含义和连续傅里叶变换是一致的,都是把原信号拆到不同频率上。区别只是:连续傅里叶变换面对的是连续频率,而 DFT 面对的是有限个离散频率。

如果把一串长度为 $N$ 的数据看成一个向量,那么 DFT 也可以看成一次矩阵乘法。这个矩阵的每一行都对应一种频率模式。

因此从线性代数的角度看,DFT 其实也是在换基。

FFT

直接计算 DFT 的复杂度是 $O(n^2)$。

因为每一个频率点都要和所有采样点做一次求和。

快速傅里叶变换,也就是 FFT,利用了复指数的周期性和对称性,把复杂度降到了:

$$ O(n\log n) $$

这也是傅里叶变换在工程里特别重要的原因之一。它不只是一个漂亮的数学表达,而且真的算得动。

很多信号处理、图像处理、音频处理、科学计算中的算法,背后都离不开 FFT。

从谱域看滤波

滤波可以理解成对不同频率成分分别加权。

如果一个信号的频谱是 $\hat{f}(\omega)$,滤波器是 $H(\omega)$,那么滤波后的频谱可以写成:

$$ \hat{g}(\omega) = H(\omega)\hat{f}(\omega) $$

这里的 $H(\omega)$ 决定了每个频率要保留多少。

比如低通滤波器会保留低频,压制高频。

高通滤波器则反过来,压制低频,保留高频。

从这个角度看,滤波器本质上就是一个作用在谱上的函数。

这也是谱域很有用的地方:很多在原空间里比较纠缠的操作,换到谱域之后就变成了简单的乘法。

卷积和乘法

傅里叶变换里有一个非常重要的性质:

时域中的卷积,对应频域中的乘法。

也就是:

$$ \widehat{f * g} = \hat{f}\hat{g} $$

卷积在原空间里看起来像一个滑动加权平均,每个位置都要和附近的一片区域发生关系。

但到了频域里,它就变成了每个频率上的逐点相乘。

这件事情非常重要,因为它说明谱域不只是换一种方式观察信号,有时候还可以直接改变计算方式。

原来复杂的整体耦合,变成了每个频率分量上的独立处理。

采样和混叠

傅里叶变换还有一个很实际的问题:计算机里的信号是采样得到的。

如果采样频率不够高,那么高频信号可能会伪装成低频信号,这种现象叫混叠。

直观上说,就是你看得不够密,结果把快速变化的东西误认为是慢速变化。

所以在把连续信号离散化的时候,采样频率非常重要。

这也是为什么很多实际系统在采样前会先做低通滤波,先把过高的频率压掉,避免它们在离散化之后混进低频里。

图上的傅里叶变换

傅里叶变换里,信号通常定义在一条时间轴或者一片规则网格上。

但如果信号不是定义在规则空间里,而是定义在图上呢?

比如一个社交网络里,每个节点有一个用户特征;或者一个分子图里,每个节点有一个原子特征。这时候信号的定义域不是时间轴,也不是二维平面,而是一张图。

这就是图信号处理(Graph Signal Processing, GSP)关心的问题。

如果图上有 $n$ 个节点,那么一个图信号可以写成:

$$ x \in \mathbb{R}^n $$

其中 $x_i$ 表示第 $i$ 个节点上的信号值。

如果是在普通的一维信号里,相邻位置是天然存在的,比如 $t$ 和 $t + \Delta t$ 很接近。但图上没有这么规整的坐标,节点之间的邻近关系由边决定。

所以图上的问题是:我们能不能也像普通傅里叶变换那样,找到一组“基本振动模式”,然后把图信号分解到这些模式上?

这就是图傅里叶变换的出发点。

图拉普拉斯矩阵

在普通傅里叶变换里,频率基来自正弦和余弦;而在图上,没有天然的正弦波,所以需要从图本身构造一组“频率基”。

一个常见的选择是图拉普拉斯矩阵:

$$ L = D - W $$

其中 $W$ 是邻接矩阵,$D$ 是度矩阵。

直觉上,$W$ 描述的是哪些节点相连,以及连接有多强;$D$ 则记录每个节点总共连出去多少权重。

图拉普拉斯矩阵最重要的作用之一,是刻画一个图信号在图上是否平滑。

所谓平滑,指的是相连的节点上,信号值不要差太多。

如果两个节点之间有边,而且边权很大,那么我们就倾向于认为这两个节点应该更相似。反过来,如果这两个节点上的信号值差很多,就说明这个信号在图上变化得比较剧烈。

这个“不平滑程度”可以用下面这个式子衡量:

$$ x^TLx = \frac{1}{2}\sum_{i,j}W_{ij}(x_i - x_j)^2 $$

这个式子很直观:

  • 如果 $i$ 和 $j$ 没有边,那么 $W_{ij}=0$,这两个节点的差异不参与计算
  • 如果 $i$ 和 $j$ 有边,而且 $x_i$ 和 $x_j$ 很接近,那么贡献很小
  • 如果 $i$ 和 $j$ 有边,但 $x_i$ 和 $x_j$ 差很多,那么贡献会很大

因此 $x^TLx$ 越小,说明图信号越平滑;$x^TLx$ 越大,说明图信号在相邻节点之间变化越剧烈。

图上的频率

如果图是无向图,那么 $L$ 是对称矩阵,可以进行特征分解:

$$ L = U\Lambda U^T $$

这里的 $U$ 就可以看成图上的傅里叶基,$\Lambda$ 中的特征值则对应图上的频率。

为什么可以这么理解?

因为这些特征向量是由图本身决定的基本模式。每一个特征向量 $u_i$ 都表示一种图上的变化形态,而对应的特征值 $\lambda_i$ 描述这种变化形态有多“不平滑”。

特别地,如果图是连通的,那么最小的特征值是:

$$ \lambda_1 = 0 $$

它对应的特征向量是一个常数向量,也就是所有节点上的取值都一样。

这个模式当然是最平滑的,因为相邻节点之间没有任何差异。

随着特征值变大,对应的特征向量在相邻节点之间通常会变化得更剧烈。因此在图信号处理中,较小的特征值对应低频,较大的特征值对应高频。

对于一个图信号 $x$,它的图傅里叶变换可以写成:

$$ \hat{x} = U^Tx $$

反变换则是:

$$ x = U\hat{x} $$

这个形式和普通傅里叶变换的味道是一样的:原信号还是那个原信号,只是从节点空间换到了谱空间。

在节点空间里,$x_i$ 表示第 $i$ 个节点上的信号值。

在谱空间里,$\hat{x}_i$ 表示这个信号在第 $i$ 个图频率上的成分。

所以图傅里叶变换做的事情,就是把“每个节点上的值”,换成“每种图频率上的强度”。

不过这里需要注意:图傅里叶变换和普通傅里叶变换并不是完全同一个东西。

普通傅里叶变换里的频率来自规则空间上的平移结构。时间轴或者二维网格是很规整的,所以正弦、余弦、复指数这些函数有非常明确的“振动频率”。

但一般的图没有天然的方向、距离和周期结构。图上的“频率”不是先验给定的,而是从图拉普拉斯矩阵的特征分解里定义出来的。

所以更准确地说,GSP 不是把普通傅里叶变换原封不动搬到图上,而是保留了傅里叶分析里的一个核心思想:

找一组由空间结构决定的基本模式,然后把信号分解到这些模式上。

在规则网格上,这组模式是正弦和余弦;在图上,这组模式是图拉普拉斯矩阵的特征向量。

正则化和谱域

把 $x = U\hat{x}$ 代进去,还可以得到:

$$ x^TLx = \hat{x}^T\Lambda\hat{x} = \sum_i \lambda_i \hat{x}_i^2 $$

这就很有意思了:图上的平滑性,在谱域里变成了对不同频率成分的加权惩罚。

特征值 $\lambda_i$ 越大,对应的频率越高,惩罚也越重。

所以很多图上的正则化,其实都可以从谱域理解成:压制图信号中的高频成分,让相邻节点上的表示不要变化得太剧烈。

比如我们有一个带噪声的图信号 $y$,希望得到一个更平滑的信号 $z$,就可以考虑:

$$ \min_z \Vert z - y \Vert_2^2 + \alpha z^TLz $$

第一项表示 $z$ 不要离原始信号 $y$ 太远。

第二项表示 $z$ 在图上要尽量平滑。

其中 $\alpha > 0$ 控制平滑的强度。

这个形式和普通正则化非常像:一边要求拟合原数据,一边要求解满足某种稳定性或者平滑性。

如果换到图谱域里看,这个问题会更清楚。由于

$$ z^TLz = \sum_i \lambda_i \hat{z}_i^2 $$

所以正则项对每个频率的惩罚并不一样。

低频对应的 $\lambda_i$ 小,惩罚也小;高频对应的 $\lambda_i$ 大,惩罚也大。

因此这个正则化会更愿意保留低频成分,同时压制高频成分。

如果把解写出来,可以得到类似这样的谱域形式:

$$ \hat{z}_i = \frac{1}{1 + \alpha \lambda_i}\hat{y}_i $$

这就非常像一个低通滤波器。

当 $\lambda_i$ 很小时,$\frac{1}{1 + \alpha \lambda_i}$ 接近 $1$,对应的低频成分基本保留。

当 $\lambda_i$ 很大时,$\frac{1}{1 + \alpha \lambda_i}$ 会变小,对应的高频成分被压下去。

所以从 GSP 的角度看,图上的平滑正则化不是一个抽象的惩罚项,而是在谱域里做了一次低通滤波。

这也解释了为什么 GNN 里经常会出现“平滑”“低通”“过平滑”这些说法:很多消息传递操作,本质上都会让节点表示更接近邻居,也就是压制图上的高频变化。

和数值计算的关系

虽然傅里叶变换最开始看起来像是信号处理里的东西,但谱域的思想在数值计算里也会反复出现。

一个很典型的例子是微分。

如果对 $f(t)$ 求导,那么在傅里叶域中有:

$$ \widehat{f'}(\omega) = i\omega \hat{f}(\omega) $$

也就是说,求导在时域里是一个局部变化率的问题,但到了频域里,就变成了乘上 $i\omega$。

二阶导数则对应:

$$ \widehat{f''}(\omega) = -\omega^2 \hat{f}(\omega) $$

这解释了为什么高频部分在微分运算下会被放大得更厉害。因为频率越高,乘上的 $\omega$ 或 $\omega^2$ 就越大。

所以很多微分方程、偏微分方程、数值稳定性问题,都可以从谱域里得到更清楚的解释。

再比如卷积。

如果一个数值问题里有大量卷积计算,那么直接在原空间里算可能很慢。但如果先用 FFT 变到频域,把卷积变成乘法,再变回来,计算速度就可能快很多。

这就是很多快速算法的基本思路。

从傅里叶谱到矩阵谱

傅里叶分析里的谱,描述的是信号在不同频率上的成分。

矩阵里的谱,通常指的是特征值或者奇异值这些东西。

它们看起来不是一回事,但背后的想法有相似之处:都是想找到一组更自然的基本方向,然后把问题拆开来看。

在傅里叶变换中,基本方向是不同频率的振动模式。

在线性代数中,基本方向可能是特征向量或者奇异向量。

如果一个问题在原来的表示下是耦合的,那么换到合适的谱域后,它可能会变成每个分量上的独立变化。

这也是为什么谱会在很多地方出现:

  • 傅里叶变换中,谱描述不同频率的强度
  • 图信号处理中,谱描述图上不同平滑程度的变化模式
  • 矩阵分析中,谱描述线性变换在不同方向上的伸缩
  • 正则化中,谱可以用来判断哪些方向不稳定
  • 迭代法中,谱半径会影响迭代是否收敛

所以谱域本质上不是某个固定公式,而是一种观察方式。

小结

傅里叶变换告诉我们,一个复杂信号可以被拆成许多简单的频率成分。

时域里看到的是信号在每个时刻的取值,频域里看到的是信号由哪些频率组成。

这种视角的价值在于:很多原空间中复杂的操作,在谱域里会变得更简单。滤波可以看成对不同频率加权,卷积可以变成乘法,微分可以变成乘上频率相关的系数。

因此谱域不是一个脱离原问题的新世界,而是原问题的一种更适合分析和计算的表达方式。

从傅里叶变换到矩阵谱,再到数值计算中的稳定性和正则化,背后反复出现的都是同一个想法:

换到一组更自然的基下,把复杂的整体问题拆成许多可以单独理解的分量。