欧拉公式:从时域到频域的桥梁,工程频谱分析的基石
2026/9/14 22:14:51 网站建设 项目流程

说实话,我见到太多人学《信号与系统》学到傅里叶级数就被劝退,总觉得那一堆三角函数、积分、系数看着就头疼。但如果你问一个工程师,这门课里最值得反复琢磨、真正能改变你理解世界方式的东西是什么,我会说:欧拉公式。它把指数函数、三角函数、虚数这三个看似八竿子打不着的概念统一成一句话,也是通往频域信号世界的那座桥,尤其当你面对周期信号的周期运动,想把复杂的乘法运算变得简单优美时,这个公式的价值会体现得淋漓尽致。

这篇内容我不会去堆数学证明,而是想站在一个学完这门课、又在工程里真刀真枪做过频谱分析的人的角度,把欧拉公式从“看着很酷”讲成“确实有用”。适合所有正在被《信号与系统》折磨的学生,也适合那些工作中要用到FFT、滤波器、调制解调却总觉得理论差点意思的工程师。看完之后你至少会理解:为什么教科书要花那么大力气讲复指数信号,以及频谱图上那些频率分量到底是怎么来的。

1. 为什么说欧拉公式是时域到频域的桥梁

你要想过河,得先知道河在哪。时域和频域之间的这条河,本质上是同一个信号在两种坐标系下的不同投影。时域里我们盯着波形怎么随时间起伏,频域里我们关心的是这个波形由哪些旋转运动叠加而成。而把这两种视角连起来的数学工具,核心就是欧拉公式。

1.1 周期信号的本质:旋转与投影

先想一个问题:一个正弦波,它在时域上看起来是上下摆动,但如果我告诉你,这种摆动其实是一个点在复平面上做匀速圆周运动时,它的纵坐标投影,你会不会觉得整个思路一下子开阔了?

对,这就是理解周期的关键。一个匀速旋转的向量,在实轴上的投影是余弦,在虚轴上的投影是正弦。而欧拉公式e^(jωt) = cos(ωt) + j·sin(ωt)这句话,本质上就是在说:复指数信号是“旋转”,三角函数是“投影”。时域里你看到的那个波,只是旋转向量在某一根轴上的影子而已。

这个视角带来的好处是巨大的。因为旋转运动天然和频率绑定:转得快,频率就高;转得慢,频率就低;反向转,频率就是负的。于是任何一个周期信号,不管波形多复杂,都可以被理解成许多个不同转速的旋转向量组合在一起的结果。你要做的就是把每个旋转向量的转速和长度找出来,这个步骤就是傅里叶级数。

我当年学到这里最大的障碍是觉得虚数“不真实”。信号明明是电压,怎么会跟j扯上关系?后来做工程做多了才明白,复指数从来都不是“实体”,它只是一个方便计算的数学工具,就像你解方程时设的中间变量。实体永远是实信号,但用复指数去描述和计算它,路径要短得多。

1.2 复指数信号远比正弦好用的三个原因

既然欧拉公式能把三角函数换成复指数,那为什么不干脆直接用复指数来分析一切?原因有三个,每一个都直击要害。

第一个原因是微积分上极其友好。正弦函数求导会变成余弦,再求导又变回正弦,来回变,让人头大。但复指数函数求导,只是把指数上的jω系数提下来,函数本身形状不变。对e^(jωt)求导,结果是jω·e^(jωt),你再求十次导数,它还是这样的结构。这意味着在电路和系统分析里,那些描述电容、电感的微分方程,一旦你用复指数信号去激励,微分方程直接变成代数方程,求解难度直线下降。这也是为什么电路的相量法本质上是欧拉公式在正弦稳态分析里的应用。

第二个原因是正交性非常好用。三角函数也正交,但复指数函数在不同频率之间不仅正交,而且表达式简洁。你想想傅里叶级数里那个系数的求解,本质上就是用一组正交基去“匹配”信号,看每一个基函数里含有多少分量,复指数基函数的正交性公式写出来只有一行,而三角函数要同时处理sin和cos两套基,处处都要多写一倍的项。

第三个原因是乘法运算被大幅简化。同一个频率的两个三角函数相乘,会跌入和差化积的泥潭里;但两个同频复指数相乘,指数直接相加,简便到让人想哭。这一点在接下来的章节里我会展开讲,因为标题里说的“优美表达乘法运算”指的就是这个特性。先记住结论:频域里的乘法在某种意义上就是时域里各种乘积运算的简化,而源动力全都在欧拉公式身上。

2. 欧拉公式的完整推导与直觉理解

很多人记不住欧拉公式,是因为只把它当作一个结论背下来。但如果你自己把它推一遍,并且和图画结合起来,它会变成你脑子里一个自然而然的画面,忘都忘不掉。

2.1 用泰勒展开一步步推出来

先从我们都熟知的泰勒级数开始。指数函数、余弦、正弦各自都能展开成无穷级数:

e^x = 1 + x + x²/2! + x³/3! + x⁴/4! + ...

cos x = 1 - x²/2! + x⁴/4! - x⁶/6! + ...

sin x = x - x³/3! + x⁵/5! - x⁷/7! + ...

现在我把第一个式子里那个x换成jθ,看起来简单,但需要你对虚数单位的幂次有一个基本认知:j⁰=1j¹=jj²=-1j³=-jj⁴=1,然后循环。按照这个规律一项一项代入:

e^(jθ) = 1 + jθ - θ²/2! - jθ³/3! + θ⁴/4! + jθ⁵/5! - ...

接下来把她拆成实部和虚部两拨。实部是1 - θ²/2! + θ⁴/4! - ...,这支是cosθ;虚部是θ - θ³/3! + θ⁵/5! - ...,这正是sinθ。于是得到:

e^(jθ) = cosθ + j·sinθ

这个推导本身不复杂,但它是整个信号与系统课程里最值得亲手推一遍的式子,没有之一。因为它让“为什么能用复指数代替三角函数”有了完整的逻辑支撑,而不是凭空掉下来的公式。

2.2 如何建立对欧拉公式的工程直觉

数学证明看懂之后,要建立直觉。我的方法很简单,就是画一个复平面,每个时刻对应一个点,把所有时刻连起来

想象你有一个长度固定为1的向量,起点在原点,从实轴正方向开始,绕着原点逆时针匀速旋转。θ是它转过的角度。那么它在实轴上的坐标永远是cosθ,在虚轴上的坐标永远是sinθ。欧拉公式告诉你,这个旋转向量本身就可以用一个数来表示:e^(jθ)。角度随时间匀速增加时,θ=ωt,这个旋转向量的瞬时位置就是e^(jωt)

在这个画面里,几个关键值都变得特别直观。e^(j0)=1,向量躺在实轴上;e^(jπ/2)=j,向量转到虚轴正方向;e^(jπ)=-1,向量转到实轴负方向,这就是欧拉恒等式e^(jπ)+1=0的来历;e^(j2π)=1,转完一整圈回到原位,周期运动因此出现。

我还喜欢把e^(jωt)想成一个匀速转动的钟表秒针,只是它比钟表更抽象:既能正转也能反转,转速就是频率。这样一来,负频率也就不再神秘了——它只是反方向转的另一个秒针而已。你去看一个正弦波,它的频谱上为什么左右对称各有一条线?因为cos(ωt) = (e^(jωt) + e^(-jωt))/2,它本来就是两个反方向旋转的向量的组合。这条式子也是欧拉公式倒过来写就能得到的变形:cosθ = (e^(jθ) + e^(-jθ))/2sinθ = (e^(jθ) - e^(-jθ))/(2j)。这四个变形公式你应该背下来,因为后面的傅里叶级数重写全靠它们。

3. 从欧拉公式到傅里叶级数:用复指数拆周期信号

有了欧拉公式这把钥匙,周期信号的频域拆解就顺理成章了。教科书通常先讲三角形式的傅里叶级数,再过渡到指数形式,但很多人过渡时没跟住,总觉得指数形式里的负频率怪怪的。这里我把这条路重新走一遍,你注意看欧拉公式在每一步里做什么。

3.1 三角函数形式的傅里叶级数为什么不够用

一个周期为T的实信号,如果满足狄利克雷条件,可以展开成一堆不同频率的正弦和余弦之和:

x(t) = a₀ + Σ [aₙ·cos(nω₀t) + bₙ·sin(nω₀t)],其中ω₀=2π/T是基波角频率。

这里的问题很现实:每一项都要配两个系数aₙ和bₙ,而且如果你去看系数的积分表达式,会发现aₙ要去乘cos然后积分,bₙ要去乘sin然后积分,每个频率要分别求两次积分,公式长、记忆量大、计算也繁琐。更麻烦的是,如果你把带相位的余弦看成Aₙcos(nω₀t+φₙ),展开之后还是会同时出现sin和cos两项,本质问题没有变。

三角函数形式当然有直观的优势——它一眼就能看出来一个信号由哪些正弦波构成。但你做数学推导和后续的卷积、频域运算时,这套形式就像穿着湿棉袄跑步,每一步都施展不开。所以才有了向指数形式过渡的必要,而过渡的桥,就是欧拉公式那两组变形关系。

3.2 指数形式的傅里叶级数推导

把上面三角形式里的cos和sin都替换成复指数形式,会得到什么?以cos项为例,aₙcos(nω₀t)变成aₙ/2·e^(jnω₀t) + aₙ/2·e^(-jnω₀t),sin项也类似。然后你把e^(jnω₀t)的项归到一起,e^(-jnω₀t)的项归到一起,你会发现可以写成一个非常紧凑的和式:

x(t) = Σₖ Cₖ·e^(jkω₀t),k从负无穷取到正无穷。

其中系数Cₖ的求法也极其简单,利用复指数函数的正交性,两边同时乘以e^(-jmω₀t)再在一个周期内积分,最后得到:

Cₖ = (1/T) ∫ x(t)·e^(-jkω₀t) dt,积分范围是任意一个周期。

这个公式美在哪?第一,一个频率只需要一个复系数Cₖ,它同时包含了幅度信息和相位信息,是两者的综合体。第二,负频率在这里是自然出现的,对应的是反向旋转的复指数,把sin和cos展开后必然会带来它们,数学上必须存在,不是人为硬塞进来的。第三,k取负无穷到正无穷的求和符号,让整个级数在形式上高度统一,后续的卷积、能量计算、滤波器传输函数推导,全部可以在这个统一框架下进行。

我建议你自己推一遍这一步,拿一个简单信号,比如方波或锯齿波,分别用三角形式和指数形式求出各自的系数,再看两者之间的关系。做完一次之后,你对傅里叶级数的理解会踏实很多,因为你不再是背公式,而是看到了公式长出来的全过程。

3.3 频谱图到底在画什么

有了指数形式的傅里叶级数,频谱图就可以顺手画出来了。对每个整数k,算出复系数Cₖ,然后在横轴频率为k·f₀的位置上画一条线,高度等于复数Cₖ的模|Cₖ|,叫幅度谱;再画一张图表示Cₖ的辐角arg(Cₖ),叫相位谱。两张图合起来,就是信号的频域表示。

有个初学者必问的问题:负频率的幅度谱到底有没有物理意义?我的理解是:负频率只是数学表达的副产品。对实信号来说,正负频率的幅度谱对称相等,相位谱反对称,合在一起恰好还原出真实的cos或sin振动。如果你只画横轴从0到正无穷的“单边谱”,其实也行,每种分析方法取怎样的坐标系是取决于你要用它干什么的。这里真正的工程含义是:频谱图上每一条线,都对应着一个确定的旋转向量;这个向量转动的角速度就是频率,长度对应幅度,初始角度对应相位。时域波形是这些旋转向量在时间轴上的合投影,频域图把这些旋转向量按照转速高低摆开给你看,仅此而已。

4. 欧拉公式如何让频域的“乘法运算”变优美

标题里有一句话非常关键:欧拉公式能简单、优美地表达频域信号的乘法运算。这句话如果你只看数学公式,可能会觉得太抽象。我换成工程场景说:两个信号相乘,是通信系统里每天都在发生的事,调制、混频、解调、相关运算,本质上都是乘法。如果没有欧拉公式,这些乘法在频域里的效果会变得非常绕。

4.1 两个正余弦相乘:和差化积与频谱搬移

先看个最普通的情况:两个余弦波相乘。时域里做乘法,cos(ω₁t)·cos(ω₂t),用三角函数积化和差公式:

cos(ω₁t)·cos(ω₂t) = 1/2[cos((ω₁+ω₂)t) + cos((ω₁-ω₂)t)]

也就是说,两个频率的余弦相乘之后,变成了频率为“和”和“差”的两个余弦,幅度各自减半。这就是频谱搬移现象,是调幅、混频的数学基础。你说话的声音信号和某个高频载波相乘,整个声音频谱就被搬到了高频段,于是天线才能把信号高效发射出去。接收端再乘一次本振信号,频谱又被搬回来,这就是超外差接收机的基本原理。

但你看,用积化和差公式做一次、两次还行,如果相乘的信号本身已经是一堆频率分量的复合信号,积化和差就会变成一场噩梦,每一项都要展开,项数成倍爆炸。这时候如果你用欧拉公式把余弦写成复指数之和:cos(ω₁t)=(e^(jω₁t)+e^(-jω₁t))/2,那cos(ω₁t)·cos(ω₂t)就变成了四个复指数项的线性组合,每个复指数的指数上频率是±ω₁±ω₂,它的频谱结构一目了然:乘法运算在复指数域里退化成了简单的指数相加

为什么要强调“优美”?因为优美意味着计算效率高、不容易出错、整个系统的数学结构更清晰。在后续分析中,只有这种清晰的数学表达才能让你看到调制定理的本质:时域相乘,对应频域卷积。这背后一环扣一环,追根究底都离不开欧拉公式。

4.2 时域卷积对应频域乘法:卷积定理

如果说乘法在时域里的好处是直观,那它在频域里的好处就是省力。你听过多大系统的输出等于输入和冲激响应的卷积,对吧?时域算卷积,积分看着就累;但如果把两边都变换到频域,卷积运算就变成了简单的乘法:

Y(jω) = X(jω) · H(jω)

只要把输入信号的频谱X(jω)乘上系统频率响应H(jω),就得到输出频谱Y(jω),再逆变换回去就能得到输出波形。这就是为什么工程师都喜欢在频域里分析系统:串联级联系统的响应是各个系统响应的乘积,滤波器设计是对频响曲线的塑造,而不是去折腾时域里那个复杂积分。

这个定理的证明过程,恰恰是在善用欧拉公式性质的循环。你可以从时域卷积定义出发,把x和h各自用傅里叶级数或傅里叶变换表示出来,乘积展开后,指数因子的相乘自然合并、积分后产生频率选择性,最后得到频域乘法。可以说,如果没有欧拉公式把三角函数变成复指数,卷积定理的推导会复杂到让你怀疑人生,更不可能在工程计算中被如此广泛地应用。

反过来,时域乘法对应频域卷积,也就是调制定理,这在通信工程里是基础中的基础。一个信号乘上一个正弦载波,等效于在频域里把信号的频谱平移到载波频率附近,整个过程用图像去理解会非常直观:你是把一个频谱“抠出来”贴到另一个地方去,而欧拉公式保证了这种“搬移”在数学上干净利落。

5. 工程现场:在STM32F4上做音频频谱分析

理论讲再多,不落地总会让人心里发虚。我看很多热词里都有“基于STM32F4的音频信号采集与实时频谱分析系统”,就借这个例子说说欧拉公式和傅里叶级数的理论,到底怎么变成一个能跑的工程。别被“信号与系统”这个名字吓到,工程上它落地的路径其实非常清晰。

5.1 从公式到代码:FFT的工程化流程

音频频谱分析的核心任务,是把ADC采样到的时域波形,变换成频域幅度谱。你当然不会在单片机里手动去算那个傅里叶级数积分,工程上用的是FFT,也就是快速傅里叶变换,它是离散傅里叶变换的高效算法。但在理解层面,你要知道FFT干的事情和这节课里的Cₖ系数计算是同一件事:它算出信号里每一个频率分量的复数幅度。

STM32F4自带浮点运算单元,配合官方DSP库,做FFT非常方便。我的做法是先把关键参数定下来:采样率Fₛ、FFT点数N。比如Fₛ=8192Hz,N=1024,那频率分辨率是Δf = Fₛ/N = 8Hz。意思是,这个分析系统能区分频率间隔8Hz以上的两个信号。想要更高的频率分辨率,要么降低采样率,要么增加N,但代价是更大的计算量和更长的采样时间。

代码可以写成这样:

#include "arm_math.h" #define FFT_SIZE 1024 #define SAMPLE_RATE 8192 float32_t fftInput[FFT_SIZE * 2]; float32_t fftOutput[FFT_SIZE]; static arm_rfft_fast_instance_f32 fftInst; void Spectrum_Init(void) { arm_rfft_fast_init_f32(&fftInst, FFT_SIZE); } void Spectrum_Process(uint16_t *adcBuffer) { // 1. 减去直流偏置,并加汉宁窗,减小频谱泄漏 for (uint16_t i = 0; i < FFT_SIZE; i++) { float32_t sample = (float32_t)adcBuffer[i] - 2048.0f; float32_t window = 0.5f - 0.5f * arm_cos_f32(2.0f * PI * (float32_t)i / (FFT_SIZE - 1)); fftInput[2 * i] = sample * window; fftInput[2 * i + 1] = 0.0f; } // 2. 执行实数FFT arm_rfft_fast_f32(&fftInst, fftInput, fftOutput, 0); // 3. 计算的幅度谱 arm_cmplx_mag_f32(fftOutput, fftOutput, FFT_SIZE / 2); }

喂给FFT的输入数据是ADC采到的电压值,但要注意:STM32F4的ADC输入范围通常是0到3.3V,而音频信号是交流的,有正有负。所以前端电路上一般要加一个直流通路,把信号偏置到1.65V左右。软件处理时,第一步把这个直流偏置减掉,也就是代码里的-2048——对应12位ADC中点的典型值。如果不减这个直流成分,频谱图上0Hz的位置会顶起一个巨大的分量,把你的信号全部淹没进去。

5.2 工程调试遇到的三个坑

第一个坑就是加窗。我第一次做这个实验时,直接对裸数据做FFT,结果相邻频点之间出现了一片“裙边”,明明只有一个单频信号,频谱却一片模糊。原因在于:FFT默认把这段有限长的数据当成无限周期的延拓,而截断信号的边界通常是不连续的,这种不连续在频域里对应着高频泄漏。解决办法是对数据加窗函数,让采样序列首尾平滑过渡到零。汉宁窗是音频测试里常用的选择,主瓣稍宽,但旁瓣衰减很给力,在大多数场合能显著改善频谱质量。

第二个坑是ADC的采样抖动和时序。STM32F4的ADC用定时器触发DMA搬运是比较稳的,但如果触发源没有配好,或者DMA缓冲区没有做成乒乓结构,采集过程中很容易丢失数据或出现采样点错位,导致频谱“凭空”出现杂散。我的经验是,音频频谱分析至少要保证采样率是信号最高频率的两倍以上,工程上一般留足余量,比如目标分析10kHz以内的音频,采样率设定为44.1kHz甚至48kHz。

第三个坑是FFT点数与实时性的平衡。N=1024的时候,STM32F4做一次实数FFT消耗的时间在微秒到毫秒级别,看起来非常快,但如果你还做了加窗、幅度转换,整体占用的CPU周期会涨不少。如果要做一个实时更新的频谱显示器,我建议把采样、FFT、显示放到不同的执行节奏里:DMA持续采样,CPU在DMA半满和全满中断里交换缓冲区,FFT用单独的计算周期执行。这样频谱刷新率稳定,不会出现界面卡顿或者数据被覆盖的问题。

6. 常见问题与学习建议

到这里,欧拉公式从理论到工程的主线已经走完。还是有不少人在具体学习和应用中会反复问差不多的问题,我把这些年见过频率最高的几个整理成一张速查表,方便你遇到困惑时快速对照。

高频问题核心原因一把钥匙
e^(jωt)到底是什么东西它是复数域的一个旋转向量,不是实体信号想象它是个匀速旋转的指针,实部是它在水平轴上的影子
频谱图上的负频率有没有物理意义数学上由欧拉公式展开sin/cos时自然出现表示反向旋转的分量,对实信号正负频率对称合并后才是真实的峰值
三角形式和指数形式的傅里叶级数怎么选三角形式直观但公式冗长,指数形式紧凑适合推导运算做概念分析用三角形式,做数学推导和系统分析用指数形式
为什么时域卷积对应频域乘法这是傅里叶变换的卷积定理,本质上来自复指数的指数相加特性遇到卷积就考虑变换到频域算乘法,算完再变换回来
工程里FFT和傅里叶级数是什么关系FFT是离散傅里叶变换的快速算法,DFT是傅里叶级数在采样下的离散版本不用手动积分,库函数代劳;你要做的是理解频率分辨率和采样率的关系

6.1 学欧拉公式时应建立的几个直觉

我给初学者的第一建议是,别急着背公式推导,先动手画图。拿一张复平面图,从e^(j0)=1开始,每隔45度标一个点,把12个点连起来看看,你会发现它确实是一个圆。然后看看实轴上的投影值:1,0.707,0,-0.707,-1……这串数多熟悉,就是余弦函数的数值。画完这张图,欧拉公式“旋转加投影”的本质就已经刻在你脑子里了,比背十遍公式都管用。

第二个建议是把相位这个概念从“波形平移”升级成“初始角度”。相位不是抽象的概念,它表示t=0时刻旋转向量处在哪个角度。两个同频信号相乘时,相位差决定了乘积里直流分量的大小;滤波器改变相位,本质上是让每个频率分量的旋转向量被转动了不同的角度。把相位和旋转向量绑定后,很多搞不懂的现象会突然变得合理起来。

第三个建议是在学习傅里叶级数时,自己挑一个简单波形亲自算一遍。我不建议只看书上的方波例子的结果,最好自己用纸笔推一遍系数积分。这个过程会逼着你去用欧拉公式做各种指数相乘、积分、区间代换,做完一次之后你对指数形式的傅里叶级数会真正有肌肉记忆,而不是只停留在“看过但不会用”的状态。

6.2 从课程到项目:一个循序渐进的学习路径

如果你是为了工程项目来学这部分内容,比如要做一个音频频谱分析设备,我建议你按这个顺序推进:先花一个下午把欧拉公式和复指数信号理解透,把e^(jθ)在复平面上的图像画熟练;再花一两天把傅里叶级数的指数形式推导一遍,拿矩形波、三角波各算一次系数;然后搞清楚连续傅里叶变换和离散傅里叶变换的关系,重点理解采样率和频率分辨率这两个工程参数;最后再打开DSP库的FFT例程,把代码跑起来,用信号发生器注入一个已知频率的正弦波,验证你算出的频谱峰值是否出现在正确位置。

刚开始做频谱分析实验的时候,我特别建议用一个单频信号来校准整个系统。信号源产生一个已知频率的干净正弦波,比如1kHz,麦克风或线路输入进入调理电路,ADC采样,FFT,然后你看屏幕上是否在1kHz附近出现一个尖峰。如果位置偏了,检查采样率和FFT点数是否匹配;如果幅度不对,检查放大电路增益和ADC参考电压;如果旁边还有乱七八糟的谱线,先检查电源噪声和加窗处理。这套排查流程跑通之后,你再去分析语音信号、音乐信号,才会有底气。

6.3 我个人的体会

回头再看欧拉公式这个知识点,它其实不只是信号与系统课程里的一小节内容,更是一种思维方式的切换。我从一开始也绕了很多弯,走了很多弯路,是后来自己上手做了一些实验、亲手推了几遍公式之后,才真正体会到这座桥的价值。现在我做任何和频域打交道的项目,脑袋里都会自动出现那些旋转向量,遇到乘法运算首先想到指数相加,遇到卷积首先想到频域乘法,这些思维定式全靠当初把欧拉公式吃透才建立起来的。希望这篇内容能帮你省下一些我当年踩过的时间,让你更快走上通往频域信号世界的这座桥。

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询