本文不会严格地从泛函分析或者调和分析的角度展开,而是从直觉上理解傅里叶变换和谱域的含义。重点不是证明定理,而是弄清楚为什么换到谱域之后,很多原本缠在一起的问题会突然变得清楚。
谱域
一个信号最直接的表示方式,是看它在每个位置或者每个时刻的取值。
比如一个关于时间的函数:
$$ 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 变到频域,把卷积变成乘法,再变回来,计算速度就可能快很多。
这就是很多快速算法的基本思路。
从傅里叶谱到矩阵谱
傅里叶分析里的谱,描述的是信号在不同频率上的成分。
矩阵里的谱,通常指的是特征值或者奇异值这些东西。
它们看起来不是一回事,但背后的想法有相似之处:都是想找到一组更自然的基本方向,然后把问题拆开来看。
在傅里叶变换中,基本方向是不同频率的振动模式。
在线性代数中,基本方向可能是特征向量或者奇异向量。
如果一个问题在原来的表示下是耦合的,那么换到合适的谱域后,它可能会变成每个分量上的独立变化。
这也是为什么谱会在很多地方出现:
- 傅里叶变换中,谱描述不同频率的强度
- 图信号处理中,谱描述图上不同平滑程度的变化模式
- 矩阵分析中,谱描述线性变换在不同方向上的伸缩
- 正则化中,谱可以用来判断哪些方向不稳定
- 迭代法中,谱半径会影响迭代是否收敛
所以谱域本质上不是某个固定公式,而是一种观察方式。
小结
傅里叶变换告诉我们,一个复杂信号可以被拆成许多简单的频率成分。
时域里看到的是信号在每个时刻的取值,频域里看到的是信号由哪些频率组成。
这种视角的价值在于:很多原空间中复杂的操作,在谱域里会变得更简单。滤波可以看成对不同频率加权,卷积可以变成乘法,微分可以变成乘上频率相关的系数。
因此谱域不是一个脱离原问题的新世界,而是原问题的一种更适合分析和计算的表达方式。
从傅里叶变换到矩阵谱,再到数值计算中的稳定性和正则化,背后反复出现的都是同一个想法:
换到一组更自然的基下,把复杂的整体问题拆成许多可以单独理解的分量。