ARTICLE DETAIL

资讯详情

深耕网站建设与运营推广的一线实战洞察。

欧拉公式:从时域到频域的桥梁,工程频谱分析的基石

欧拉公式:从时域到频域的桥梁,工程频谱分析的基石 说实话我见到太多人学《信号与系统》学到傅里叶级数就被劝退总觉得那一堆三角函数、积分、系数看着就头疼。但如果你问一个工程师这门课里最值得反复琢磨、真正能改变你理解世界方式的东西是什么我会说欧拉公式。它把指数函数、三角函数、虚数这三个看似八竿子打不着的概念统一成一句话也是通往频域信号世界的那座桥尤其当你面对周期信号的周期运动想把复杂的乘法运算变得简单优美时这个公式的价值会体现得淋漓尽致。这篇内容我不会去堆数学证明而是想站在一个学完这门课、又在工程里真刀真枪做过频谱分析的人的角度把欧拉公式从“看着很酷”讲成“确实有用”。适合所有正在被《信号与系统》折磨的学生也适合那些工作中要用到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π)10的来历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ₛ8192HzN1024那频率分辨率是Δ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点数与实时性的平衡。N1024的时候STM32F4做一次实数FFT消耗的时间在微秒到毫秒级别看起来非常快但如果你还做了加窗、幅度转换整体占用的CPU周期会涨不少。如果要做一个实时更新的频谱显示器我建议把采样、FFT、显示放到不同的执行节奏里DMA持续采样CPU在DMA半满和全满中断里交换缓冲区FFT用单独的计算周期执行。这样频谱刷新率稳定不会出现界面卡顿或者数据被覆盖的问题。6. 常见问题与学习建议到这里欧拉公式从理论到工程的主线已经走完。还是有不少人在具体学习和应用中会反复问差不多的问题我把这些年见过频率最高的几个整理成一张速查表方便你遇到困惑时快速对照。高频问题核心原因一把钥匙e^(jωt)到底是什么东西它是复数域的一个旋转向量不是实体信号想象它是个匀速旋转的指针实部是它在水平轴上的影子频谱图上的负频率有没有物理意义数学上由欧拉公式展开sin/cos时自然出现表示反向旋转的分量对实信号正负频率对称合并后才是真实的峰值三角形式和指数形式的傅里叶级数怎么选三角形式直观但公式冗长指数形式紧凑适合推导运算做概念分析用三角形式做数学推导和系统分析用指数形式为什么时域卷积对应频域乘法这是傅里叶变换的卷积定理本质上来自复指数的指数相加特性遇到卷积就考虑变换到频域算乘法算完再变换回来工程里FFT和傅里叶级数是什么关系FFT是离散傅里叶变换的快速算法DFT是傅里叶级数在采样下的离散版本不用手动积分库函数代劳你要做的是理解频率分辨率和采样率的关系6.1 学欧拉公式时应建立的几个直觉我给初学者的第一建议是别急着背公式推导先动手画图。拿一张复平面图从e^(j0)1开始每隔45度标一个点把12个点连起来看看你会发现它确实是一个圆。然后看看实轴上的投影值10.7070-0.707-1……这串数多熟悉就是余弦函数的数值。画完这张图欧拉公式“旋转加投影”的本质就已经刻在你脑子里了比背十遍公式都管用。第二个建议是把相位这个概念从“波形平移”升级成“初始角度”。相位不是抽象的概念它表示t0时刻旋转向量处在哪个角度。两个同频信号相乘时相位差决定了乘积里直流分量的大小滤波器改变相位本质上是让每个频率分量的旋转向量被转动了不同的角度。把相位和旋转向量绑定后很多搞不懂的现象会突然变得合理起来。第三个建议是在学习傅里叶级数时自己挑一个简单波形亲自算一遍。我不建议只看书上的方波例子的结果最好自己用纸笔推一遍系数积分。这个过程会逼着你去用欧拉公式做各种指数相乘、积分、区间代换做完一次之后你对指数形式的傅里叶级数会真正有肌肉记忆而不是只停留在“看过但不会用”的状态。6.2 从课程到项目一个循序渐进的学习路径如果你是为了工程项目来学这部分内容比如要做一个音频频谱分析设备我建议你按这个顺序推进先花一个下午把欧拉公式和复指数信号理解透把e^(jθ)在复平面上的图像画熟练再花一两天把傅里叶级数的指数形式推导一遍拿矩形波、三角波各算一次系数然后搞清楚连续傅里叶变换和离散傅里叶变换的关系重点理解采样率和频率分辨率这两个工程参数最后再打开DSP库的FFT例程把代码跑起来用信号发生器注入一个已知频率的正弦波验证你算出的频谱峰值是否出现在正确位置。刚开始做频谱分析实验的时候我特别建议用一个单频信号来校准整个系统。信号源产生一个已知频率的干净正弦波比如1kHz麦克风或线路输入进入调理电路ADC采样FFT然后你看屏幕上是否在1kHz附近出现一个尖峰。如果位置偏了检查采样率和FFT点数是否匹配如果幅度不对检查放大电路增益和ADC参考电压如果旁边还有乱七八糟的谱线先检查电源噪声和加窗处理。这套排查流程跑通之后你再去分析语音信号、音乐信号才会有底气。6.3 我个人的体会回头再看欧拉公式这个知识点它其实不只是信号与系统课程里的一小节内容更是一种思维方式的切换。我从一开始也绕了很多弯走了很多弯路是后来自己上手做了一些实验、亲手推了几遍公式之后才真正体会到这座桥的价值。现在我做任何和频域打交道的项目脑袋里都会自动出现那些旋转向量遇到乘法运算首先想到指数相加遇到卷积首先想到频域乘法这些思维定式全靠当初把欧拉公式吃透才建立起来的。希望这篇内容能帮你省下一些我当年踩过的时间让你更快走上通往频域信号世界的这座桥。
返回列表