文章

傅里叶怎样把温度拆成波?

一根热铁棒,为什么会通向声音和图片的频谱?从傅里叶的热研究出发,用八幅原创图、热扩散动画与真实DFT互动,读懂波的分解、相位、傅里叶变换,以及采样和滤波的边界。

傅里叶怎样把温度拆成波?

把一根铁棒的一端放进热水,另一端留在外面。

过一会儿,你会发现:热不肯老老实实待在原地。

可如果问得再细一点——十秒以后,棒上每一个位置分别是多少度?——“热会往冷的地方走”就不够用了。

这道看起来很生活的问题,后来竟然接上了另一组看似完全不相干的问题:

一段声音里有哪几个频率?一张图片里哪些变化是大轮廓,哪些是细纹理?为什么电脑里到处都有一个叫 FFT 的东西?

中间的关键人物,就是傅里叶。

他做了一件听起来有些离谱的事:

为了算清温度怎样变化,先把温度的空间形状,拆成许多正弦和余弦。

不是说铁棒在唱歌,也不是说热会像海浪一样上下振动。而是:有些复杂的问题,换一种“登记方式”,突然就容易了。

1. 上一篇的蒙日,居然真教过傅里叶

约瑟夫·傅里叶,1768 年出生于法国欧塞尔,1830 年去世。

他的一生并不是“关上书房门,专心推积分”那么平直:做过教师,参与过法国赴埃及的远征与学术工作,后来还到格勒诺布尔担任行政职务。重要的热理论研究,正是在这段行政工作时期发展起来的。圣安德鲁斯大学的传记记录了这些经历。

更有意思的是,他和前几篇文章的人物真的相遇过。

1795 年,在巴黎师范学校学习时,傅里叶听过拉格朗日、拉普拉斯与蒙日的课。

上一位在研究怎样把空间投到纸上,这一位后来要研究:能不能把复杂的温度形状,投到一组简单函数上?

这是我们今天帮助理解的类比,不是说两种方法的历史来源完全相同。

傅里叶1768年出生、1795年学习、1807年报告、1811年扩充参赛和1822年专著出版的五个历史阶段 图 1:沿时间向下读,注意“报告”“参赛”“出版”不是同一个时点。傅里叶提出的方法曾引发严密性争论,现代分析理论与算法又经过许多人的发展,不能全部归给一个人。

1807 年,傅里叶把固体热传播研究报告给巴黎学术界;1811 年,又扩充论文参加热传播竞赛。评审一方面肯定、授奖,另一方面仍认为某些推导的普遍性和严密性需要完善。1822 年,《热的解析理论》出版。

这里不是一个“天才一说,其他人立刻鼓掌”的故事。

把复杂函数展开成三角级数,在当时并不让所有人信服。傅里叶的工作推动了后续关于函数、收敛与分析基础的研究,但不能倒过来说:他当时已经证明了今天每一种版本的傅里叶定理。

这些阶段可由传记核对;剑桥出版社的书目与目录还区分了 1822 年法文原著与 1878 年 Freeman 英译本,原著也确实讨论了环中的热传播。

2. 先分清:傅里叶导热定律,不是傅里叶变换

它们同姓,却回答不同的问题。

傅里叶导热定律回答:相邻位置有温差时,热往哪里流、流多少?

在一维模型里,可以写成:

\[q=-\kappa\frac{\partial T}{\partial x}.\]

(T) 是温度,(x) 是位置;(q) 是沿 (x) 方向的热流密度,单位 (\mathrm{W/m^2});(\kappa) 是导热率,单位 (\mathrm{W/(m\cdot K)})。

那个负号不是装饰:如果越往右越冷,温度梯度为负,热流就朝右,也就是从热处流向冷处。

但一个位置会升温还是降温,还不能只看它自己有多热。要看它的收支。

等间距三处温度为80、60、20摄氏度,中间段右侧流出大于左侧流入,说明导热定律加能量守恒怎样决定温度变化 图 2:先看中间的 60 ℃。同材料、同截面、等间距,并以相邻温差估算梯度:左侧温差 20,右侧温差 40,流出更多,因此中间降温。箭头只标方向,不用箭头长度假装实测热流。

流入多于流出,就积累热能;流出更多,就减少。

把小段越取越短,再用微积分表达“收支”,对于均匀、截面恒定、侧面绝热、无内部热源的一维材料,就得到:

\[\frac{\partial T}{\partial t} =\alpha\frac{\partial^2T}{\partial x^2},\]

其中

\[\alpha=\frac{\kappa}{\rho c}.\]

(\rho) 是密度,(c) 是比热容,(\alpha) 叫热扩散率,单位 (\mathrm{m^2/s})。

左边说“这个位置的温度随时间变多快”,右边说“温度曲线在附近怎样弯”。一个局部凸起的热峰通常会降下去,低谷会被附近较热的部分填起来;真正起作用的是邻域中的差异,不是某一点凭空知道全棒平均温度。

这个推导见 MIT Hancock 的一维热方程讲义第 1—2 页。

微积分提供表达工具,但还得输入导热的物理定律。并不是单凭牛顿的 (F=ma),就能把所有热现象直接算出来。

此外,方程还不够:一开始各处多热?两端固定温度、绝热,还是接在一起?这些初始、边界条件不同,答案就不同。

3. 为什么偏偏选正弦和余弦?

为了避免两端与环境交换热的干扰,接下来换一个清楚的教学模型:

一根均匀细棒首尾相接成环,侧面绝热,没有内热源。

环周长为 1 m。把它展开画在横轴上,(x=0) 与 (x=1) 实际是同一个位置。

现在给它一份初始温度:

\[\begin{aligned} T(x,0)={}&50+20\cos(2\pi x)\\ &+10\cos(6\pi x). \end{aligned}\]

这里 (x) 用米的数值代入;更一般的写法是把余弦里的 (x) 换成 (x/L),其中周长 (L=1\ \mathrm m)。温度与振幅单位为 ℃。

它的意思并不神秘:

平均温度 50,加上一圈起伏一次、振幅为 20 的宽波,再加上一圈起伏三次、振幅为 10 的细波。

环上初始温度由一阶20摄氏度余弦温差、三阶10摄氏度余弦温差以及50摄氏度平均温度相加构成 图 3:先看①宽起伏,再看②细起伏,最后在同一个位置把它们加到 50 上,得到③。前两条是可正可负的温差分量,第三条才是实际温度;温度曲线并不表示环真的弯成了这种形状。

那为什么这样拆就好算?

因为余弦对“求两次空间导数”这件事,特别省心。

\[\frac{d^2}{dx^2}\cos(kx) =-k^2\cos(kx).\]

形状没有换,只乘了一个数。

所以,把一种余弦形状放进热方程后,我们不用时时重画整条未知曲线,只要追踪它的振幅:

\[A'(t)=-\alpha k^2A(t).\]

这个方程告诉我们:

\[A(t)=A(0)e^{-\alpha k^2t}.\]

原来需要追踪一整圈温度,现在可以分头登记:这一种起伏剩多少,那一种起伏剩多少。

热方程在这里是线性的,满足同一边界条件的解可以叠加。MIT 讲义第 7—8 页用固定温度端点的棒演示了相同思想;本文的环则选用周期边界,不把两套边界条件混起来。

4. 细波为什么先没?因为频率要被平方

对周长 (L) 的环,第 (n) 阶空间起伏的角波数是:

\[k_n=\frac{2\pi n}{L}.\]

注意,这里的 (n/L) 是空间频率,单位为每米多少圈,不是每秒多少次的 Hz。

三阶起伏的角波数是一阶的 3 倍,指数衰减率却是 9 倍。

它不是“走得快”,而是“淡得快”。

绝热环在0、0.5、2与10秒的同尺度温度快照及一阶三阶振幅,细起伏先衰减而平均温度50摄氏度不变 图 4:按时刻从上往下看。曲线与数值都由解析解计算,各格比例相同;扩散率 0.01 m²/s 是人为选定的教学参数,不代表某种金属的实测冷却速度。三阶起伏先淡,均温始终是 50 ℃。

在这组参数下,我们实际计算的是:

\[\begin{aligned} T(x,t)=50 &+20e^{-4\pi^2\alpha t}\cos(2\pi x)\\ &+10e^{-36\pi^2\alpha t}\cos(6\pi x). \end{aligned}\]

仍按 (L=1\ \mathrm m)、(x,t,\alpha) 分别以 m、s、(\mathrm{m^2/s}) 的数值代入。

这里有一个很容易说错的地方:

温差在减小,不等于热能都跑出了系统。

这个环没有与环境交换热,材料参数恒定,所以均温不变;以同一参考温度计算的总热能守恒。变小的是温度的不均匀程度,例如相对均温的温差平方平均值。

Strang 的热方程讲义第 1—4 页同时讨论了总热量守恒、平方积分衰减以及高频起伏迅速平滑。不能把不同意义下的“能量”混成一句“热全没了”。

在有环境散热、端点被冷却的另一类问题里,均温当然也可能下降。不是热方程只准温度变平、不准降温,而是边界条件换了。

5. 已知一条复杂曲线,怎样知道里面有哪些波?

前面是我先告诉你配方,再把波相加。

现在倒过来:给你一条曲线,你怎么查出配方?

可以先想成一个“对暗号”的办法:

把原曲线乘上一条参考波,再在一段合适的区间上求平均。

频率不同,乘积会有正有负,往往互相抵消;如果频率对上了,就能留下可提取的分量。这种严格的正交关系,依赖选定区间与频率条件,不是随便截多长都自动抵消。

为了好数,换成一个随时间变化的无量纲信号:

\[g(t)=\cos(2\pi\cdot8t) +\frac12\cos(2\pi\cdot20t).\]

(t) 以秒计,所以这里的 8 与 20 才是 Hz:每秒起伏 8 次与 20 次。

同一个8赫兹和20赫兹混合信号分别乘两种参考余弦,一秒平均值为0.5与0.25,再乘2得到振幅1与0.5 图 5:先认①原信号,再看②③“乘参考波”后的正负起伏。这一秒里两种频率都走完整数个周期:乘 8 Hz 参考后平均为 0.5,乘 20 Hz 后为 0.25;余弦平方平均是 1/2,所以这里提取振幅还要乘 2。

这与向量有点像。

你想知道一个向量在某个方向上有多少,就做投影;你想知道一个函数含某种波多少,就用相应的积分内积来提取。

MIT 讲义第 7—8 页明确用向量正交来类比函数正交,并由此求出展开系数。

不过,余弦参考还不是全部。

如果波起伏的起点挪了,也就是相位变了,还要配上一条正弦参考。否则,一条相差四分之一周期的波,可能被单独一条余弦参考“看漏”。

相位不是可以随便扔掉的附件

频率告诉你“起伏多快”,振幅告诉你“这一项多强”,相位告诉你“相对于时间原点,起伏走到了哪儿”。

仅改变20赫兹分量相位的两条波形不同,但一秒128点DFT单边振幅图都在8赫兹和20赫兹具有1和0.5的峰 图 6:比较①②,第二项从 0° 改成 90°,波形确实变了;③的两根峰却没变。这里画的是这两组整周期记录的 DFT 单边振幅,不是完整复频谱。只有频率与振幅,未必能拼回原来的波形。

复数在这里很有用:它能把余弦与正弦这两份投影一起保存,也就把强弱与相位一起保留下来。

所以,不必一见 (i) 就觉得“原来的真实信号变虚假了”。它是一种省事的记账方式。

6. 从傅里叶级数,到傅里叶变换

先分清两种场景。

如果研究的是一个周期里怎样重复,就很自然地得到一串离散频率。

例如周期为 (P),频率格点是:

\[f_n=\frac{n}{P}.\]

周期 1 s,间距是 1 Hz;周期 2 s,间距为 0.5 Hz。

这就是傅里叶级数的典型舞台:一组离散的谐波,加上各自的系数。

如果我们想研究一次不重复的脉冲呢?

一个有帮助的桥梁是:先把它放进越来越长的周期里重复。重复之间越来越远,频率格点越来越密;在适当条件下,离散求和通向连续频率的积分。

周期化高斯在周期1、2、4秒时的频率格点变密且单项权重缩小,下方单独显示连续高斯频谱密度,区分权重与密度 图 7:按 P=1、2、4 的顺序看,频率点越来越密,但单项权重还含有间距 Δf,不能只把柱子变多、原高度照搬。图用高斯的可计算例子,时间、频率分别以 1 s、1 Hz 归一化后写数值;上三格是离散权重,下格是连续频谱密度,纵轴含义不同。

采用本文约定,连续傅里叶变换写作:

\[\widehat g(f)= \int_{-\infty}^{\infty} g(t)e^{-i2\pi ft}\,dt.\]

把它读成人话:

拿每一种频率的余弦、正弦,去和整条信号对照,把匹配结果登记成一份复数频谱。

在适当条件下,可以反过来:

\[g(t)= \int_{-\infty}^{\infty} \widehat g(f)e^{i2\pi ft}\,df.\]

这里不是列完第 1、2、3 根波就停,而是把连续频率上的贡献积分起来。

它改变的是表示方式,不是把物体、声音或热真的送进了另一个空间。

两条公式也有使用范围。普通积分版本需要可积性与相应反演条件;例如信号与其变换都绝对可积时,可在信号连续的点作这样的反演。永远重复、永不衰减的理想余弦,不满足前一个普通绝对可积条件,不能不加说明地塞进积分,当作得到了一根有限高度的普通函数柱子。

对于常见的分段光滑周期函数,级数在跳点趋向两侧极限的平均值;不能笼统说“随便什么函数,在每个点都能被正弦精确拼出”。NIST 的级数条目列出了相关收敛条件。更广义的理论会使用均方意义、分布等工具,这篇不把它们混进初学公式。

NIST 数学函数数字图书馆的积分变换条目列出了定义、反演及相关条件。它采用的符号、归一化与本文不完全相同;不同教材中的正负号和 (2\pi) 位置可能变化,正反变换必须成套使用。

还有一个细节:连续频谱是密度式的表示,量纲会随积分变化。若 (g) 的单位是电压,(\widehat g) 在本文时间积分约定下就带上“电压×秒”;不要把它的纵轴,与某个软件显示的归一化单边振幅不加区别地比较。

7. 变换绕了一圈,怎样重新解决热问题?

现在可以看出傅里叶思路真正省力的地方。

前面在环上,我们逐个处理离散空间模态。若换成无限长理想棒上的温差分布,在合适的衰减与光滑条件下,就可以对空间 (x) 做连续变换。

注意,这次变换的是位置,不是时间;(\xi) 的单位是圈/m。这里用 (u) 表示相对固定背景的温差,避免把无限长棒上的非零均温当成一个普通可积信号。

空间求两次导数,在频域中变成乘一个数:

\[\frac{\partial\widehat u}{\partial t} =-4\pi^2\alpha\xi^2\widehat u.\]

于是每一种空间频率,都只需自己按下面的倍率衰减:

\[\widehat u(\xi,t)= \widehat u(\xi,0)e^{-4\pi^2\alpha\xi^2t}.\]

然后做反变换,拿回温差随位置的形状。

路线就是:先拆开,分头演化,再拼回。

这与 Strang 讲义中的无限域热方程解法一致,只是本文使用每米圈数的频率约定,因此写出了相应的 (2\pi)。

热扩散本身像一个偏爱低空间频率的平滑器:宽缓变化留下得久,细碎变化淡去得快。

但它与“超过某频率就一刀删掉”的理想硬截止滤波,不是同一种倍率。热扩散是连续的指数衰减,不能把它画成任意切掉几根柱子,就声称完整模拟了热传导。

8. 动手:看热变平,也看频率被找出来

下面两个实验都在本站运行。手机上框内可以滚动,也可以单独打开热与频谱实验室。

实验一:热怎样变平。

先停在 0 s,认出宽起伏与细起伏;拖到 0.5 s,再到 10 s,看看哪一项先减弱。改变扩散率后,曲线来自重新计算,不是为了显得“变快”而随便改动画速度。

播放一次用 8 秒演示 10 秒模型时间,标签显示的是模型时间,不是实际材料实验。可以暂停、拖动、重播;减少动态效果模式禁用连续播放,改为每次前进 1 秒。默认不自动播放,最后停在结果上。

实验二:找出并筛选频率。

默认生成 8 Hz 与 20 Hz 两项,实际取 128 个样本。程序对这些样本做 DFT 求和,保留指定频率以内的复系数与共轭对,再逆变换。

把截止设在 12 Hz,留下 8 Hz,删掉 20 Hz;调到 64 Hz,则完整保留,回到原样本,只有浮点舍入误差。

恢复默认后,再按“相位改成90°”:波形变了,两根振幅峰没有变。然后试“20.5 Hz”,频谱会散开——下一节解释这不是计算坏了。

这不是预先画两根柱子的演示。输入、完整频谱、低通结果与误差,都从同一组样本计算。互动需要 JavaScript;不加载互动,也能沿正文八幅静态图理解全部主线。

9. DFT、FFT,以及“为什么散到旁边去了”

电脑不能直接收进一条无限长、连续的信号。它往往拿到有限个离散样本。

DFT,离散傅里叶变换,回答这组样本怎样表示成一组离散频率系数。FFT,则是更快计算同一个 DFT 的一类算法。

FFT 不是比傅里叶变换更玄的另一种变换,也不是傅里叶在 1822 年已经为今天的电脑写好了代码。NumPy 的官方说明区分了这几个概念,并给出了正、逆 DFT、频率排列、归一化与相位的约定;参考文献列有 Cooley 与 Tukey 的 1965 年论文。

这篇的小实验数据量很小,实际采用直接 DFT 求和,没有冒称它就是 FFT。

20.5 Hz 为什么没有老老实实站成一根柱子?

实验记录 1 s,采样率 128 Hz,共取 128 点。DFT 格点间距为:

\[\Delta f=\frac{f_s}{N}=1\ \mathrm{Hz}.\]

20 Hz 正好落在格点上,也在这段记录里走完 20 个周期;20.5 Hz 则不是。

对有限记录作周期解释时,截断窗口与接回处的差异会让能量分布到其他格点,这叫频谱泄漏。

不是现实里突然长出了几十个独立振源,也不是 DFT 无法分析非整数频率。它准确表达的是你交给它的那组有限样本;解读真实来源,还得考虑观察窗、时长、噪声及分析方法。

给记录末尾补零,可以把频谱画得更密,但不能凭空获得更长时间的观测。格点间距也不等于任何条件下都保证能区分的最小频率差。

采得太慢,还会把快波认成慢波

每秒64次采样下8赫兹实线和56赫兹虚线在九个采样点上相等,说明混叠不是把快波物理降速而是样本无法分辨 图 8:先看圆点,再看穿过它们的两条不同曲线。横轴只放大 0~0.125 s;64 Hz 采样时,两条余弦在这些采样时刻完全相同。实线与虚线才是不同的连续波,圆点本身无法替你选择。

这叫混叠。

对于严格带限的信号,要想按相应采样理论还原,需要足够高的采样率,并满足相应条件。现实采集还会使用抗混叠滤波,不能只背一句“两倍”就忽略所有前提。

这里最重要的不是再背一条规则,而是记住:

傅里叶分析很擅长整理信息,却不能凭空补回从未测到的信息。

10. 最初那根热铁棒,留下了一种怎样的眼光?

从热传导走到频谱,并不只是“一个数学家的名字被到处借用”。

背后有一条很连贯的路线:

先用物理定律建立方程;再找到求导时不乱变形的简单波;把复杂分布拆开,让每一项分别变化;最后重新合成。

这也是为什么类似方法会进入声音分析、图像平滑与许多科学计算。时间上的频率与空间上的频率不是同一种单位,但“变化得慢还是细碎、各占多少、相位在哪里”的问题,有共同的数学语言。

当然,滤掉高频也不是永远有益。声音中的细节、图片中的边缘都可能在高频里;噪声也未必只待在高频。实验里删掉一项,只是演示一个可核算的筛选动作,不代表现实信号可以如此简单地区分“有用”和“没用”。

回头看开头:傅里叶并不是想让一根铁棒唱歌。

他是在问,热怎样慢慢传开。

但为了回答这个问题,他帮助人们学会了另一种看变化的方式:

不只看一条曲线在每个位置有多高,还问:它是由哪些简单变化,按怎样的强弱与相位,拼在一起的?

参考资料与原创模型说明

以下资料均实际打开检查;两份 MIT PDF 阅读了相关正文,不以搜索摘要代替推导出处。全部插图与互动为原创计算,没有转载论文图、教材截图或外站程序。

  • MacTutor:Joseph Fourier:生平、1795 年师范学校学习、1807 年报告、1811 年竞赛及评审保留意见、1822 年出版。用于区分研究、报告、参赛和出版,不把争论讲成“当时已有今日完整证明”。
  • Cambridge University Press:The Analytical Theory of Heat:核对法文原著 1822 年、Freeman 英译 1878 年,以及目录中的环热传播等主题。本次检查的是出版社书目说明与目录,不宣称逐页校勘原著。
  • Matthew J. Hancock/MIT:The 1-D Heat Equation:第 1—4 页的能量收支、导热率、热扩散率与初边值条件;第 7—9 页的线性叠加、正交性、系数提取与模态衰减。原讲义的固定端点示例不等同于本文的周期环模型。
  • Gilbert Strang/MIT:The Heat Equation and Convection-Diffusion:第 1—4 页的总热量守恒、平方积分衰减、空间变换、高频平滑及高斯热核。本文采用另一套明确标出的频率约定。
  • NIST DLMF §1.8:Fourier Series、§1.14:Integral Transforms:级数系数与收敛、连续变换的定义、反演条件及不同符号约定。不能把普通可积函数的公式无条件用于所有周期信号或分布。
  • NumPy:Discrete Fourier Transform:DFT 与 FFT 的关系、正逆变换、实信号共轭对称、幅相信息、直流与奈奎斯特频率项、归一化及滤波背景。互动沿用其常见负指数正变换、正指数并除以 N 的逆变换约定,但未调用 NumPy,也未调用 FFT 库。

八幅 SVG 可由 python tools/generate_fourier_visuals.py 生成。互动位于 assets/interactive/fourier-lab.html,实际使用的 JavaScript 模型可用 node tools/check_fourier_model.cjs 检查。热模型有意只用两个解析模态;频谱模型只处理合成信号与有限样本,不是材料实验、录音分析或实际设备性能评测。

本文由作者按照 CC BY 4.0 进行授权