最近在带几个刚入门信号处理方向的新人,他们几乎绕不开同一个困惑:傅里叶变换到底有多少种形式?翻开教材,傅里叶级数(FS)、傅里叶变换(FT)、离散时间傅里叶变换(DTFT)、离散傅里叶变换(DFT)扑面而来,公式长得像,名字还特别像,一不留神就混了。
我当年也是被这四个名字折腾过的人。后来想通了一件事:它们根本不是四个独立的数学工具,而是同一个傅里叶思想在不同信号形态下的四种投影。把这条主线抓住,FS、FT、DTFT、DFT之间的关系就清晰得像一张地图。这篇文章就按这条主线来写,把四种形式的分类逻辑、核心公式、典型变换对、常见工程陷阱一次讲完,尤其是三角脉冲的傅里叶变换怎么记,我会给出几个亲测好用的记忆方法,适合正在啃信号与系统、数字信号处理,或者刚开始用FFT做频谱分析的朋友。
1. 四种形式怎么分类:抓住时域和频域的两对性质
1.1 一张表看懂四种形式的位置
判断一个信号该用哪种傅里叶形式,不需要背,只需要问两个问题:时域信号是连续的还是离散的?时域信号是周期的还是非周期的?
把这两个维度交叉一下,正好得到四种组合,分别对应四种傅里叶形式:
| 时域信号形态 | 连续、非周期 | 连续、周期 | 离散、非周期 | 离散、周期 |
|---|---|---|---|---|
| 变换名称 | 傅里叶变换(FT) | 傅里叶级数(FS) | 离散时间傅里叶变换(DTFT) | 离散傅里叶变换(DFT) |
| 频域形态 | 连续、非周期 | 离散、非周期 | 连续、周期 | 离散、周期 |
| 典型场景 | 理论推导、模拟信号分析 | 周期信号的谐波分解 | 序列分析、数字滤波器设计 | FFT计算、频谱分析 |
这张表的核心就是傅里叶变换理论里那两句“对偶关系”:时域周期,频域离散;时域离散,频域周期。后文所有公式和工程现象都从这两句话来。只要把这两句话刻在脑子里,四种形式的位置就永远不会搞乱。
1.2 时域连续与离散的本质区别
时域连续,意味着信号在每个时刻都有定义,变换的时候用积分;时域离散,意味着信号只在整数采样点上存在,变换的时候用求和。这是FS/FT和DTFT/DFT在公式形式上的分界线。
时域周期与非周期,则决定频域是离散谱线还是连续谱密度。周期信号分解出来是一根一根的谱线,对应各个谐波频率;非周期信号的频谱是一段连续的曲线,代表能量在频率轴上的密度分布。
把这两对性质放在一起,就能直观理解为什么DFT的频域输出是一堆离散的X[k],而FT的频域输出是连续函数X(ω)。DFT的输入本来就是离散且周期化的序列,所以输出自然离散且周期化。这也是计算机里只能跑DFT、不能直接跑FT的根本原因。
提示:判断一个信号属于哪种形式,先看时域,再看频域。时域周期还是非周期、连续还是离散,这两个问题决定了变换公式长什么样,也决定了频谱画出来是点、是线、还是连续曲线。
2. 四种形式的公式与工程语义
2.1 FS:周期信号分解成一堆旋转向量
周期信号是第一种要处理的信号。假设x(t)以周期T0重复,基波角频率ω0=2π/T0,那么它可以分解为一系列谐波的叠加:
x(t) = Σ_{k=-∞}^{∞} X_k e^{jkω0 t}
其中傅里叶系数:
X_k = (1/T0) ∫_{T0} x(t) e^{-jkω0 t} dt
这里积分区间取任意一个完整周期T0就行。每个X_k都代表频率kω0处的复振幅,包含幅度和相位。k=0对应直流分量,k=±1对应基波,k=±2对应二次谐波,依此类推。
工程里做谐波分析,比如分析电网谐波、机械振动信号,用的就是FS的思路。周期性是前提,频谱输出是一根根离散谱线,谱线间距就是基波频率ω0。信号周期越大,谱线越密;周期趋向无穷大,谱线密到连成一片,FS就自然过渡到FT。
2.2 FT:把周期拉长到无穷,谱线变成谱密度
当信号的周期T0趋于无穷大,信号不再重复,变成单个非周期脉冲。这时谱线间距ω0趋于无穷小,离散的X_k退化成连续的X(ω),FS的求和退化成FT的积分:
X(ω) = ∫_{-∞}^{∞} x(t) e^{-jωt} dt
逆变换:
x(t) = (1/2π) ∫_{-∞}^{∞} X(ω) e^{jωt} dω
注意,这里的X(ω)不再是某个频率点的幅度,而是频谱密度,单位是幅度除以角频率。这也是为什么FT的结果经常出常数π、1/2π这些因子,本质上都是密度化带来的尺度变化。
FT对应的是连续非周期信号,理论分析几乎离不开它。模拟滤波器频率响应、调制解调的频谱搬移、匹配滤波器的传递函数,全部建立在这组公式上。但FT有个工程难点:积分区间从负无穷到正无穷,信号又是连续的,计算机没法直接算,所以实际数值计算要绕到DFT那边去。
2.3 DTFT:序列的频谱为什么一定是周期的
把连续时间信号x(t)按采样周期Ts抽样,得到离散序列x[n]=x(nTs)。离散后的序列依然可以定义频谱,但积分变成求和:
X(e^{jω}) = Σ_{n=-∞}^{∞} x[n] e^{-jωn}
这里的ω是数字角频率,和模拟角频率Ω的关系是ω=Ω·Ts。很多人第一次看到这个公式会问:为什么用e^{jω},不是e^{jωn}就已经算完了?关键在于频域的周期性问题。
因为对任意ω,都有e^{-j(ω+2π)n}=e^{-jωn},所以X(e^{jω})天然是以2π为周期的周期函数。这正是“时域离散,频域周期”的体现。采样让频谱以采样率fs为周期重复,原本连续信号频谱如果最高频率超过fs/2,重复的频谱就会叠在一起,这就是混叠。
DTFT的频域是连续的,这导致它也没法直接在计算机里精确计算。计算机能算的,是把它进一步离散化之后的DFT。
2.4 DFT:计算机唯一能直接算的傅里叶变换
要让频谱既离散又有限长,才能在计算机里做数值计算。对长度为N的序列x[n],n=0,1,...,N-1,做周期延拓后取一个周期,频域同样离散成N个点:
X[k] = Σ_{n=0}^{N-1} x[n] e^{-j2πkn/N}, k=0,1,...,N-1
逆变换:
x[n] = (1/N) Σ_{k=0}^{N-1} X[k] e^{j2πkn/N}
DFT的时域序列和频域序列都是有限长离散的,所以适合计算机处理。但要注意,DFT的数学定义里隐含了“x[n]是周期信号的一个周期”这一假设,时域被周期延拓,频域也被周期延拓。
FFT只是DFT的一种快速算法,不是新的变换。工程里用FFT算出来的X[k],本质上就是DFT的结果。很多人以为FFT是独立的一套理论,其实它只是把DFT的重复乘法运算组织成了蝶形运算,复杂度从O(N²)降到O(NlogN),结果和DFT一模一样。
提示:四种形式的递进关系是:FS把周期信号拆成谱线,FT把非周期信号变成连续谱,DTFT处理离散序列得到周期频谱,DFT把DTFT的频谱又抽样成有限离散点。核心线路是:周期化、离散化。
3. 必背变换对与三角脉冲记忆方法
3.1 常用变换对速查表
学傅里叶变换离不开典型变换对。这些变换对就像是数学里的乘法口诀,背不下来后面推导什么都费劲。我最常给新人推荐的几张“卡”:
| 时域信号 | 傅里叶变换 | 记忆要点 |
|---|---|---|
| 冲激函数 δ(t) | 1 | 时域最窄,频域最宽 |
| 常数 1 | 2πδ(ω) | 时域最宽,频域最窄 |
| 矩形脉冲 rect(t/T) | T·Sa(ωT/2) | 矩形对应抽样函数 |
| 三角脉冲 tri(t/T) | T·Sa²(ωT/2) | 三角对应抽样函数平方 |
| 高斯脉冲 e^{-at²} | 也是高斯形式 | 变换后仍保持高斯形状 |
| 周期冲激串 Σδ(t-nT) | 周期冲激串 | 时域周期,频域离散周期 |
这里统一使用角频率ω形式的正变换,不另外带系数。如果使用频率f的常用形式,矩形脉冲对应T·sinc(fT),其中sinc(x)=sin(πx)/(πx),形式和角度频率差一个π比例的因子,需要注意区分。
矩形脉冲和三角脉冲是所有基础变换对里最容易出考题的。矩形脉冲相对好记,脉冲宽度T,频谱正好T乘以Sa(ωT/2)。三角脉冲如果当场硬背,很容易记错系数,下面两个方法能让你根本不靠背就把它推出来。
3.2 卷积法:构造一个矩形自卷积就完事
这个思路特别直接:三角脉冲可以由两个矩形脉冲卷积出来。
设矩形脉冲p(t)=rect(t/T),宽度T、高度1。把两个相同的矩形脉冲做卷积,卷积结果就是一个底宽2T、顶点高度为T的三角形。把结果再除以T,就得到标准三角脉冲tri(t/T):
tri(t/T) = (1/T) · [rect(t/T) * rect(t/T)]
根据傅里叶变换的卷积定理,时域卷积对应频域相乘。先写出矩形脉冲的变换对:
rect(t/T) ⟷ T·Sa(ωT/2)
于是三角脉冲的频域就是矩形频谱的平方再除以T:
FT[tri(t/T)] = (1/T) · [T·Sa(ωT/2)]² = T·Sa²(ωT/2)
整个过程只有两步:矩形脉冲频谱是T·Sa,平方后除以T,得到T·Sa²。以后看到三角脉冲,第一反应就是“矩形卷积矩形”,频谱写成Sa的平方就不会错。
这个方法还能扩展。梯形脉冲可以看成两个宽度不同的矩形做卷积,频谱自然就是两个Sa函数相乘。很多复杂脉冲都能用卷积构造法快速推出频谱,比翻积分表靠谱多了。
3.3 求导法:对三角脉冲做两次微分变成冲激
如果对卷积不太熟,另一个思路是用微分性质。三角波是分段直线,它的一阶导数是分段常数的方波,二阶导数直接变成三个冲激。用“时域求导等于频域乘以jω”的性质,也可以很快推出频谱。
标准三角脉冲f(t)=tri(t/T),在[-T,T]区间外为0。求一阶导,斜率在[-T,0]是+1/T,在[0,T]是-1/T,所以f'(t)是一个负向的矩形波。再求一次导,在t=-T处会出现正冲激+1/T,t=0处出现负冲激-2/T,t=T处出现正冲激+1/T,即:
f''(t) = (1/T)δ(t+T) - (2/T)δ(t) + (1/T)δ(t-T)
利用微分性质,若f(t)的傅里叶变换为F(ω),那么f''(t)的傅里叶变换为(jω)²F(ω)。于是:
(jω)²F(ω) = (1/T)(e^{jωT} - 2 + e^{-jωT})
把分子整理一下,e^{jωT} + e^{-jωT} - 2 = -4sin²(ωT/2),再除以(jω)²化简,最后得到:
F(ω) = T·Sa²(ωT/2)
结果和卷积法一致。求导法的好处是锻炼微积分性质,而且能帮你理解为什么三角脉冲频谱是Sa²而不是Sa——二阶导数对应三个冲激,冲激组合的频谱除以ω²,自然就出现“每求一次导,频域除以一次jω”的痕迹。
注意:卷积法和求导法都涉及系数,最容易错的是矩形脉冲宽度和三角脉冲底宽的对应关系。上面推导里rect(t/T)的频谱是T·Sa(ωT/2),三角脉冲tri(t/T)底宽是2T。如果换一种符号定义,底宽写成T,公式里的T要跟着改,不能整个照抄。
3.4 关于“萨函数还是辛格函数”的符号混用提醒
国内教材一般用采样函数Sa(x)=sin(x)/x,国外很多教材和Python、MATLAB里用的是sinc(x)=sin(πx)/(πx)。两种符号差一个π,导致同一个矩形脉冲写出来不一样。
用Sa函数表示,矩形脉冲FT是T·Sa(ωT/2);用sinc函数表示,写成T·sinc(fT)。前者自变量是角频率,后者自变量是自然频率,两者数值上差π倍。
我建议做理论推导时统一用角频率ω和Sa函数,工程上读MATLAB、Python代码时再看它用的是哪种约定。这个习惯能省掉很多对不上号的麻烦。
4. 实战中的典型问题与排查思路
4.1 混叠:离散化之前最该做的那一步
离散时间信号做傅里叶分析,混叠是绕不开的第一关。不管是DTFT还是DFT,离散化都会让频谱以采样频率fs为周期重复。如果原始模拟信号里有超过fs/2的频率成分,这些高频成分会折叠回低频区,和真实低频信号叠在一起,再也没法分离。
很多人做数据采集只关心采样率够不够高,忘了在ADC之前加抗混叠滤波器。正确的流程是先做模拟低通滤波,把fs/2以上的分量滤掉,再采样。数字信号处理里的频谱混叠不可逆,一旦叠了,后续任何滤波都是亡羊补牢。
另外,采样率的选择也不能只按理论最低值来。实际工程里常用fs≥ (5~10)倍信号最高频率,一方面给抗混叠滤波器留过渡带,另一方面降低量化噪声对高频段的影响。
4.2 泄漏和栅栏效应:为什么频谱看起来有鬼
DFT处理的是有限长序列,但信号本身可能是无限长的,于是必然要截断。截断相当于在时域乘了一个矩形窗,频域就变成原频谱与Sa函数的卷积。原来一根锐利的谱线,被Sa展宽成带旁瓣的形状,这就是频谱泄漏。泄漏让频谱看起来“有鬼”:主瓣变宽、旁边出现假峰,小信号可能被旁瓣淹没。
缓解泄漏的思路是换窗。矩形窗主瓣窄但旁瓣高,汉宁窗、海明窗、布莱克曼窗都能压低旁瓣,代价是主瓣变宽、频率分辨率变差。频谱分析里没有免费的午餐,窗函数选择就是在分辨率和泄漏抑制之间做权衡。
栅栏效应则是另一个坑。DFT只输出N个离散频点X[k],相当于透过栅栏看频谱,两个频点之间的频率分量看不到,可能正好错过真实的谱峰。时域补零可以增加频域采样点,让频谱曲线更细腻,看起来像“栅栏变密了”,但补零不会增加信息量,真实分辨率依然由数据长度决定。
提示:先想清楚自己要解决的问题是什么。测频率、测幅值、测相位,三个需求对窗函数和数据长度的要求完全不同。没有万能窗,只有适合当前任务的窗。
4.3 FFT幅值谱归一化:X[k]到底是不是幅度
用FFT做完频谱分析,想从幅值谱读出真实信号的幅度,要注意归一化问题。FFT直接输出的X[k]并不是信号的真实幅度,它只是DFT的原始结果。
如果原始时域信号是单频正弦x(t)=Acos(2πf0t),采样N点后做N点FFT,频谱上在f0对应的频点k0处,|X[k0]|≈A·N/2。要想得到真实幅度A,需要乘以2/N。直流分量对应的k=0则只需要乘以1/N,因为直流没有正负频率对半分的问题。
工程上常见错误是完全不归一化,读出来一堆和N相关的“幅度”,换个FFT点数结果就变了。正确的流程是:取X[k]的模,k=0处乘1/N,其他频点乘2/N,得到的就是单边幅值谱。
4.4 选型建议:什么时候用哪种形式
理论上学四种形式是为了搞懂信号的本质,实际动手时怎么选其实很明确。
连续系统建模、解析推导、滤波器和调制理论的底层分析,用FT。周期信号做谐波测量,用FS或者说FS的思想,需要问清楚基波频率是多少。离散序列的频响分析、数字滤波器设计、理论计算卷积,用DTFT,它给出的是连续的周期频谱,适合推导解析式。实际测量、数值计算、音频处理、振动分析、任何上计算机跑数据的场景,用DFT,因为只有DFT是可计算的。
如果是手算一些简单题,FS和FT足够;如果是做算法、跑数据、调参数,基本绕不开DFT/FFT。搞明白每种形式的适用场景,比反复背公式有用得多。
5. 一些个人体会
我自己在学习和带人的过程中,最大的体会是:傅里叶变换的四种形式,本质上是同一句话在四种信号条件里的展开——时域周期对应频域离散,时域离散对应频域周期。把这两句话焊在脑子里,后面无论遇到连续采样、离散序列、周期延拓还是FFT归一化,都能自己推导,不需要记大纲。
三角脉冲这类典型变换对,强烈建议用“矩形卷积矩形”和“二阶导等于冲激组合”这两个视角各推一遍。第一次推可能觉得麻烦,推两三次之后,看到三角函数脑子里就自动出现Sa²和那个1、-2、1的冲激组合,比死记硬背快得多。
最后再分享一个实际操作中的习惯:我每次做频谱分析,都会先手写一遍信号模型和对应的傅里叶理论表达式,想清楚这个信号是连续还是离散、周期还是非周期,再打开代码去跑FFT。这个习惯看起来多花两分钟,实际上能挡住大量因为四形式混用导致的低级错误。傅里叶变换这个工具,用好了是信号处理最锋利的一把刀,值得花时间把它捋顺。