目录

从傅里叶级数到快速傅里叶变换


   初学傅里叶分析时,我对它的理解相当零散。那时更多只是调用一下 FFT,画出频谱图,看看主频位置,却很难把这些操作和背后的理论真正联系起来。随着学习逐步深入,我越来越意识到,傅里叶分析并不是若干公式的简单拼接,而是一套结构高度统一的频域分析方法。也正因为此前一直缺少一次完整梳理,到了数字信号处理后面的内容时,常常会感到概念之间联系不够清楚。写下这篇文章,主要就是想沿着一条尽量连贯的主线,把这部分内容从头整理一遍。


引言

   傅里叶分析方法的建立有着一段跨越数个世纪的悠久历史。其核心思想——用三角函数(即正弦和余弦)来描述周期性——最早可以追溯到古代巴比伦人以此来预测天体运动。近代的探讨则始于 1748 年,欧拉 (Euler) 在研究弦振动问题时,推导出了波动方程,并给出了三角级数形式的解。在 18 世纪中叶,这场研究引发了一场激烈的学术争论:是否任何函数都能用三角级数的线性组合来表示?丹尼尔·伯努利 (D. Bernoulli) 曾对此持肯定态度,但拉格朗日 (Lagrange) 等人则持怀疑态度,认为三角级数的应用范围非常有限。直到 19 世纪初,约瑟夫·傅里叶 (Joseph Fourier) 在 1807 年研究热传导问题时,才系统性地提出了一个革命性的观点:任何周期函数(无论多么不规则)都可以表示为三角级数。尽管傅里叶的理论在当时缺乏严格的数学证明(后来由狄利克雷 (Dirichlet) 等人完善),但他开创性的工作极大地推动了数学和物理学的发展。

   从连续时间到离散时间,傅里叶分析的理论不断演进。而真正使其在数字时代大放异彩的,是 20 世纪 60 年代中期快速傅里叶变换 (FFT) 算法的出现。1965 年,库利 (Cooley) 和图基 (Tukey) 重新发现了这一高效算法,它将相关计算的复杂度显著降低。这一飞跃使得许多过去因计算量过大而“不切实际的想法”成为了现实,彻底改变了数字信号处理的面貌。

   从傅里叶级数的理论雏形,到快速傅里叶变换的工程落地,这体现了一条由数学理论逐步走向工程应用的发展路径。这其中关于“时域”与“频域”转换的深刻思想,早已成为现代科学研究的基石。下面就沿着这条主线,逐步梳理傅里叶分析中几个最核心的对象及其关系。

傅里叶级数

   在学习傅里叶级数时,大多教材是从级数的概念出发,一步一步引出傅里叶级数。这种逻辑链条从数学上无可指摘,但是对于真正理解傅里叶级数有很大的障碍。事实上,对于傅里叶级数,最重要的是理解 “正交性” ,甚至可以说这是整个傅里叶分析的基石。明白了这一点,那些积分公式其实就是线性代数中的“投影”。

   首先,我们需要一个研究对象: 连续的、周期的函数 $f(t)$ 。假设它的周期是 $T$ ,那么 (基波) 角频率就是 $w_0 = \frac{2 \pi}{T}$ 。傅里叶的想法是:任何周期函数 $f(t)$ 都可以写成一系列三角函数的线性组合。写成数学表达式就是我们熟悉的那个公式:

$$ f(t) = \frac{a_0}{2} + \sum_{n=1}^{\infty} \left[ a_n \cos(n\omega_0 t) + b_n \sin(n\omega_0 t) \right] $$

现在的核心任务是:如何求出系数$a_0,a_n,b_n$ ?

   在求解系数之前,我们需要引入一个强大的数学工具,即线性代数中的 “正交性” (Orthogonality):如果两个向量 $u$ 和 $v$ 正交,那么它们的点积(内积)为零:

$$ u \cdot v = 0 $$

傅里叶分析的精髓在于:将函数空间视为无限维的向量空间。在这里,“函数”是“向量”,“积分”则是“内积”。对于定义在 $[0, T]$ 上的两个实函数 $g(t)$ 和 $h(t)$,它们的内积定义为:

$$ \langle g, h \rangle = \int_{0}^{T} g(t) h(t) \, dt $$

可以发现,三角函数系 $\{1, \cos(n\omega_0 t), \sin(n\omega_0 t) \mid n=1,2,\dots\}$ 具有完美的正交性质:系内任意两个不同的函数,在单一周期 $T$ 内的内积都为 0

  1. 不同频率的余弦/正弦互积为 0 ($n \neq m$):

    $$ \int_{0}^{T} \cos(n\omega_0 t) \cos(m\omega_0 t) \, dt = 0 $$
  2. 正弦和余弦互积永远为 0 (无论 $n, m$ 是否相等):

    $$ \int_{0}^{T} \sin(n\omega_0 t) \cos(m\omega_0 t) \, dt = 0 $$
  3. 同频率的自积不为 0

    $$ \int_{0}^{T} \cos^2(n\omega_0 t) \, dt = \frac{T}{2}, \quad \int_{0}^{T} \sin^2(n\omega_0 t) \, dt = \frac{T}{2} $$

就像在三维空间中,$x, y, z$ 轴是互相垂直(正交)的。三角函数系就是函数空间里的一组“坐标轴”,而集合$\{1, \cos(n\omega_0 t), \sin(n\omega_0 t) \mid n=1,2,\dots\}$ 就是线性代数中的一组 正交基。接下来我们要利用上面的正交性质,把 $f(t)$ 中的某一分量提取出来,这一步是物理意义最明显的。

   对于直流分量 $a_0$ ,我们在等式两边同时在 $[0, T]$ 上积分:

$$ \int_{0}^{T} f(t) \, dt = \int_{0}^{T} \frac{a_0}{2} \, dt + \sum \int (\dots) $$

根据正交性,后面所有的 $\sin$ 和 $\cos$ 在一个周期内的积分都是 0。 只剩下:

$$ \int_{0}^{T} f(t) \, dt = \frac{a_0}{2} \cdot T $$

所以:

$$ a_0 = \frac{2}{T} \int_{0}^{T} f(t) \, dt $$

注:有的教材把常数项写成 $a_0$ 而不是 $a_0/2$,那样公式里就是 $1/T$。为了和后面 $a_n$ 统一,通常写成 $a_0/2$

   对于余弦系数 $a_n$,我们要把 $a_n$ 对应的那个 $\cos(n\omega_0 t)$ 提取出来。实际上,我们在求 $a_n$ 时,是用一个频率为 $n\omega_0$ 的探测波去和原始信号 $f(t)$ 做乘法并积分。如果 $f(t)$ 里含有这个频率的成分,积分结果就不为零(产生共振);如果不含,结果就是零。也就是将时域上的 $f(t)$ 投影到频域中,而频域的坐标轴就是我们前面提到的集合$\{1, \cos(n\omega_0 t), \sin(n\omega_0 t) \mid n=1,2,\dots\}$ 。

首先等式两边同时乘以 $\cos(m\omega_0 t)$,然后积分:

$$ \int_{0}^{T} f(t) \cos(m\omega_0 t) \, dt = \int_{0}^{T} \left( \sum a_n \cos(n\omega_0 t) \right) \cos(m\omega_0 t) \, dt + \dots $$

根据正交性,只有当 $n=m$ 时,积分才不为 0,其他项全部消失,等式右边变成了:

$$ a_m \cdot \int_{0}^{T} \cos^2(m\omega_0 t) \, dt = a_m \cdot \frac{T}{2} $$

所以:

$$ a_n = \frac{2}{T} \int_{0}^{T} f(t) \cos(n\omega_0 t) \, dt $$

   对于正弦系数 $b_n$,同理,两边乘以 $\sin(m\omega_0 t)$ 并积分,可以得到:

$$ b_n = \frac{2}{T} \int_{0}^{T} f(t) \sin(n\omega_0 t) \, dt $$

💡 深入思考:为什么系数是 $2/T$ ?

在线性代数中,向量 $\vec{v}$ 在基向量 $\vec{u}$ 上的投影系数是 $\frac{\vec{v} \cdot \vec{u}}{||\vec{u}||^2}$。

这里的 $\frac{2}{T}$ 正是基向量模长平方的倒数:$||\cos(n\omega_0 t)||^2 = \int_0^T \cos^2(\cdot) dt = \frac{T}{2}$。取倒数即为 $\frac{2}{T}$。

而对于直流分量 $a_0$,由于基向量“1”的模长平方是 $\int_0^T 1^2 dt = T$,为了保持公式形式上的统一(都使用 $2/T$),我们将级数的第一项写作 $a_0/2$。

   到这里,傅里叶级数的形式和系数公式都已经得到了。但如果只停留在公式层面,仍然容易觉得它只是“会算积分”的技巧,而没有真正理解它在做什么。实际上,傅里叶级数的核心不是把一个函数“强行拆开”,而是把它写成一组正交基上的展开。展开后的每一个系数,都对应着原函数在某个频率方向上的“分量大小”。

   这时再回头看下面三个系数公式:

$$ a_0 = \frac{2}{T} \int_{0}^{T} f(t)\,dt $$$$ a_n = \frac{2}{T} \int_{0}^{T} f(t)\cos(n\omega_0 t)\,dt $$$$ b_n = \frac{2}{T} \int_{0}^{T} f(t)\sin(n\omega_0 t)\,dt $$

就会发现它们的结构非常统一。$a_0$ 描述的是函数的平均水平,也就是直流分量;$a_n$ 描述的是第 $n$ 个余弦分量的强弱;$b_n$ 描述的是第 $n$ 个正弦分量的强弱。换句话说,一个周期函数虽然在时域里看起来可能很复杂,但在频域里,它只是由一串离散的频率成分叠加而成,而这些系数正是这些频率成分的“权重”。

   从这个角度看,傅里叶级数其实回答了一个很本质的问题:一个周期信号究竟由哪些频率组成,每个频率占多大比重? 这也是后面整个傅里叶分析体系不断发展的起点。

对称性

   在实际计算中,并不是每一次都需要把 $a_0$、$a_n$、$b_n$ 全部老老实实积分一遍。很多函数本身带有对称性,而对称性会直接决定某些系数必然为零。这个结论非常重要,因为它能让我们在不计算的前提下,先看出级数的大致结构。

   首先考虑 偶函数 (Even Function)。如果一个周期函数满足:

$$ f(-t)=f(t) $$

那么它关于原点左右对称。此时:

  • 偶函数与偶函数相乘仍是偶函数;
  • 偶函数与奇函数相乘是奇函数;
  • 一个奇函数在对称区间上的积分为 0。

而 $\cos(n\omega_0 t)$ 是偶函数,$\sin(n\omega_0 t)$ 是奇函数,因此:

$$ f(t)\sin(n\omega_0 t) $$

是奇函数,于是有:

$$ b_n = 0 $$

也就是说,偶函数的傅里叶级数中只含余弦项,不含正弦项

   同理,如果 $f(t)$ 是 奇函数 (Odd Function),满足:

$$ f(-t)=-f(t) $$

那么:

  • 奇函数与余弦相乘是奇函数;
  • 奇函数与正弦相乘是偶函数。

因此可以得到:

$$ a_0 = 0,\qquad a_n = 0 $$

也就是说,奇函数的傅里叶级数中只含正弦项,不含余弦项

   这个结论并不复杂,但在实际分析中非常有用。因为它表明傅里叶级数并不是一套僵硬的通用模板,而是会根据函数本身的结构自动“裁剪”出更简洁的形式。很多经典信号之所以最后只剩一类项,并不是巧合,而是对称性直接决定的。

方波示例

   只看一般公式还是有些抽象,下面来看一个最经典的例子:方波 (Square Wave)。我们定义一个周期为 $T$ 的函数,在一个对称周期 $\left[-\frac{T}{2}, \frac{T}{2}\right]$ 上满足:

$$ f(t)= \begin{cases} A, & 0并以周期 $T$ 延拓到整个时间轴上。

   这个函数有几个明显特点:

  1. 它是周期函数;
  2. 它是奇函数,因为 $f(-t)=-f(t)$;
  3. 因此它的傅里叶级数中只会有正弦项。

所以我们立刻可以写出:

$$ a_0 = 0,\qquad a_n = 0 $$

只需要计算:

$$ b_n = \frac{2}{T}\int_{-T/2}^{T/2} f(t)\sin(n\omega_0 t)\,dt $$

由于 $f(t)$ 和 $\sin(n\omega_0 t)$ 都是奇函数,它们的乘积是偶函数,因此可以把积分区间化为一半再乘 2:

$$ b_n = \frac{4}{T}\int_{0}^{T/2} A\sin(n\omega_0 t)\,dt $$

把常数提出去:

$$ b_n = \frac{4A}{T}\int_{0}^{T/2}\sin(n\omega_0 t)\,dt $$

积分后得到:

$$ b_n = \frac{4A}{T}\left[-\frac{1}{n\omega_0}\cos(n\omega_0 t)\right]_{0}^{T/2} $$

又因为 $\omega_0=\frac{2\pi}{T}$,所以:

$$ n\omega_0\frac{T}{2}=n\pi $$

于是:

$$ b_n = \frac{4A}{T}\cdot \frac{1}{n\omega_0}\left(1-\cos n\pi\right) $$

再利用 $\omega_0=\frac{2\pi}{T}$ 化简:

$$ b_n = \frac{2A}{n\pi}\left(1-\cos n\pi\right) $$

由于:

$$ \cos n\pi = (-1)^n $$

所以:

  • 当 $n$ 为偶数时,$1-(-1)^n=0$;
  • 当 $n$ 为奇数时,$1-(-1)^n=2$。

因此最终有:

$$ b_n = \begin{cases} \frac{4A}{n\pi}, & n=1,3,5,\dots \\ 0, & n=2,4,6,\dots \end{cases} $$

于是这个方波的傅里叶级数可以写成:

$$ f(t)=\frac{4A}{\pi}\left(\sin\omega_0 t+\frac{1}{3}\sin 3\omega_0 t+\frac{1}{5}\sin 5\omega_0 t+\cdots\right) $$

方波的傅里叶级数逼近
方波的傅里叶级数逼近 点击查看大图

   这个展开式非常值得仔细看。一个看起来很“生硬”的方波,竟然可以由一串平滑的正弦波叠加出来,而且只需要奇次谐波,即 $\omega_0,3\omega_0,5\omega_0,\dots$ 这些频率成分。这说明傅里叶级数并不要求原函数本身长得像三角函数,它只要求这些三角函数足够“完备”,能够通过线性叠加逼近原函数。

   同时,从系数

$$ \frac{4A}{n\pi} $$

也可以看出,高频项的幅值会随着 $n$ 的增大而逐渐衰减。这一点非常重要,因为它意味着:虽然一个信号理论上可能包含无穷多个谐波,但真正起主要作用的,往往是前面若干个低频分量。后面高频项虽然不可或缺,但影响会越来越小。

   如果只取前一项,那么得到的是一个正弦波;如果取前三项,也就是:

$$ \frac{4A}{\pi}\left(\sin\omega_0 t+\frac{1}{3}\sin3\omega_0 t+\frac{1}{5}\sin5\omega_0 t\right) $$

那么波形就已经开始接近方波;随着保留项数不断增加,重建出来的曲线会越来越接近原始方波。也就是说,傅里叶级数不仅在理论上给出了展开公式,还告诉我们:复杂波形可以由简单波形逐步逼近出来

   到这里,我们已经能真正体会傅里叶级数的两个基本作用。第一,它给出了周期函数在频率坐标系中的表示方式;第二,它把“分析信号”这件事转化成了“分析各个谐波系数”这件事。这也是为什么在工程中,人们往往并不直接盯着时域波形,而更关心它在不同频率上的成分分布。

   不过,新的问题也随之出现:既然只取有限项就能逼近原函数,那么这种逼近究竟是如何收敛的?在函数存在跳变时,级数在跳变点附近又会发生什么?这些问题会自然引出傅里叶级数收敛性的讨论,以及后面非常经典的吉布斯现象。

收敛与逼近

   上一节最后提到,一个周期函数可以由越来越多的三角函数叠加来逼近。那么一个很自然的问题是:这种逼近到底是不是可靠的? 更具体地说,当我们把傅里叶级数取到无穷项时,它是否真的会回到原来的函数 $f(t)$ ?

   这个问题并不像表面看起来那么简单。因为“函数收敛”本身就有不同含义:是每一点都收敛,还是整体意义下收敛;是在函数值上完全一致,还是只要求误差越来越小。傅里叶级数的收敛问题,正是整个傅里叶分析中最早也是最重要的问题之一。

收敛的基本对象

   在讨论收敛之前,我们先引入一个更具体的对象:部分和 (Partial Sum)。对于傅里叶级数

$$ f(t)=\frac{a_0}{2}+\sum_{n=1}^{\infty}\left[a_n\cos(n\omega_0 t)+b_n\sin(n\omega_0 t)\right] $$

如果我们只取前 $N$ 项,就得到第 $N$ 个部分和:

$$ S_N(t)=\frac{a_0}{2}+\sum_{n=1}^{N}\left[a_n\cos(n\omega_0 t)+b_n\sin(n\omega_0 t)\right] $$

   它表示的是:如果我们只保留有限个频率分量,那么能恢复出一个什么样的波形。严格来说,傅里叶级数是否收敛,就是在问:

$$ \lim_{N\to\infty}S_N(t) $$

是否存在,以及它等于什么。

   这一点很关键。因为在工程中,真正能计算和使用的永远都是有限项,也就是某个部分和,而不是“无穷多项”的理想表达式。所以理解部分和的行为,不仅是数学问题,也直接关系到我们如何看待频谱截断、信号重建和近似误差。

   对于“什么样的函数能够由傅里叶级数正确表示”,数学上有一组经典的充分条件,通常称为 狄利克雷条件 (Dirichlet Conditions)。如果一个周期函数在一个周期内满足以下条件:

  1. 绝对可积;
  2. 极值点的个数有限;
  3. 间断点的个数有限,并且这些间断都是有限跳变;

那么它的傅里叶级数在大多数位置都具有良好的收敛性质。

   对于这类函数,傅里叶级数的收敛结论可以简洁地表述为:

  • 在函数的连续点处,傅里叶级数收敛到函数本身;
  • 在函数的跳变点处,傅里叶级数收敛到跳变两侧极限的平均值。

用数学语言写就是:

若 $t_0$ 是连续点,则

$$ \lim_{N\to\infty}S_N(t_0)=f(t_0) $$

若 $t_0$ 是跳变点,则

$$ \lim_{N\to\infty}S_N(t_0)=\frac{f(t_0^-)+f(t_0^+)}{2} $$

其中 $f(t_0^-)$ 和 $f(t_0^+)$ 分别表示左极限和右极限。

   这里的结论值得单独强调。它说明傅里叶级数并不是在所有点都“死板地等于原函数”,而是按照一种更合理的方式去逼近它。对于连续点,它还原原函数;对于跳变点,它取左右极限的中点。这个处理方式其实很自然,因为跳变点本身就是原函数最不平滑、最难逼近的位置。

   现在回到上一节的方波。它的傅里叶级数是:

$$ f(t)=\frac{4A}{\pi}\left(\sin\omega_0 t+\frac{1}{3}\sin3\omega_0 t+\frac{1}{5}\sin5\omega_0 t+\cdots\right) $$

这个方波除了跳变点外,在其他位置都很“规整”,因此满足狄利克雷条件。于是我们立刻可以得到:

  • 在非跳变点,傅里叶级数收敛到方波原本的函数值;
  • 在跳变点,比如 $t=0,\pm T/2,\dots$ 处,级数收敛到左右极限的平均值。

对于我们定义的方波来说,跳变点左右两边分别是 $A$ 和 $-A$,所以平均值为:

$$ \frac{A+(-A)}{2}=0 $$

也就是说,在这些跳变位置上,傅里叶级数最终收敛到 0,而不是 $A$ 或 $-A$。

   这这已经说明了一个很重要的事实:傅里叶级数恢复的不是“每一个点的原始写法”,而是函数整体的频率结构。 对于大多数点,它与原函数完全一致;对于个别跳变点,它给出的是一个更稳定的极限值。

吉布斯现象

   但是,事情还没有结束。即使我们已经知道了收敛结论,方波的部分和在图像上仍然会表现出一个十分典型的现象:在跳变点附近,总会出现明显的振荡,并且会在跳变两侧出现“超过原函数高度”的过冲。这就是著名的 吉布斯现象 (Gibbs Phenomenon)

   先看直观结果。假设我们只取方波傅里叶级数的前几项:

$$ S_1(t)=\frac{4A}{\pi}\sin\omega_0 t $$

这只是一个普通正弦波,显然和方波差得很远。再多取几项:

$$ S_3(t)=\frac{4A}{\pi}\left(\sin\omega_0 t+\frac{1}{3}\sin3\omega_0 t+\frac{1}{5}\sin5\omega_0 t\right) $$

波形已经开始变得“更方”了。继续增加项数,波形主体会越来越接近理想方波,但在每一个跳变位置附近,都会出现一串局部振荡,并且最高点会略微超过 $A$,最低点会略微低于 $-A$。

   更值得注意的是:随着项数 $N$ 增大,这种振荡区域会越来越窄,也就是说它会越来越集中在跳变点附近;但是它的最大过冲幅度并不会趋于零。换句话说,误差被压缩到了更小的区域里,但没有在峰值上彻底消失。

   从本质上看,吉布斯现象并不神秘。它来自一个很直接的矛盾:我们试图用一组连续、光滑的三角函数,去逼近一个存在突然跳变的不连续函数。单个正弦波显然无法产生“垂直跳变”,即使无穷多个正弦波叠加,也只能在跳变点附近通过越来越剧烈的局部振荡去逼近这个不连续结构。

跳变点附近的吉布斯现象
跳变点附近的吉布斯现象 点击查看大图

   因此,吉布斯现象不是某种计算失误,也不是傅里叶级数“失效”了,而是用光滑基函数逼近不连续函数时不可避免的结果。它提醒我们一件事:频域分析虽然强大,但它并不会自动抹平原函数本身的结构限制。

   初次看到吉布斯现象时,很容易误以为“傅里叶级数在跳变点附近不收敛”。这种说法并不准确。更准确地说是:

  • 对于固定的某一个非跳变点,随着 $N\to\infty$,部分和 $S_N(t)$ 会收敛到原函数值;
  • 对于跳变点本身,$S_N(t)$ 会收敛到左右极限的平均值;
  • 但是在跳变点附近的一小段区域里,总会存在明显振荡,而这种振荡的峰值不会完全消失。

   也就是说,吉布斯现象反映的不是“点态极限不存在”,而是“局部逼近的方式带有固有振荡”。这一区分非常重要。因为傅里叶级数在整体上依然是有效的,在信号分析中依然非常有价值,只是在处理边缘、突变、不连续结构时,需要意识到这种局部误差是不可忽略的。

   通过这一节,其实已经可以看出傅里叶级数的一个基本特点:它非常擅长表示整体的频率构成,却不擅长在局部突然变化的位置保持“干净利落”的表达。平滑区域越平滑,傅里叶级数往往越高效;跳变越明显,高频成分就越多,局部振荡问题也越突出。

   这也为后面的内容埋下了伏笔。既然周期函数可以写成离散频率的叠加,那么对于非周期函数,是否也能找到类似的频率表示?如果可以,那么原先离散的频率点,是否会逐渐变成连续的频率轴?沿着这个问题继续推进,就会自然地从傅里叶级数走向傅里叶变换。

从傅里叶级数到傅里叶变换

   到目前为止,我们讨论的对象一直是周期函数。对于周期函数,傅里叶级数告诉我们:它可以分解为一系列离散的正弦和余弦分量,也就是说,它的频率成分只出现在 $\omega_0,2\omega_0,3\omega_0,\dots$ 这些基波频率及其整数倍上。

   但是,现实中大量信号其实都不是严格周期的。例如一段语音、一次脉冲、一个有限时长的测量记录,通常都不会无限重复。于是一个新的问题自然出现了:如果信号不是周期的,还能不能用频率的观点去描述它?

   如果答案是可以,那么对应的“频率表示”又会是什么样子?这一问题,正是傅里叶变换出现的根源。

从周期延拓到连续频谱

   要从傅里叶级数走向傅里叶变换,一个很自然的思路是:虽然非周期函数本身不能直接展开为傅里叶级数,但我们可以先构造一个“和它很接近”的周期函数。

   设有一个原本定义在整个时间轴上的非周期函数 $f(t)$。现在,我们先只取其中一段长度为 $T$ 的部分,然后把这段信号按周期 $T$ 不断重复,构造出一个新的周期函数,记为 $f_T(t)$。这样一来,$f_T(t)$ 就可以写成傅里叶级数:

$$ f_T(t)=\sum_{n=-\infty}^{\infty} c_n e^{j n\omega_0 t} $$

其中

$$ \omega_0=\frac{2\pi}{T} $$

而复指数形式下的傅里叶级数系数为:

$$ c_n=\frac{1}{T}\int_{-T/2}^{T/2} f_T(t)e^{-j n\omega_0 t}\,dt $$

   这里改用复指数形式,会让后面的推导更紧凑。因为正弦和余弦本来就可以由复指数统一表示,而复指数形式能把一对系数 $a_n,b_n$ 合并成一个复系数 $c_n$,从而更清楚地呈现出频率结构。

   根据欧拉公式 (Euler’s Formula):

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

可以知道,余弦和正弦实际上就是复指数的实部和虚部。因此,原本写成

$$ \frac{a_0}{2}+\sum_{n=1}^{\infty}\left[a_n\cos(n\omega_0 t)+b_n\sin(n\omega_0 t)\right] $$

的表达式,也可以改写成一组正负频率共同参与的复指数叠加:

$$ f_T(t)=\sum_{n=-\infty}^{\infty} c_n e^{j n\omega_0 t} $$

   这个式子形式上只是换了一种写法,但它有一个非常重要的优点:每一项都直接对应一个频率点

$$ \omega_n=n\omega_0 $$

于是整个傅里叶级数就可以看成是:在一组离散频率点上的加权求和。

   这句话非常关键,因为后面傅里叶变换本质上就是把这种“离散频率点上的求和”,推到“连续频率轴上的积分”。

   现在来看最关键的一步。我们构造的 $f_T(t)$ 本质上是把原函数截取一段后不断重复得到的。显然,当周期 $T$ 较小时,重复现象很明显,它和原始的非周期函数相差很大;但如果我们让 $T$ 越来越大,那么同一段信号被重复的间隔就越来越远,在有限范围内看,$f_T(t)$ 就会越来越接近原始的非周期函数 $f(t)$。

   也就是说,当

$$ T\to\infty $$

时,周期延拓的痕迹逐渐消失,周期函数 $f_T(t)$ 会在直观上逼近非周期函数 $f(t)$。

   与此同时,基波频率

$$ \omega_0=\frac{2\pi}{T} $$

会越来越小。这意味着原来傅里叶级数中的离散频率点

$$ \omega_n=n\omega_0 $$

之间的间隔会越来越密。原本这些频率点是一个一个分开的,但随着 $T$ 增大,它们会在频率轴上排得越来越紧,最终从“离散点列”过渡为“连续频率轴”。

   这也是从傅里叶级数走向傅里叶变换的核心图景:

  • 对于周期函数,频谱是离散的;
  • 当周期趋于无穷大时,频率点间隔趋于 0;
  • 离散谱逐渐过渡为连续谱。

   现在把傅里叶级数写成:

$$ f_T(t)=\sum_{n=-\infty}^{\infty} c_n e^{j n\omega_0 t} $$

再将系数表达式代入:

$$ c_n=\frac{1}{T}\int_{-T/2}^{T/2} f_T(\tau)e^{-j n\omega_0 \tau}\,d\tau $$

于是有:

$$ f_T(t)=\sum_{n=-\infty}^{\infty} \left[ \frac{1}{T}\int_{-T/2}^{T/2} f_T(\tau)e^{-j n\omega_0 \tau}\,d\tau \right] e^{j n\omega_0 t} $$

   接下来要做一个非常关键但形式上很简单的变形。注意到

$$ \frac{1}{T}=\frac{\omega_0}{2\pi} $$

因为 $\omega_0=2\pi/T$。代入后可得:

$$ f_T(t)=\sum_{n=-\infty}^{\infty} \left[ \frac{1}{2\pi}\int_{-T/2}^{T/2} f_T(\tau)e^{-j n\omega_0 \tau}\,d\tau \right] e^{j n\omega_0 t}\,\omega_0 $$

为了书写更清楚,把离散频率记为

$$ \omega=n\omega_0 $$

那么上式就可以看成:

$$ f_T(t)=\sum_{n=-\infty}^{\infty} \left[ \frac{1}{2\pi}\int_{-T/2}^{T/2} f_T(\tau)e^{-j \omega \tau}\,d\tau \right] e^{j \omega t}\,\omega_0 $$

   此时它已经具有明显的积分结构。因为它本质上就是:

  • 在频率点 $\omega=n\omega_0$ 上取值;
  • 每个点的“宽度”是 $\omega_0$;
  • 然后把所有频率点上的贡献加起来。

   它与定积分中的黎曼和形式已经十分接近。

变换的定义

   当 $T\to\infty$ 时,有两件事情同时发生:

  1. $f_T(t)\to f(t)$;
  2. $\omega_0\to 0$,离散频率点变得无限稠密。

于是,上面的求和就会过渡为对整个频率轴的积分。此时我们定义:

$$ F(\omega)=\int_{-\infty}^{\infty} f(t)e^{-j\omega t}\,dt $$

这个函数 $F(\omega)$ 就称为函数 $f(t)$ 的傅里叶变换 (Fourier Transform)

   于是原来的求和极限就变成了:

$$ f(t)=\frac{1}{2\pi}\int_{-\infty}^{\infty} F(\omega)e^{j\omega t}\,d\omega $$

这就是傅里叶逆变换 (Inverse Fourier Transform)

   到这里,傅里叶级数和傅里叶变换之间的关系就清楚了。它们并不是两套毫无关联的工具,而是同一个思想在不同对象上的延伸:

  • 傅里叶级数处理周期函数,对应离散频谱;
  • 傅里叶变换处理非周期函数,对应连续频谱。

   傅里叶变换得到的 $F(\omega)$,本质上仍然是在问同一个问题:原函数中包含了哪些频率成分,以及每个频率成分有多强。只不过在傅里叶级数中,这些频率是一个一个分立的;而在傅里叶变换中,频率变量 $\omega$ 变成了连续变量,因此频谱也从一串离散系数变成了一个连续函数。

   这时再回头看前面的结论,就会发现它们其实前后统一:

  • 周期信号的能量集中在若干离散频率点上;
  • 非周期信号不再只对应有限或可数个频率点,而是在整个频率轴上分布。

   因而,$F(\omega)$ 可以理解为:在频率 $\omega$ 处,原函数 $f(t)$ 与复指数基函数 $e^{j\omega t}$ 之间的匹配程度。它仍然是一种“投影”,只是原先的基底是离散的,现在变成了连续的一整条频率轴。

   从傅里叶级数到傅里叶变换,真正变化的并不是分析思想,而是分析对象:

  • 当对象是周期函数时,用一组离散谐波来展开;
  • 当对象扩展到非周期函数时,这组离散谐波的间隔不断缩小,最终形成连续频率表示。

   换句话说,傅里叶变换并不是“凭空定义出来的新公式”,而是傅里叶级数在周期趋于无穷大这一极限过程下的自然结果。理解了这一点,后面再去看傅里叶变换的性质、频谱图、采样和离散傅里叶变换时,就不会觉得它们只是一些孤立的结论,而会知道它们都来自同一个非常连贯的逻辑链条。

   不过,虽然我们已经得到了傅里叶变换的定义式和逆变换式,但还有一个问题没有解决:这个变换式究竟应该怎么理解?其中的复数、正负频率、幅度和相位各自代表什么?这些问题需要在下一节中进一步展开。

傅里叶变换的理解

   上一节中,我们已经从傅里叶级数自然过渡到了傅里叶变换,并得到了它的定义式:

$$ F(\omega)=\int_{-\infty}^{\infty} f(t)e^{-j\omega t}\,dt $$

以及逆变换式:

$$ f(t)=\frac{1}{2\pi}\int_{-\infty}^{\infty} F(\omega)e^{j\omega t}\,d\omega $$

   但仅仅写出公式还不够。因为很多时候,初学傅里叶变换真正感到困难的,并不是不会代入定义,而是不清楚这个式子到底在表达什么:为什么这里会出现复数?为什么频率要从 $-\infty$ 到 $+\infty$?频谱图上的幅度和相位到底分别代表什么?这些问题如果不先理清,后面很多结论都会显得十分机械。

连续频率上的投影

   虽然傅里叶变换的形式比傅里叶级数更紧凑,但它的核心思想其实并没有变。前面在讲傅里叶级数时已经提到,求系数的过程本质上是在做“投影”:把原函数投影到某个正交基上,从而提取它在该方向上的分量。

   在傅里叶级数里,基函数是一组离散的三角函数:

$$ 1,\cos(\omega_0 t),\sin(\omega_0 t),\cos(2\omega_0 t),\sin(2\omega_0 t),\dots $$

而在傅里叶变换里,基函数不再是离散的一组,而是覆盖整个频率轴的复指数函数:

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

这里的 $\omega$ 是连续变量,因此我们不再是在有限个频率点上做投影,而是在整条频率轴上不断做投影。

   所以,傅里叶变换公式

$$ F(\omega)=\int_{-\infty}^{\infty} f(t)e^{-j\omega t}\,dt $$

可以直接理解为:用频率为 $\omega$ 的复指数函数去“检测”原函数 $f(t)$ 中是否含有对应的频率成分,以及这种成分有多强。

   如果 $f(t)$ 中和这个频率匹配得很好,那么积分结果就会比较大;如果匹配得不好,正负区域在积分中就会互相抵消,结果就会接近零。这个思想和前面求傅里叶级数系数时,本质上是同一件事,只不过现在频率不再是离散的整数倍,而是连续变化的。

复指数与正负频率

   初学时一个很常见的问题是:既然我们一开始用的是正弦和余弦,为什么到了傅里叶变换这里,突然换成了复指数 $e^{j\omega t}$?

   一个直接原因是,复指数比正弦和余弦更紧凑。根据欧拉公式:

$$ e^{j\omega t}=\cos(\omega t)+j\sin(\omega t) $$

一个复指数实际上同时包含了余弦和正弦两部分信息。这样一来,原本需要分别处理的两组基函数,现在可以统一写成一个对象,大大简化了表达和运算。

   但更重要的是,复指数在微分、积分、时移和卷积等运算下有非常好的形式保持性质。例如:

$$ \frac{d}{dt}e^{j\omega t}=j\omega e^{j\omega t} $$

这意味着在很多分析和推导中,复指数形式会比三角函数形式简洁得多。后面你会看到,傅里叶变换之所以能形成一套非常完整的运算规则,和复指数这个表示方式有很大关系。

   当然,这并不意味着信号本身就必须是“复数的”。对于很多实际问题,原始信号 $f(t)$ 仍然是实值函数。复数只是我们分析它时采用的一种更高效、更统一的数学表示。

   接下来必须处理另一个容易让人困惑的问题:为什么傅里叶变换中的频率变量 $\omega$ 要从 $-\infty$ 到 $+\infty$?难道频率不是天然非负的吗?

   如果只从“每秒振动多少次”这个直觉出发,频率当然是非负的。但在复指数表示下,$e^{j\omega t}$ 和 $e^{-j\omega t}$ 是两类不同的基函数,它们分别对应复平面中的两种旋转方向:

  • $e^{j\omega t}$ 对应一个方向的旋转;
  • $e^{-j\omega t}$ 对应相反方向的旋转。

   因此,在傅里叶分析中,负频率并不是“频率小于零的物理振动”,而是复指数基函数中与正频率方向相反的一类成分。它首先是数学结构上的需要。

   这一点可以从余弦函数看得更清楚。根据欧拉公式,

$$ \cos(\omega_0 t)=\frac{1}{2}e^{j\omega_0 t}+\frac{1}{2}e^{-j\omega_0 t} $$

也就是说,一个实值的余弦信号,其实对应了两个频率分量:一个在 $+\omega_0$,一个在 $-\omega_0$。它们共同叠加后,才形成一个实数波形。

   同理,正弦函数也可以写成:

$$ \sin(\omega_0 t)=\frac{1}{2j}\left(e^{j\omega_0 t}-e^{-j\omega_0 t}\right) $$

因此,在复指数框架下,实信号往往天然对应正负成对的频率分量。正是因为如此,完整的傅里叶变换必须覆盖整个频率轴,而不是只看正半轴。

   如果原函数 $f(t)$ 是实值函数,那么它的傅里叶变换 $F(\omega)$ 会满足一个非常重要的性质:

$$ F(-\omega)=F^*(\omega) $$

其中 $F^*(\omega)$ 表示复共轭。

   这个式子的意义是:对于实信号,负频率部分并不是独立存在的新信息,它和正频率部分互为共轭对称。也正因为如此,我们在很多实际频谱图中常常只画正频率部分,因为另一半可以由对称性恢复出来。

   但这里要注意,“可以只看一半”并不意味着另一半不重要。在理论定义上,正负频率共同构成了完整的频谱结构;只是对于实信号来说,这个结构存在对称冗余。

幅度与相位

   由于傅里叶变换 $F(\omega)$ 一般是复函数,因此它不仅有大小,还有相位。通常我们把它写成极坐标形式:

$$ F(\omega)=|F(\omega)|e^{j\phi(\omega)} $$

其中:

  • $|F(\omega)|$ 称为幅度谱 (Magnitude Spectrum)
  • $\phi(\omega)$ 称为相位谱 (Phase Spectrum)

   幅度谱表示的是:在频率 $\omega$ 附近,信号中对应频率成分有多强。它反映的是“有多少”。

   相位谱表示的是:这些频率成分在时间上的相对对齐关系如何。它反映的是“怎么排”。

   这两者缺一不可。只看幅度谱,虽然可以知道信号包含哪些频率,但往往无法完整恢复原信号的波形结构;只看相位谱则更不够,因为没有幅度信息,频率成分的强弱完全丢失。

   这一点很容易被忽视。很多初学者在看频谱图时,只注意峰值位置和峰值大小,觉得频谱分析就是“看主频”。这在某些简单任务中是够用的,但从完整的信号表达角度看,相位信息同样是构成原信号不可缺少的一部分。

   为了把上面的概念落到具体对象上,我们来看一个最简单的例子:

$$ f(t)=\cos(\omega_0 t) $$

前面已经写过,它可以展开为:

$$ \cos(\omega_0 t)=\frac{1}{2}e^{j\omega_0 t}+\frac{1}{2}e^{-j\omega_0 t} $$

   这意味着,从频域角度看,这个信号并不是只对应一个“频率 $\omega_0$”,而是由位于 $+\omega_0$ 和 $-\omega_0$ 的两项共同组成。它们的权重相同,因此最终得到一个实值的余弦波。

   如果只从幅度谱直观去理解,那么这个信号的频谱就在 $\pm\omega_0$ 处各有一个尖峰;如果进一步考虑相位,那么这两个频率点上的复系数共同决定了时域中余弦波的具体位置和形态。

   这个例子虽然简单,但它已经说明了两件重要的事:

  1. 一个看起来很简单的时域信号,在频域里可能表现为若干离散成分;
  2. 频域中的“一个成分”不仅有频率位置,还有复系数,也就是幅度和相位。

   到这里,可以把傅里叶变换的作用更直白地概括为一句话:

它不是在创造新的信息,而是在改变我们观察信号的坐标系。

   在时域中,我们关心的是信号随时间如何变化;在频域中,我们关心的是信号由哪些频率成分组成。两种表示描述的是同一个对象,只是观察角度不同。

   傅里叶变换之所以重要,不是因为频域“比时域更高级”,而是因为很多问题在频域中会变得更容易分析。例如:

  • 周期性和振荡性在频域中更直接;
  • 微分方程在频域中常能化为代数关系;
  • 卷积运算在频域中会转化为乘法。

   这些优势并不是偶然的,而是因为复指数基函数和线性系统之间存在非常深的结构对应关系。后面讲到傅里叶变换性质时,这一点会变得越来越明显。

   到目前为止,关于傅里叶变换,至少可以先建立以下几个基本认识:

  1. 傅里叶变换本质上仍然是投影,只不过投影基底从离散变成了连续;
  2. 复指数形式不是多此一举,而是为了统一表示和简化运算;
  3. 负频率首先是复指数框架下的数学结构,不应直接按“负的振动次数”去理解;
  4. 对于实信号,频谱通常具有共轭对称性;
  5. 一个完整的频谱包含幅度和相位两部分信息,它们共同决定原始信号。

   理解了这些,再去看傅里叶变换的具体性质,就会清楚很多。因为那些性质并不是孤立的公式技巧,而是在这个整体框架下自然成立的结果。

   接下来,一个很自然的问题是:既然傅里叶变换只是换了一种表示方式,那么这种表示方式到底有哪些稳定、好用的运算规律?例如线性性、时移、频移、尺度变换,以及最重要的卷积与乘积关系,它们共同构成了傅里叶分析真正强大的地方。

傅里叶变换的基本性质

   前面已经说过,傅里叶变换并不是在创造新的信息,而是在时域和频域之间切换观察方式。既然它本质上是一种“表示变换”,那么一个关键问题就是:时域中的各种操作,到了频域以后会变成什么?

   这也是傅里叶变换性质的意义所在。很多在时域中看起来较为复杂的操作,在频域中会变得简单;反过来,某些频域中的结构,也能帮助我们理解时域中的行为。下面先讨论最基础、也最常用的几条性质。

基本对应关系

   线性是傅里叶变换最基本的性质之一。设

$$ f(t)\xleftrightarrow{\mathcal{F}}F(\omega),\qquad g(t)\xleftrightarrow{\mathcal{F}}G(\omega) $$

那么对于任意常数 $a,b$,有:

$$ af(t)+bg(t)\xleftrightarrow{\mathcal{F}}aF(\omega)+bG(\omega) $$

   这个结论几乎可以直接从定义推出:

$$ \mathcal{F}\{af(t)+bg(t)\} =\int_{-\infty}^{\infty}[af(t)+bg(t)]e^{-j\omega t}\,dt $$

利用积分的线性性质,就有:

$$ = a\int_{-\infty}^{\infty}f(t)e^{-j\omega t}\,dt +b\int_{-\infty}^{\infty}g(t)e^{-j\omega t}\,dt $$

因此:

$$ = aF(\omega)+bG(\omega) $$

   线性性质看起来简单,但它非常重要。因为实际信号往往本来就是多个分量的叠加,线性意味着我们可以分别分析每一部分的频谱,再把结果组合起来。这和线性系统分析中的基本思想是一致的。

   接下来考虑一个很常见的操作:把信号沿时间轴平移。设

$$ f(t)\xleftrightarrow{\mathcal{F}}F(\omega) $$

那么对于时移后的信号 $f(t-t_0)$,其傅里叶变换为:

$$ f(t-t_0)\xleftrightarrow{\mathcal{F}}F(\omega)e^{-j\omega t_0} $$

   这个式子很值得仔细体会。它说明:时域中的平移,不会改变频谱的幅度分布,只会引入一个与频率相关的相位因子。

   我们可以直接验证一下:

$$ \mathcal{F}\{f(t-t_0)\} =\int_{-\infty}^{\infty}f(t-t_0)e^{-j\omega t}\,dt $$

$$ \tau=t-t_0,\qquad t=\tau+t_0,\qquad dt=d\tau $$

则有:

$$ =\int_{-\infty}^{\infty}f(\tau)e^{-j\omega(\tau+t_0)}\,d\tau $$

整理得:

$$ =e^{-j\omega t_0}\int_{-\infty}^{\infty}f(\tau)e^{-j\omega\tau}\,d\tau $$

因此:

$$ =e^{-j\omega t_0}F(\omega) $$

   这条性质说明了一个非常重要的事实:信号在时间上“什么时候出现”,主要体现在频域的相位里,而不是体现在幅度里。也就是说,如果两个信号形状完全相同,只是时间位置不同,那么它们的幅度谱是一样的,差别主要在相位谱。

   与时移相对应,频域中也有一个非常重要的平移性质。若

$$ f(t)\xleftrightarrow{\mathcal{F}}F(\omega) $$

则有:

$$ f(t)e^{j\omega_0 t}\xleftrightarrow{\mathcal{F}}F(\omega-\omega_0) $$

   也就是说,时域中乘上一个复指数,会使频谱沿频率轴平移。

   证明同样直接来自定义:

$$ \mathcal{F}\{f(t)e^{j\omega_0 t}\} =\int_{-\infty}^{\infty}f(t)e^{j\omega_0 t}e^{-j\omega t}\,dt $$

合并指数项:

$$ =\int_{-\infty}^{\infty}f(t)e^{-j(\omega-\omega_0)t}\,dt $$

因此:

$$ =F(\omega-\omega_0) $$

   这条性质在通信、调制和频谱搬移中非常常见。它说明:如果一个信号原本集中在低频附近,那么乘上一个高频载波后,它的频谱会整体搬移到载波频率附近。

   特别地,如果乘的是余弦函数,由于

$$ \cos(\omega_0 t)=\frac{1}{2}e^{j\omega_0 t}+\frac{1}{2}e^{-j\omega_0 t} $$

那么频谱通常会被分成左右两个平移副本。这也是很多调制现象背后的基本结构。

   现在考虑时间轴上的拉伸和压缩。若

$$ f(t)\xleftrightarrow{\mathcal{F}}F(\omega) $$

则有:

$$ f(at)\xleftrightarrow{\mathcal{F}}\frac{1}{|a|}F\left(\frac{\omega}{a}\right),\qquad a\neq 0 $$

   这个结论表明:时域压缩,会导致频域展宽;时域拉伸,会导致频域压缩。

   来看推导。设

$$ \mathcal{F}\{f(at)\} =\int_{-\infty}^{\infty}f(at)e^{-j\omega t}\,dt $$

$$ \tau=at,\qquad t=\frac{\tau}{a},\qquad dt=\frac{d\tau}{a} $$

则积分会变为:

$$ =\int_{-\infty}^{\infty}f(\tau)e^{-j\omega \tau/a}\frac{d\tau}{|a|} $$

于是得到:

$$ =\frac{1}{|a|}F\left(\frac{\omega}{a}\right) $$

   这个性质的物理意义非常直接。一个变化很快、持续时间很短的信号,往往包含更丰富的高频成分;一个变化很慢、拖得很长的信号,频谱则往往更加集中。这也是“时间分辨率”和“频率分辨率”之间存在内在约束的一个基础原因。

   对于实值信号,前面已经提到过共轭对称性:

$$ F(-\omega)=F^*(\omega) $$

这个结论说明实信号的正负频率之间并不是彼此独立的。

   进一步地,如果 $f(t)$ 还是一个偶函数,那么它的傅里叶变换只包含实部,并且通常仍是偶函数;如果 $f(t)$ 是奇函数,那么它的傅里叶变换只包含虚部,并且通常是奇函数。也就是说,时域中的对称性会直接反映到频域的结构中。

   这类性质虽然不如时移、频移那样经常单独使用,但在分析频谱形状时很有帮助。很多时候,我们不需要做完整积分,只根据函数的奇偶性和实值性,就能先判断出频谱的大致形式。

微分与卷积

   现在来看一条重要的性质。若

$$ f(t)\xleftrightarrow{\mathcal{F}}F(\omega) $$

则它的导数满足:

$$ \frac{d}{dt}f(t)\xleftrightarrow{\mathcal{F}}j\omega F(\omega) $$

   这条性质非常重要。它说明:时域中的微分运算,在频域中会变成一个简单的乘法。

   从定义出发,

$$ \mathcal{F}\left\{\frac{d}{dt}f(t)\right\} =\int_{-\infty}^{\infty}f'(t)e^{-j\omega t}\,dt $$

对其做分部积分,可以得到:

$$ =\left[f(t)e^{-j\omega t}\right]_{-\infty}^{\infty} +j\omega\int_{-\infty}^{\infty}f(t)e^{-j\omega t}\,dt $$

在适当条件下,边界项为零,因此:

$$ =j\omega F(\omega) $$

   这条性质解释了为什么高频成分往往对应快速变化:因为频率越高,乘子 $j\omega$ 的绝对值越大,微分后的响应就越明显。

   同理,也可以推广到高阶导数:

$$ \frac{d^n}{dt^n}f(t)\xleftrightarrow{\mathcal{F}}(j\omega)^nF(\omega) $$

   这使得很多微分方程在傅里叶变换后可以直接变成代数方程,大大降低求解难度。

   到这里,终于到了傅里叶变换最重要的性质之一:卷积定理 (Convolution Theorem)

   先设两个函数 $f(t)$ 和 $g(t)$ 的卷积定义为:

$$ (f*g)(t)=\int_{-\infty}^{\infty}f(\tau)g(t-\tau)\,d\tau $$

如果

$$ f(t)\xleftrightarrow{\mathcal{F}}F(\omega),\qquad g(t)\xleftrightarrow{\mathcal{F}}G(\omega) $$

那么有:

$$ (f*g)(t)\xleftrightarrow{\mathcal{F}}F(\omega)G(\omega) $$

   也就是说,时域中的卷积,在频域中会变成普通乘法。

   这是傅里叶分析在工程里最强大的地方之一。因为卷积本身是一个积分运算,直接计算往往比较麻烦;但如果转到频域,就只需要做乘法,再通过逆变换回去即可。

   这条性质的证明可以直接从定义展开。对卷积做傅里叶变换:

$$ \mathcal{F}\{(f*g)(t)\} =\int_{-\infty}^{\infty}\left[\int_{-\infty}^{\infty}f(\tau)g(t-\tau)\,d\tau\right]e^{-j\omega t}\,dt $$

交换积分顺序后:

$$ =\int_{-\infty}^{\infty}f(\tau) \left[ \int_{-\infty}^{\infty}g(t-\tau)e^{-j\omega t}\,dt \right]d\tau $$

$$ u=t-\tau,\qquad t=u+\tau,\qquad dt=du $$

则括号内变为:

$$ \int_{-\infty}^{\infty}g(u)e^{-j\omega(u+\tau)}\,du =e^{-j\omega\tau}\int_{-\infty}^{\infty}g(u)e^{-j\omega u}\,du $$

因此整体为:

$$ =\int_{-\infty}^{\infty}f(\tau)e^{-j\omega\tau}\,d\tau \cdot G(\omega) $$

也就是:

$$ =F(\omega)G(\omega) $$

   与卷积定理对应,还有一个对偶关系:时域中的乘积,会对应频域中的卷积。也就是说:

$$ f(t)g(t)\xleftrightarrow{\mathcal{F}}\frac{1}{2\pi}F(\omega)*G(\omega) $$

   这条性质和前面的卷积定理形成了一组非常漂亮的对称关系:

  • 时域卷积 $\leftrightarrow$ 频域乘积;
  • 时域乘积 $\leftrightarrow$ 频域卷积。

   这组关系在滤波、窗口处理、频谱泄漏等问题中都非常关键。很多现象如果只在一个域里看,会显得有些突然;但如果放到这组对偶关系中理解,就会非常自然。

这些性质的意义

   到这里可以看出,傅里叶变换真正强大的地方,并不只是“把时域信号画成频谱图”,而是它建立了一整套时域操作与频域操作之间的对应关系:

  • 叠加对应叠加;
  • 时移对应相位变化;
  • 调制对应频谱搬移;
  • 微分对应乘以 $j\omega$;
  • 卷积对应乘法。

   这些对应关系使得很多复杂问题都可以通过“换个域来做”而变得更简单。特别是在系统分析中,这种优势几乎是决定性的。

   例如,一个线性时不变系统在时域中的输出通常表示为输入信号与系统冲激响应的卷积:

$$ y(t)=x(t)*h(t) $$

做傅里叶变换后立刻得到:

$$ Y(\omega)=X(\omega)H(\omega) $$

   原本复杂的卷积积分,直接变成了一个简单的乘法关系。这里的 $H(\omega)$ 就是系统的频率响应,而这已经在向系统分析、滤波器分析和数字信号处理的核心内容靠近了。

   这一节可以先记住这样几个最重要的对应关系:

$$ af(t)+bg(t)\xleftrightarrow{\mathcal{F}}aF(\omega)+bG(\omega) $$$$ f(t-t_0)\xleftrightarrow{\mathcal{F}}F(\omega)e^{-j\omega t_0} $$$$ f(t)e^{j\omega_0 t}\xleftrightarrow{\mathcal{F}}F(\omega-\omega_0) $$$$ f(at)\xleftrightarrow{\mathcal{F}}\frac{1}{|a|}F\left(\frac{\omega}{a}\right) $$$$ \frac{d}{dt}f(t)\xleftrightarrow{\mathcal{F}}j\omega F(\omega) $$$$ (f*g)(t)\xleftrightarrow{\mathcal{F}}F(\omega)G(\omega) $$

   它们基本构成了后续应用的基础。真正开始做题或者分析系统时,很多推导最终都能归结到这几条性质上。

   不过,到目前为止,我们讨论的还都是连续时间、连续频率的理想形式。而在实际数字系统中,信号往往是离散采样得到的,计算也只能在有限长度的数据上进行。也就是说,真正进入数字信号处理时,我们面对的不是连续傅里叶变换,而是离散时间傅里叶变换、离散傅里叶变换,以及最终能高效计算的快速傅里叶变换。

从连续到离散

   到目前为止,我们讨论的主要还是连续时间信号及其傅里叶变换。对于连续时间函数 $f(t)$,傅里叶变换给出了它在连续频率轴上的表示:

$$ F(\omega)=\int_{-\infty}^{\infty} f(t)e^{-j\omega t}\,dt $$

但现实中的数字系统并不能直接处理连续时间信号。计算机不能“读取一整条连续曲线”,它只能处理一串离散的数据点。因此,只要信号进入了数字处理流程,就一定会经过一个关键步骤:采样 (Sampling)

   也就是说,在真正进入数字信号处理之前,我们必须先把连续时间信号变成离散时间序列。随之而来的问题是:信号一旦离散化,它的频域表示会发生什么变化?连续傅里叶变换是否还能直接使用?如果不能,又应该用什么来替代?

   这些问题会把我们从连续时间傅里叶变换,自然带到离散时间傅里叶变换,再进一步走向离散傅里叶变换和快速傅里叶变换。

采样与频谱周期化

   设原始连续时间信号为 $f(t)$。如果我们每隔固定时间 $T_s$ 对它取一个样本,那么就得到一个离散时间序列:

$$ x[n]=f(nT_s),\qquad n\in\mathbb{Z} $$

其中:

  • $T_s$ 称为采样周期 (Sampling Period)
  • $f_s=\frac{1}{T_s}$ 称为采样频率 (Sampling Frequency)

   从这个式子可以看出,离散时间信号不再以连续变量 $t$ 为自变量,而是以整数索引 $n$ 为自变量。换句话说,我们不再关心“每个时刻”的函数值,而只关心“第几个采样点”的数值。

   这一变化看似只是把连续变量换成了整数下标,但其实它会对频域结构带来深刻影响。连续时间信号的频率轴原本是连续且无限延伸的;而离散时间信号由于时间变量本身已经离散,其频域会呈现出新的特征,其中最重要的一点就是:频谱将变成周期性的。

   对连续时间信号来说,傅里叶变换的基函数是:

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

不同的 $\omega$ 通常对应不同的基函数。

   但对离散时间信号来说,我们使用的基函数变成了:

$$ e^{j\omega n} $$

这里 $n$ 只能取整数。于是会出现一个连续时间里不存在的现象:如果把频率增加 $2\pi$,则有

$$ e^{j(\omega+2\pi)n}=e^{j\omega n}e^{j2\pi n} $$

而由于 $n$ 是整数,总有

$$ e^{j2\pi n}=1 $$

所以:

$$ e^{j(\omega+2\pi)n}=e^{j\omega n} $$

   这说明,对于离散时间信号而言,频率 $\omega$ 和频率 $\omega+2\pi$ 实际上对应的是同一个基函数。换句话说,在离散时间世界里,频率不是“一路无限不重复地展开”的,而是每隔 $2\pi$ 就重复一次。

   这就是离散时间频谱周期性的根本原因。

DTFT 的定义

   既然离散时间信号已经不能再直接使用连续时间的积分变换,那么就需要新的频域表示方式。对于一个离散时间序列 $x[n]$,它的离散时间傅里叶变换 (Discrete-Time Fourier Transform, DTFT) 定义为:

$$ X(e^{j\omega})=\sum_{n=-\infty}^{\infty}x[n]e^{-j\omega n} $$

对应的逆变换为:

$$ x[n]=\frac{1}{2\pi}\int_{-\pi}^{\pi}X(e^{j\omega})e^{j\omega n}\,d\omega $$

   这里的写法和连续时间傅里叶变换很像,但有两个本质区别。

   第一,时域变量已经从连续的 $t$ 变成了离散的整数 $n$,因此正向变换不再是积分,而是求和。

   第二,频域变量虽然仍然是连续的 $\omega$,但频谱 $X(e^{j\omega})$ 是一个关于 $\omega$ 的周期函数,周期为 $2\pi$。因此,在逆变换时,只需要在一个基本周期内积分,例如 $[-\pi,\pi]$。

   这意味着 DTFT 处在一个很有代表性的中间位置:

  • 时域是离散的;
  • 频域仍然是连续的;
  • 但频域具有周期性。

   到这里可以把两者做一个简要对照:

对于连续时间傅里叶变换:

  • 时域是连续的;
  • 频域是连续的;
  • 频谱通常不具有天然周期性。

对于离散时间傅里叶变换:

  • 时域是离散的;
  • 频域仍然是连续的;
  • 频谱一定以 $2\pi$ 为周期重复。

   这个差别非常重要。因为它说明,一旦对信号进行采样,频域结构就已经发生了变化。后面讲采样定理和频谱混叠时,这一点会变得尤为关键。

   为了让 DTFT 更具体一些,我们来看一个简单序列:

$$ x[n]= \begin{cases} 1, & 0\le n\le N-1 \\ 0, & \text{其他} \end{cases} $$

也就是说,这个序列只在前 $N$ 个点上取值为 1,其余位置为 0。它的 DTFT 为:

$$ X(e^{j\omega})=\sum_{n=0}^{N-1}e^{-j\omega n} $$

这是一个有限等比数列,求和结果为:

$$ X(e^{j\omega})=\frac{1-e^{-j\omega N}}{1-e^{-j\omega}} $$

进一步整理后,可以写成更常见的形式:

$$ X(e^{j\omega}) =e^{-j\omega (N-1)/2}\cdot \frac{\sin(\omega N/2)}{\sin(\omega/2)} $$

   这个结果很有代表性。它说明,即使时域里只是一个很简单的有限长度序列,在频域里也不会对应一个“简单常数”,而会形成一个具有主瓣和旁瓣结构的连续周期函数。

   这件事很值得注意,因为它表明:一个有限长度的离散序列,其频谱通常不是离散的,而仍然是连续函数。 只是这个连续函数已经具有周期性。

从 DTFT 到 DFT

   到这里可能会产生一个疑问:既然 DTFT 已经给出了离散时间信号的频域表示,那为什么还需要进一步引入 DFT 呢?

   原因很直接:虽然 DTFT 的时域已经离散了,但它的频域变量 $\omega$ 仍然是连续的。也就是说,严格来说,DTFT 给出的仍然是一条连续频谱曲线。对于计算机来说,这依旧不是一个可以“完整存储和直接计算”的对象。

   数字计算机真正擅长处理的,是有限长度、有限个数据点的对象。因此,如果我们想把频域结果也变成一个有限维向量,就需要进一步在频域上也进行离散化。这样才会导向下一个对象:离散傅里叶变换 (Discrete Fourier Transform, DFT)

   从理论走向实际计算,通常要加上两层限制:

  1. 时域有限长:计算机只能处理有限个采样点,不可能处理无限长序列;
  2. 频域离散化:计算机也不可能处理一整条连续频谱曲线,只能在若干频率点上取值。

   这两层限制叠加起来,就把 DTFT 进一步压缩成了 DFT。也就是说,DFT 并不是凭空定义出来的,它本质上是这样一个问题的答案:

对于一段有限长度的离散序列,我们能否只在有限个频率点上取样,就得到一个可计算、可存储、可反演的频域表示?

   答案就是可以,而这也是 DFT 的意义所在。

   到这里,其实已经能看出整条逻辑链:

  • 连续时间周期信号,对应傅里叶级数;
  • 连续时间非周期信号,对应傅里叶变换;
  • 离散时间无限长序列,对应离散时间傅里叶变换;
  • 离散时间有限长序列,对应离散傅里叶变换。

   这四个对象并不是彼此孤立的,它们只是针对不同信号形式所采用的不同频域表示工具。真正变化的,是信号在“时间轴上是否连续”“长度是否有限”“频率轴上是否离散”这些方面的结构。

   接下来,就可以进一步进入离散傅里叶变换本身。也就是:当时域和频域都被离散化之后,频域表示具体会变成什么形式?它和 DTFT 之间又是什么关系?这些问题将直接把我们带到 DFT 的定义与性质。

离散傅里叶变换

   上一节最后已经提到,DTFT 虽然把时域变成了离散序列,但频域仍然是连续变量 $\omega$ 的函数,因此它更适合做理论分析,而不适合直接用于数字计算。对于计算机来说,真正容易处理的是:输入是一段有限长度的数据,输出也是一组有限个频率点上的数值。离散傅里叶变换正是为此而出现的。

定义与频率采样点

   设有一个长度为 $N$ 的离散序列:

$$ x[0],x[1],\dots,x[N-1] $$

它的离散傅里叶变换 (Discrete Fourier Transform, DFT) 定义为:

$$ X[k]=\sum_{n=0}^{N-1}x[n]e^{-j\frac{2\pi}{N}kn},\qquad k=0,1,\dots,N-1 $$

对应的逆变换为:

$$ x[n]=\frac{1}{N}\sum_{k=0}^{N-1}X[k]e^{j\frac{2\pi}{N}kn},\qquad n=0,1,\dots,N-1 $$

   这个式子和前面的傅里叶级数、傅里叶变换、DTFT 看起来都很像,但它有一个非常鲜明的特点:时域和频域都已经是有限个离散点。

   也就是说,DFT 不再产生一条连续频谱曲线,而是只在 $N$ 个特定频率点上给出结果:

$$ k=0,1,\dots,N-1 $$

因此它适合计算机存储和处理。

   从结构上看,DFT 仍然是在做“投影”。前面讲傅里叶分析时已经多次提到,它的核心一直没有变:都是把原始信号投影到某一组基函数上,从而得到各个频率分量的系数。

   在 DFT 中,这组基函数变成了:

$$ e^{j\frac{2\pi}{N}kn} $$

其中:

  • $n$ 表示时域采样点编号;
  • $k$ 表示频域采样点编号。

   对于每个固定的 $k$,基函数

$$ e^{j\frac{2\pi}{N}kn} $$

都对应一个离散频率。DFT 系数 $X[k]$ 的意义,就是原序列在这个频率基函数方向上的分量大小。

   因此,DFT 仍然是在回答同一个问题:这段有限长度序列中,各个离散频率成分分别有多强。

   这里必须把一个关键问题说清楚:DFT 中的索引 $k$ 并不只是“第 $k$ 个数”,它实际对应着一个具体的频率采样点。

由指数项

$$ e^{-j\frac{2\pi}{N}kn} $$

可以看出,第 $k$ 个频率点对应的离散角频率为:

$$ \omega_k=\frac{2\pi}{N}k $$

如果原始离散序列来自连续时间信号,以采样周期 $T_s$ 采样得到,那么对应的连续时间角频率为:

$$ \Omega_k=\frac{\omega_k}{T_s}=\frac{2\pi k}{NT_s} $$

而普通频率(单位 Hz)则为:

$$ f_k=\frac{k}{NT_s}=\frac{k}{N}f_s $$

其中 $f_s=\frac{1}{T_s}$ 是采样频率。

   这说明,DFT 的频率轴其实是把区间

$$ [0,f_s) $$

均匀分成了 $N$ 份,每一个 $X[k]$ 对应其中一个采样点。相邻两个频率点之间的间隔为:

$$ \Delta f=\frac{f_s}{N} $$

这通常称为频率分辨率

   从这个式子也能直接看出一个很重要的结论:如果采样频率固定,那么想让频率分辨率更细,就必须增大 $N$,也就是采集更长的数据序列。

与 DTFT 的关系

   DFT 并不是和 DTFT 完全不同的另一套东西。更准确地说,DFT 可以看作 DTFT 在一组等间隔频率点上的采样值。

   对于长度为 $N$ 的有限序列 $x[n]$,它的 DTFT 为:

$$ X(e^{j\omega})=\sum_{n=0}^{N-1}x[n]e^{-j\omega n} $$

如果我们只在

$$ \omega_k=\frac{2\pi}{N}k,\qquad k=0,1,\dots,N-1 $$

这些等间隔频率点上取值,那么就得到:

$$ X(e^{j\omega_k}) =\sum_{n=0}^{N-1}x[n]e^{-j\frac{2\pi}{N}kn} $$

这也是 DFT 的定义:

$$ X[k]=X(e^{j\omega_k}) $$

   也就是说,DFT 本质上就是对 DTFT 在单位圆上做等间隔采样。这个理解非常重要,因为它直接说明了 DFT 的两个特点:

  1. 它来源于连续频谱的离散采样;
  2. 它只能看到这 $N$ 个频率点上的值,而不是整条连续曲线。

周期延拓与典型例子

   DFT 还有一个非常容易被忽视、但又很重要的特征:它天然假设输入序列和输出序列都是周期性的。

   先看时域。DFT 的输入虽然只写成

$$ x[0],x[1],\dots,x[N-1] $$

这 $N$ 个点,但从数学结构上,它实际上对应的是一个以 $N$ 为周期的离散周期序列。也就是说,DFT 默认把这 $N$ 个样本视为一个周期,并在整个整数轴上重复:

$$ x[n+N]=x[n] $$

   同样地,DFT 输出的频域序列 $X[k]$ 也是以 $N$ 为周期的:

$$ X[k+N]=X[k] $$

   这两个周期性并不是额外附加的性质,而是直接由复指数基函数的结构决定的。因为:

$$ e^{-j\frac{2\pi}{N}(k+N)n}=e^{-j\frac{2\pi}{N}kn}e^{-j2\pi n}=e^{-j\frac{2\pi}{N}kn} $$

对于整数 $n$,总有 $e^{-j2\pi n}=1$,所以频域索引增加 $N$ 后并不会产生新的基函数。

   这个周期延拓观点非常关键,因为很多实际现象都和它有关。比如后面会提到的频谱泄漏、循环卷积、窗函数影响,本质上都和“DFT 实际上是在处理有限截断并默认周期拼接的序列”密切相关。

   为了更直观一些,可以先看几个常见的 $k$ 值分别代表什么。

当 $k=0$ 时,

$$ X[0]=\sum_{n=0}^{N-1}x[n] $$

它对应的是直流分量,也就是信号整体的平均水平乘以 $N$。

   当 $k=1$ 时,对应的是一个在 $N$ 个采样点内完成 1 次离散周期变化的频率分量。

更一般地,$k$ 表示在 $N$ 个采样点范围内完成 $k$ 次周期变化的离散频率。

   例如,如果某个序列恰好是:

$$ x[n]=e^{j\frac{2\pi}{N}mn} $$

那么它的 DFT 结果会在 $k=m$ 这个频率点上集中起来,而在其他频率点上为零。也就是说,DFT 的基函数本身就是它最理想的“纯频率样本”。

   这和前面傅里叶级数中“某个频率分量只投影到对应基函数上”的逻辑完全一致。

   先看一个最简单的例子。设

$$ x[n]=1,\qquad n=0,1,\dots,N-1 $$

那么它的 DFT 为:

$$ X[k]=\sum_{n=0}^{N-1}e^{-j\frac{2\pi}{N}kn} $$

当 $k=0$ 时,

$$ X[0]=\sum_{n=0}^{N-1}1=N $$

当 $k\neq 0$ 时,这是一个完整复指数周期上的求和,结果为 0,因此:

$$ X[k]= \begin{cases} N, & k=0 \\ 0, & k=1,2,\dots,N-1 \end{cases} $$

   这个结果与直觉是一致的。常数序列不包含任何振荡成分,因此它的频谱只集中在直流点 $k=0$。

   再来看一个稍微更典型的情形。设

$$ x[n]=e^{j\frac{2\pi}{N}mn} $$

其中 $m$ 是整数,并且 $0\le m\le N-1$。代入 DFT 定义:

$$ X[k]=\sum_{n=0}^{N-1}e^{j\frac{2\pi}{N}mn}e^{-j\frac{2\pi}{N}kn} $$

整理后得到:

$$ X[k]=\sum_{n=0}^{N-1}e^{j\frac{2\pi}{N}(m-k)n} $$

当 $k=m$ 时,每一项都等于 1,因此:

$$ X[m]=N $$

而当 $k\neq m$ 时,这是完整周期上的复指数求和,结果为 0。于是:

$$ X[k]= \begin{cases} N, & k=m \\ 0, & k\neq m \end{cases} $$

   这说明,如果输入信号恰好和某个 DFT 基频完全对齐,那么频谱就会只落在一个频率点上,不会扩散到其他位置。后面讨论频谱泄漏时,这个“完全对齐”的情况会成为一个重要参照。

矩阵形式与定位

   从线性代数角度看,DFT 还可以写成矩阵变换。设

$$ \mathbf{x}= \begin{bmatrix} x[0]\\ x[1]\\ \vdots\\ x[N-1] \end{bmatrix}, \qquad \mathbf{X}= \begin{bmatrix} X[0]\\ X[1]\\ \vdots\\ X[N-1] \end{bmatrix} $$

定义旋转因子:

$$ W_N=e^{-j\frac{2\pi}{N}} $$

那么 DFT 可以写成:

$$ \mathbf{X}= \begin{bmatrix} 1 & 1 & 1 & \cdots & 1 \\ 1 & W_N & W_N^2 & \cdots & W_N^{N-1} \\ 1 & W_N^2 & W_N^4 & \cdots & W_N^{2(N-1)} \\ \vdots & \vdots & \vdots & \ddots & \vdots \\ 1 & W_N^{N-1} & W_N^{2(N-1)} & \cdots & W_N^{(N-1)(N-1)} \end{bmatrix} \mathbf{x} $$

   这个矩阵本质上就是把序列投影到一组复指数基底上。这样看会更清楚:DFT 是一个标准的线性变换。

   但它也暴露出一个严重问题:如果直接按照矩阵乘法去算,那么计算量大约是 $N^2$ 量级。对于较短的序列,这当然没问题;但一旦 $N$ 很大,计算代价就会迅速增长。也正因为如此,才会需要后面要讲的快速傅里叶变换。

   到这里,可以把 DFT 放回整个链条里重新理解一次:

  • 它不是最原始的理论起点;
  • 它也不是连续傅里叶分析的简单重复;
  • 它是为了让频域分析能够真正落到有限数据、有限计算上而形成的核心工具。

   更准确地说,DFT 站在理论和计算之间。它继承了傅里叶分析“用频率分解信号”的思想,同时又把问题变成了计算机可以直接处理的有限维形式。

   不过,DFT 虽然已经可计算了,但如果直接使用定义式去算,效率仍然不够高。真正让频域分析在数字时代大规模落地的关键,不只是 DFT 本身,而是如何高效地计算 DFT。这个问题最终导向的,就是快速傅里叶变换。

快速傅里叶变换

   到上一节为止,我们已经得到了离散傅里叶变换 (DFT):

$$ X[k]=\sum_{n=0}^{N-1}x[n]e^{-j\frac{2\pi}{N}kn},\qquad k=0,1,\dots,N-1 $$

它已经把频域分析变成了一个可以直接交给计算机处理的有限维问题。从理论上说,只要按定义逐项求和,我们就能得到每一个频率点上的结果。

   但是,“能算”和“算得快”是两回事。DFT 的定义虽然简洁,但如果直接照着公式计算,效率其实并不高。这也是快速傅里叶变换真正要解决的问题。

为什么需要 FFT

   先来估计一下计算量。对于某一个固定的 $k$,计算

$$ X[k]=\sum_{n=0}^{N-1}x[n]e^{-j\frac{2\pi}{N}kn} $$

需要把 $N$ 项加起来,也就是大约进行 $N$ 次复乘和 $N-1$ 次复加。

而总共有 $N$ 个频率点 $k=0,1,\dots,N-1$ 都要计算,因此总计算量大约是:

$$ N\times N=N^2 $$

也就是说,直接计算 DFT 的复杂度是:

$$ O(N^2) $$

   当 $N$ 很小时,这当然不是问题。但如果 $N$ 稍微大一些,情况就会迅速变差。比如:

  • 当 $N=1024$ 时,运算规模大约是百万级;
  • 当 $N=10^6$ 时,运算规模就已经接近万亿级。

   对于现代人来说,看到这些数字可能还不够直观,但在数字信号处理刚刚发展起来的年代,这样的计算代价往往是无法接受的。也正因为如此,如何更高效地计算 DFT,成为了一个极其关键的问题。

   在继续往下之前,必须先把一个常见误解澄清掉:FFT 不是一种不同于 DFT 的新变换。

   FFT 的全称是快速傅里叶变换 (Fast Fourier Transform)。它并没有改变 DFT 的定义,也没有改变最终结果。FFT 所做的事情只有一件:

用更高效的方法计算同一个 DFT。

   也就是说:

  • DFT 说明“要算什么”;
  • FFT 说明“怎么更快地算”。

   这一点很重要。因为很多初学者会把 DFT 和 FFT 当成两个并列概念,甚至误以为 FFT 给出的结果和 DFT 不一样。实际上,FFT 只是 DFT 的高效计算算法。

   为什么 DFT 可以被更快地计算?原因在于,直接按定义求和时,里面有大量重复结构没有被利用。

   观察 DFT 公式中的旋转因子:

$$ W_N=e^{-j\frac{2\pi}{N}} $$

那么 DFT 可以写成:

$$ X[k]=\sum_{n=0}^{N-1}x[n]W_N^{kn} $$

   这里的 $W_N^{kn}$ 并不是彼此毫无关系的独立项。它们有很多规律,例如周期性、对称性和可分解性。如果能够把这些结构利用起来,就有可能避免大量重复计算。

   FFT 的本质,就是利用这些规律,把一个长度为 $N$ 的 DFT,拆成若干个更小规模的 DFT,再把这些小结果组合起来。这个思想本质上是一个分治 (Divide and Conquer) 思想。

奇偶拆分与蝶形结构

   下面来看最经典的一种 FFT 思路,也就是 Cooley–Tukey 算法中最常见的按奇偶拆分。为了方便说明,先假设 $N$ 是偶数。

从 DFT 定义出发:

$$ X[k]=\sum_{n=0}^{N-1}x[n]W_N^{kn} $$

把求和中的序列下标按“偶数项”和“奇数项”拆开:

$$ X[k]=\sum_{r=0}^{N/2-1}x[2r]W_N^{k(2r)} +\sum_{r=0}^{N/2-1}x[2r+1]W_N^{k(2r+1)} $$

   现在分别观察这两部分。第一部分中,

$$ W_N^{2k r}=e^{-j\frac{2\pi}{N}2kr} =e^{-j\frac{2\pi}{N/2}kr} =W_{N/2}^{kr} $$

因此偶数项部分可以写成:

$$ \sum_{r=0}^{N/2-1}x[2r]W_{N/2}^{kr} $$

同理,奇数项部分可写为:

$$ \sum_{r=0}^{N/2-1}x[2r+1]W_{N/2}^{kr}\cdot W_N^k $$

于是整个 DFT 变成:

$$ X[k]= \sum_{r=0}^{N/2-1}x[2r]W_{N/2}^{kr} + W_N^k \sum_{r=0}^{N/2-1}x[2r+1]W_{N/2}^{kr} $$

   这一步极其关键。因为它表明:一个长度为 $N$ 的 DFT,已经被拆成了两个长度为 $N/2$ 的 DFT,再加上一些额外的旋转因子组合。

   为了把结构写得更清楚,我们定义:

$$ E[k]=\sum_{r=0}^{N/2-1}x[2r]W_{N/2}^{kr} $$$$ O[k]=\sum_{r=0}^{N/2-1}x[2r+1]W_{N/2}^{kr} $$

其中:

  • $E[k]$ 是由偶数下标样本组成的长度为 $N/2$ 的 DFT;
  • $O[k]$ 是由奇数下标样本组成的长度为 $N/2$ 的 DFT。

于是原式就变成:

$$ X[k]=E[k]+W_N^k O[k] $$

   但这还不是全部。由于 $E[k]$ 和 $O[k]$ 本身都是长度为 $N/2$ 的 DFT,它们关于 $k$ 也是周期为 $N/2$ 的,因此当我们考察 $X[k+N/2]$ 时,有:

$$ X[k+N/2]=E[k]-W_N^k O[k] $$

于是,对于 $k=0,1,\dots,\frac{N}{2}-1$,我们只要知道 $E[k]$ 和 $O[k]$,就可以同时得到两项结果:

$$ X[k]=E[k]+W_N^k O[k] $$$$ X[k+N/2]=E[k]-W_N^k O[k] $$

   这就是 FFT 中最经典的“蝶形结构”来源。

   上面这一对公式看起来只是简单的加减,但它非常重要。因为它说明:两个小 DFT 的结果,经过一次乘法和两次加减,就能合成为两个更大 DFT 的结果。

   从结构上看,可以把它理解为:

  • 先分别求出偶序列和奇序列的频谱;
  • 再通过旋转因子 $W_N^k$ 对奇序列频谱做调整;
  • 最后与偶序列频谱做加减组合。

   由于这种组合形式在图形上通常画成一个交叉结构,所以被称为蝶形 (Butterfly)。虽然名字听起来有些形象化,但本质上它就是一种固定的代数组合单元。

   到这里,问题并没有结束。因为 $E[k]$ 和 $O[k]$ 虽然规模缩小了一半,但它们本身仍然是 DFT。如果继续直接计算,复杂度仍然不够低。

   于是 FFT 的下一步就非常自然了:继续对这两个长度为 $N/2$ 的 DFT 做同样的奇偶拆分。

也就是说:

  • 一个长度为 $N$ 的 DFT,拆成两个长度为 $N/2$ 的 DFT;
  • 每个长度为 $N/2$ 的 DFT,再拆成两个长度为 $N/4$ 的 DFT;
  • 继续递归下去,直到最后拆成长度为 2 或长度为 1 的最小问题。

   当长度降到 1 时,DFT 已经不需要再计算,因为长度为 1 的 DFT 就是它本身。

这就是 FFT 的完整基本思路。

复杂度与意义

   现在来看复杂度。假设每次都把长度 $N$ 的问题拆成两个长度为 $N/2$ 的子问题,并在每一层做大约 $N$ 量级的合并计算,那么总复杂度满足递推关系:

$$ T(N)=2T(N/2)+O(N) $$

这个递推的结果是:

$$ T(N)=O(N\log N) $$

   这和直接计算 DFT 的

$$ O(N^2) $$

相比,是一个巨大的提升。

   这种提升在数据量较大时尤其明显。例如当 $N$ 增加时,$N^2$ 会增长得非常快,而 $N\log N$ 的增长要慢得多。也正因为如此,FFT 才真正使频域分析在工程上大规模可行。

   如果只看公式,FFT 可能仍然显得有点抽象。它做的事情是:

  • 不是把每个输出频点都重新和全部输入样本做一遍完整匹配;
  • 而是先把输入按结构拆开,复用中间结果;
  • 再通过有规律的组合,把大问题一步步拼回来。

   也就是说,FFT 之所以快,不是因为它“近似”了原问题,也不是因为它“少算了一部分”,而是因为它更加聪明地组织了计算过程,避免了重复劳动。

   在很多教材和程序库里,经常会看到 FFT 最适合处理长度为

$$ N=2^m $$

的序列。原因就在于刚才的奇偶拆分最适合不断二分:

  • $N$ 可以拆成两个 $N/2$;
  • $N/2$ 可以继续拆成两个 $N/4$;
  • 一直到长度为 1 为止,整个递归结构会非常整齐。

   当然,这并不意味着 FFT 只能处理 2 的幂长度。实际上还有很多其他形式的 FFT 算法,可以处理复合长度,甚至处理质数长度。但从教学和理解角度来说,最经典也最容易讲清楚的,仍然是这种二分递归结构。

   到这里,可以把它放回全文的逻辑链条中重新看一次:

  • 傅里叶级数回答周期函数如何分解成离散频率;
  • 傅里叶变换把这个思想推广到非周期函数;
  • DTFT 处理离散时间但无限长的序列;
  • DFT 把问题压缩成有限长度、有限频率点的计算形式;
  • FFT 则进一步解决“如何高效计算 DFT”。

   也就是说,FFT 并不是傅里叶分析思想的起点,而是整个链条在数字计算时代走向工程落地的关键一步。没有 DFT,就没有明确的计算对象;没有 FFT,这个对象在很多实际场景下又会因为计算量过大而难以使用。

   关于 FFT,先记住下面几点就够了:

  1. FFT 不是新的变换,而是快速计算 DFT 的算法;
  2. 它的核心思想是分治,即把大规模 DFT 拆成小规模 DFT;
  3. 最经典的实现方式是奇偶拆分;
  4. 蝶形结构来自对子问题结果的加减组合;
  5. 它把复杂度从 $O(N^2)$ 降到了 $O(N\log N)$。

   理解了这些,再去看代码实现、位逆序重排、原地计算等细节时,就不会只觉得那是一套技巧,而会知道它们都服务于同一个目标:把 DFT 的结构规律最大限度地利用起来。

   不过,到这里整篇文章还差最后一步。我们虽然已经从傅里叶级数一路走到了 FFT,但还需要回过头来做一个整体总结:这几种工具之间究竟应该怎样区分?在实际学习和使用时,又该如何把它们放到同一个框架中理解?

总结

   到这里,这条逻辑链已经基本完整了。我们从最早的傅里叶级数出发,一步一步走到了快速傅里叶变换。表面上看,这一路上出现了很多名字相近、形式相似的对象:傅里叶级数、傅里叶变换、离散时间傅里叶变换、离散傅里叶变换、快速傅里叶变换。初学时很容易把它们混在一起,觉得只是公式不断更换符号。但如果把它们放回统一的脉络中看,就会发现这其实是一条非常连贯的演化路线。

几种工具的对象与任务

   最开始的傅里叶级数 (Fourier Series, FS),面对的是连续时间的周期函数。它回答的问题是:

一个周期函数,能否表示成若干离散谐波的叠加?

答案是可以。于是我们得到了:

$$ f(t)=\frac{a_0}{2}+\sum_{n=1}^{\infty}\left[a_n\cos(n\omega_0 t)+b_n\sin(n\omega_0 t)\right] $$

或者复指数形式:

$$ f(t)=\sum_{n=-\infty}^{\infty}c_n e^{jn\omega_0 t} $$

这里的核心特征是:时域连续,频域离散。

   接着,当研究对象从周期函数推广到连续时间的非周期函数时,原先离散的谐波点逐渐变密,最终走向连续频率轴,于是得到了傅里叶变换 (Fourier Transform, FT)

$$ F(\omega)=\int_{-\infty}^{\infty}f(t)e^{-j\omega t}\,dt $$

以及逆变换:

$$ f(t)=\frac{1}{2\pi}\int_{-\infty}^{\infty}F(\omega)e^{j\omega t}\,d\omega $$

这一步的核心特征是:时域连续,频域也连续。

   再往后,当信号进入数字处理流程,连续时间信号经过采样变成离散时间序列,此时对应的工具变成了离散时间傅里叶变换 (Discrete-Time Fourier Transform, DTFT)

$$ X(e^{j\omega})=\sum_{n=-\infty}^{\infty}x[n]e^{-j\omega n} $$

这时的结构变成了:时域离散,频域连续但周期化。

   再进一步,为了让计算机真正能够处理,我们不再面对无限长序列,而只处理有限长度数据;同时在频域上也只取有限个点,于是得到离散傅里叶变换 (Discrete Fourier Transform, DFT)

$$ X[k]=\sum_{n=0}^{N-1}x[n]e^{-j\frac{2\pi}{N}kn} $$

此时的特征变成了:时域离散且有限,频域离散且有限。

   最后,为了高效计算 DFT,又引入了快速傅里叶变换 (Fast Fourier Transform, FFT)。它并不是新的变换,而只是 DFT 的高效算法。也就是说:

  • DFT 规定了结果是什么;
  • FFT 规定了如何更快地得到这个结果。

关系梳理

   如果把前面的内容压缩成最核心的对照关系,那么可以整理成下面这样:

工具时域对象频域对象主要特点
傅里叶级数 FS连续、周期离散周期函数展开为离散谐波
傅里叶变换 FT连续、非周期连续非周期连续信号的连续频谱
离散时间傅里叶变换 DTFT离散、无限长连续、周期离散时间频谱天然周期化
离散傅里叶变换 DFT离散、有限长离散、有限长适合数字计算的频域表示
快速傅里叶变换 FFT与 DFT 相同与 DFT 相同DFT 的高效计算方法

   这样整理之后,几者之间的关系就很清楚了。它们并不是彼此孤立、彼此替代的工具,而是针对不同对象、不同需求逐步演化出来的一整套方法。

   尽管一路上公式不断变化,但真正贯穿始终的核心思想一直没有变,那就是:

把一个复杂信号表示为一组“更简单的频率基函数”的线性组合。 在傅里叶级数中,这组基函数是离散的正弦、余弦或复指数;在傅里叶变换中,这组基函数扩展为连续频率轴上的复指数;在 DTFT 和 DFT 中,这种思想又被搬到离散时间信号上;而 FFT 则是在计算层面把这种表示真正变得高效可用。

   换句话说,真正不变的是“频率分解”这个思想,变化的只是:

  • 研究对象是否周期;
  • 时间变量是否离散;
  • 数据长度是否有限;
  • 计算是否需要高效实现。

   从数学角度看,傅里叶分析提供了一种非常强的函数表示方式。很多原本在时域里看起来复杂、难以直接分析的问题,一旦转到频域,就会显得结构清晰得多。

   从工程角度看,它几乎贯穿了整个现代信号处理体系。无论是通信、控制、图像处理、音频处理、雷达、医学成像,还是机器学习里某些频域方法,背后都能看到傅里叶分析的影子。

   它之所以重要,不是因为“频域比时域更高级”,而是因为很多问题在频域里会表现出更适合分析和计算的结构。例如:

  • 周期性在频域里更容易识别;
  • 微分在频域里会变成乘法;
  • 卷积在频域里会变成乘法;
  • 离散频谱可以直接反映采样与周期结构;
  • FFT 使大规模频域计算真正可行。

学习时需要建立的整体认识

   如果只把傅里叶分析当成“几个需要背下来的公式”,那么很容易在学习到后面时感到混乱。相反,如果先建立下面几个认识,后续内容会顺畅很多:

  1. 傅里叶分析首先是一种视角转换。
    它不是制造新信号,而是把同一个信号从时域描述改写成频域描述。

  2. 不同工具对应不同对象。
    不要把 FS、FT、DTFT、DFT、FFT 混成一类,它们各自有明确的适用场景。

  3. 公式形式变化背后有清晰逻辑。
    从级数到积分,从连续到离散,从理论表达到账面可计算,这一路都是自然过渡,而不是突然更换体系。

  4. FFT 的意义在于计算效率。
    它不是“更高级的傅里叶变换”,而是让 DFT 变得真正可用。

   文章一开始,我们是从傅里叶级数讲起的。那时最核心的出发点其实很朴素:能不能把一个复杂波形拆成更基础的振荡成分?现在回头看,整条路线无非是在不断扩展这个问题的适用范围:

  • 从周期函数扩展到非周期函数;
  • 从连续时间扩展到离散时间;
  • 从理论表达扩展到实际计算。

   这也正是傅里叶分析最有吸引力的地方之一。它并不是一套彼此割裂的技巧,而是一条结构极其统一的思想链。只要抓住“正交分解”“频率表示”“连续与离散之间的对应”“计算效率的改进”这几条主线,前面看起来零散的内容就会自然串起来。

   从这个意义上说,快速傅里叶变换并不是这条路线的终点,而更像是一个阶段性的落脚点。它把前面数百年逐步积累下来的频域分析思想,最终落实成了一种能够被大规模计算系统真正使用的工具。而这也正是傅里叶分析从理论走向工程的关键一步。