ARTICLE DETAIL

资讯详情

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

傅里叶级数与傅里叶变换:从公式到工程应用的完整解析

傅里叶级数与傅里叶变换:从公式到工程应用的完整解析 傅里叶级数和傅里叶变换是数字信号处理、图像处理里面绕不开的两个词但我见过太多人把它们当成“考试写完就忘”的公式堆砌学完之后遇到实际信号依旧一头雾水。我自己的转折点来自一次机房故障排查一个低频噪声反复出现时域波形看不出规律但用傅里叶变换拉出频谱后问题立刻锁定在47Hz左右的机械振动源。从那一刻起我才意识到傅里叶工具不是一道数学题而是一种换视角看世界的方式。这篇文章想做的就是把我从“背公式”到“用公式”过程中所有关键思考、推导逻辑和工程教训完整串起来适合刚学完信号与系统但不知道怎么落地的学生也适合工作几年想重新理解频谱的工程师。1. 为什么非要有傅里叶级数和傅里叶变换先建立直觉1.1 所有信号本质上是“不同频率的叠加”很多教材一上来就扔出那个著名公式但从不解释人类为什么需要这样的分解。我先说个生活类比一杯混合果汁你尝到的是几种水果的复合味但你没办法直接从味觉中分离出“这里面有37%的苹果、22%的橙子、41%的西瓜”。傅里叶工具干的就是这个事它把一个看似复杂的时域信号拆成一个个单一频率成分然后告诉你每个成分的频率、幅度和相位。这种拆解的价值是巨大的因为时域波形容易被噪声淹没但频率成分可能非常稳定。比如一段语音信号在时域里画出来是一堆毫无规律的毛刺但进入频域后你会看到明显的共振峰结构这些共振峰才是语音识别真正依赖的特征。再比如机械故障诊断时域波形可能只有抖动但频谱图上某个倍频分量突然变大直接对应齿轮磨损或轴承缺陷。所以傅里叶变换本质上提供了一副“频率眼镜”让我们看见时域里看不见的东西。1.2 级数和变换的分工一句话说得清傅里叶级数和傅里叶变换的差别经常被搞混其实一句话就能讲清楚级数处理的是周期信号变换处理的是非周期信号。周期性意味着信号每隔一段时间重复自己比如电网的50Hz正弦波、心脏搏动信号、齿轮旋转的振动波形都属于周期信号。周期信号可以用傅里叶级数拆成一系列离散频率的谐波你用频谱笔画出来是一根根离散的竖线这叫离散频谱。但现实世界更多信号不是周期的比如一段语音、一帧图像、一段地震波它们不会无限重复自己。这类信号要用傅里叶变换拆出来的频率成分不再是离散谱线而是一段连续频谱每个频率点上的值代表该频率成分的“密度”。理解这个区分非常关键因为后面很多公式和应用都是围绕它展开的。2. 傅里叶级数解剖周期函数的“配方表”2.1 从三角级数到指数形式对于周期为T的函数f(t)最基础的傅里叶级数展开是把它表示成不同频率正弦和余弦的叠加f(t) a0 Σ[an·cos(nω0t) bn·sin(nω0t)]其中ω0 2π/T是基波角频率n是整数。a0是直流分量取一个周期内的平均值。an和bn是各次谐波的系数计算方式是让函数在区间内和对应三角函数做“内积”也就是乘起来积一个周期再除以周期an (2/T)∫f(t)cos(nω0t)dt bn (2/T)∫f(t)sin(nω0t)dt这里积分区间取[-T/2, T/2]或[0, T]都可以因为被积函数是周期的。这一步很多人当初学的时候只当是计算规则但它的物理意义很直接这个积分本质上是“检测器”它把信号中与cos(nω0t)相关的分量找出来。如果信号里根本没有这个频率的成分积分结果会趋于零如果有积分会积累出一个非零值。用复数指数形式表达更紧凑也更好用f(t) Σcn·e^(jnω0t)系数cn变成cn (1/T)∫f(t)·e^(-jnω0t)dt指数形式表看起来多了一个负号但计算上反而更统一尤其是后续推导傅里叶变换时几乎都使用指数形式。正负频率在物理上是对称的复数形式合在一起才能表示出实信号的相位信息这也是很多人第一次接触时觉得“负频率”很玄的根源。2.2 系数为什么这样算内积思想才是关键我说个关键的认知升级三角函数的积分公式本质上是一种“匹配滤波”。把两个同频信号相乘再积分结果很大不同频信号相乘再积分大部分都会正负抵消。这正是正交性的含义一组三角函数在积分内积的意义上彼此独立就像三维空间里的x轴、y轴、z轴一样谁也没法表示谁。所以求系数其实就是在做“投影”。an是f(t)在cos(nω0t)这个方向上的投影大小bn是f(t)在sin(nω0t)方向上的投影大小。你觉得这些公式繁琐一旦理解成“信号向各个频率轴做投影”整章内容就活过来了。实际计算时有些函数对称性很好比如偶函数的bn全为零奇函数的an全为零只算一半系数就够了。方波就是一个经典例子展开后只有奇次谐波的正弦项。我第一次手算方波级数时看到1, 3, 5, 7次谐波逐级叠加慢慢逼近一个方波轮廓有一种强烈的震撼感。2.3 收敛性、吉布斯现象和工程上的妥协傅里叶级数也不是万能的。对于信号中存在不连续点比如方波的跳变沿级数在这些点附近会出现过冲和振荡这就是吉布斯现象。理论上级数收敛到函数值的平均值但在不连续点附近最大过冲量大约是跳变幅度的9%而且不管加多少项都不会消失只是振荡越来越靠近跳变点。这个现象在工程上很重要。你做滤波器设计时如果直接用截断的傅里叶级数去逼近一个理想低通滤波器得到的频率响应会产生波纹这就是吉布斯现象在频域的表现。解决办法不是无限增加项数而是引入窗函数来平滑截断边界让过冲幅度大幅降低这也是为什么窗函数在滤波器设计和频谱分析中无处不在。3. 傅里叶变换突破周期限制后得到什么3.1 从离散谱到连续谱的极限思想如果信号不是周期的怎么处理答案是把它看成周期趋于无穷大的周期信号。周期T越来越大基波频率ω0 2π/T就越来越小离散谱线之间的距离越来越密。当T趋于无穷时离散谱线之间的间隔趋近于零原本一根根独立的谱线变成一条连续的频谱曲线。在这个极限过程中原来的级数系数cn也要重新理解。因为谱线间距趋近于零单个频率点上的幅度趋近于零但幅度除以频率间距后会保持有限值。这个有限值就是频谱密度函数通常记作F(ω)。于是我们得到傅里叶变换对F(ω) ∫f(t)·e^(-jωt)dt f(t) (1/2π)∫F(ω)·e^(jωt)dω第一个式子把时域信号变成频域表示称为正变换第二个式子把频域表示还原成时域信号称为逆变换。值得注意的是逆变换前面有1/2π因子这是角频率形式下积分变量的自然结果。如果你用频率f而不是角频率ω来写两个方向的变换会更对称但工程上手写计算时角频率更顺手。3.2 频谱不是“幅度表”而是密度函数初学者最容易犯的一个错误是把F(ω)想象成“这个频率上的幅度有多大”。严格来说不是这样F(ω)是密度真正落在一个小频带Δω内的分量大小是F(ω)·Δω。这个概念差异在你做信号重构时可以忽略但做功率谱时就不能含糊了。物理里面常说的功率谱密度就是基于这个密度思想定义的。帕塞瓦尔定理告诉我们信号在时域的总能量等于频域的总能量∫|f(t)|²dt (1/2π)∫|F(ω)|²dω这个公式的工程意义很大它保证了你在频域分析能量分布时不会因为换个坐标系就把能量搞丢。我做噪声源定位时经常用功率谱密度来判断哪个频段贡献了主要能量再针对性做降噪处理。3.3 时域和频域的“对偶关系”是怎么来的傅里叶变换有一堆对偶性质时域相乘对应频域卷积时域卷积对应频域相乘时域移位只在频域引入相位旋转频域移位则等价于时域乘一个复指数。这些性质不是孤立记忆的它们都源于指数函数e^(jωt)的对称性。我最喜欢用的一个性质是尺度变换压缩时域波形会拉伸频域范围反之亦然。这个直觉在现实中随处可用一段持续时间极短的脉冲频谱必然铺得很宽一段持续时间很长的缓慢波形频率必然很集中。反过来想你要做高分辨率时域定位就要付出频域宽带资源你要做窄带滤波就必须接受更长的时域观测时间。这种不确定性不是工程实现的问题而是傅里叶理论本身的固有性质很多人叫它“测不准原理的傅里叶版本”。4. 卷积定理与采样定理频域里最实用的两条结论4.1 卷积的物理意义系统输出是怎么被历史输入“叠加”出来的卷积在时域的理解一直劝退很多人因为它公式复杂(f * g)(t) ∫f(τ)g(t-τ)dτ但我建议你用“记忆效应”来理解它。任何一个线性时不变系统它的输出等于输入信号与系统冲激响应的卷积。冲激响应就是系统对单位冲击的响应它本质上描述了系统对过去输入的“记忆权重”越久远的影响权重越小。把所有历史输入按照记忆权重叠加起来就是当前输出。这个理解在实际工程里特别管用。比如设计一个回声消除系统房间冲激响应就代表声音到达麦克风之前经过墙壁反射的延迟和衰减模式麦克风采集到的信号等于原始声音与房间冲激响应的卷积。要恢复原始声音就要做解卷积操作。4.2 卷积定理两个域里各做一件事卷积定理说F{f * g} F(ω)·G(ω)时域卷积等于频域相乘反过来时域相乘等于频域卷积。这个定理是线性系统分析的核心武器。直接在时域做卷积计算量很大尤其是长数据序列但转换到频域做乘法再逆变换回来计算量会少很多。这正是FFT在卷积计算中大显身手的原因工程实现中快速卷积算法基本都是取巧走了这条路。更重要的是它给了我们设计线性滤波器的全新思路在频域直接指定想要的频谱形状逆变换回去就得到滤波器的冲激响应卷积就是滤波过程。我设计FIR滤波器时就是先在频域定目标响应然后用逆变换算出系数再根据吉布斯现象决定是否加窗。4.3 采样定理时域离散化后频谱发生了什么连续信号进入计算机第一步就是采样。采样过程可以用一个单位冲击串与原始信号相乘来数学建模。单位冲击串在频域里也是冲击串时域相乘对应频域卷积结果就是原始频谱被复制成无数个副本副本之间间隔等于采样频率fs。关键问题来了如果原始信号的最高频率f_max小于fs/2这些频谱副本不会重叠只要用一个理想低通滤波器就能把其中一个副本完整取出来还原出原始信号。这就是奈奎斯特采样定理的核心。但如果f_max超过fs/2频谱副本会相互重叠这个重叠就是混叠一旦混叠发生信息就永久丢失了再好的滤波器也救不回来。这个认知对实际工作的影响太大了。采样率不是随便定一个值就完事你要结合信号本身的最高频率决定。很多ADC都内置抗混叠滤波器这是硬件层面把你采样前的高频成分先滤掉防止混叠。我见过不少新手只关注采样率却忽略了抗混叠滤波最后频谱图上出现奇怪的假峰还以为是信号内部出了问题。4.4 采样率选择的现实案例举一个具体例子一个音频信号标称带宽是0到20kHz你要采样它。按照采样定理最低采样率是40kHzCD标准用的44.1kHz就是留了一点余量。为什么要有余量因为真实抗混叠低通滤波器不是理想陡峭的从通带到阻带需要一个过渡带高一点采样率能把这个过渡带留在关音频带之外降低滤波器设计要求。处理振动信号时也是同理。假如你要分析100Hz以内的机械振动采样率设在200Hz就够了理论上是但实际传感器输出的信号里可能混有电源干扰50Hz的谐波、高频噪声等你不加抗混叠滤波器直接用200Hz采样那些高频成分会折叠到低频段污染你真正关心的频谱。所以我处理现场信号时的习惯是先用高采样率采集再加数字低通滤波最后降采样而不是直接选一个刚好的采样率。5. 从连续公式到计算机实现DFT和FFT的工程真面目5.1 为什么不能直接用连续傅里叶变换编程连续傅里叶变换要求对时间从负无穷积分到正无穷计算机根本做不了。实际使用的是离散傅里叶变换DFT它的输入是一串有限长度的采样点输出也变成一串离散的频率点。DFT的数学形式跟傅里叶级数高度相似有限长序列 x[n]长度NDFT结果是X[k]X[k] Σx[n]·e^(-j2πkn/N)k对应第k个频率点n是时间样本索引。这个式子本身复杂度是O(N²)当N等于上万点时计算量很大所以工程上几乎都使用快速傅里叶变换FFTFFT是DFT的高效算法不是不同的变换。理解这个关系很重要很多人把FFT当成一种神秘的替代品其实它就是DFT只不过利用了指数项的周期性和对称性做了分治加速复杂度降到O(NlogN)。5.2 FFT结果怎么看频率分辨率、幅度相位、横纵坐标拿到FFT结果之后真正让你头疼的往往不是计算过程而是结果解读。先说频率分辨率它等于fs/N也就是采样率除以FFT点数。N越大相邻谱线间隔越小能区分两个很接近的频率的能力就越强。但N直接受观测时间的限制观测时间越长频率分辨率越好这是一个绕不开的trade-off。再看纵坐标幅度。FFT输出的复数模代表幅度但很多人直接取绝对值后发现数值跟预想的不一致原因在于归一化。对实数信号做N点FFT负频率部分跟正频率部分是对称的工程上通常只取前半部分作为频谱并把幅度乘以2/N来恢复正弦分量振幅。这个细节我踩过很多次坑调试时总是对不上量值后来养成习惯先用一个已知幅值正弦波去验证整套流程再处理未知信号。横坐标频率也容易错。k点对应的实际频率是k·fs/Nk从0开始。0对应的叫直流分量也就是信号的均值。很多人直接plot(abs(fft(x)))横轴默认是k不换算成Hz纵轴不归一化画出来的图只能看相对形状无法做定量分析。5.3 频谱泄漏、窗函数和零填充非整周期截断是FFT分析中最大的坑。假设信号是50Hz正弦波采样率1000Hz观测时间0.1s正好包含5个周期FFT结果很干净在50Hz处出现一根谱线。但如果你观测0.12s包含6个周期理论上还是50Hz但当截断端点不是整数周期时信号在连接处出现跳变FFT会把这个跳变当成额外的频率分量导致频谱能量向邻域扩散这就是频谱泄漏。解决频谱泄漏的通用办法是加窗。窗函数的作用是把截断边界处的样本权重调低让信号在首尾平滑趋于零。常见窗有汉宁窗、海明窗、布莱克曼窗它们的区别主要体现在主瓣宽度和旁瓣衰减上。主瓣越宽频率分辨能力越差旁瓣衰减越高泄漏抑制越好。选窗就是一个权衡做通用频谱分析时我用汉宁窗比较多要分离两个幅度相差很大的相近频率我可能会选布莱克曼窗。零填充是另一个容易被误解的操作。在FFT之前给数据补零可以让频谱曲线看上去更平滑因为插值点变多了但它无法真正提高频率分辨率。频率分辨率由有效观测时间决定零填充只是对原频谱做“平滑插值”不会增加新的物理信息。我跟人交流时经常强调这点因为网上很多教程把零填充说成“提高精度”这是不对的。5.4 一个小实验用Python验证整周期与非整周期截断的差异写成验证代码其实很简单import numpy as np import matplotlib.pyplot as plt fs 1000 t1 np.arange(0, 0.1, 1/fs) # 0.1s恰好5个周期 t2 np.arange(0, 0.12, 1/fs) # 0.12s非整数周期 f 50 x1 np.sin(2*np.pi*f*t1) x2 np.sin(2*np.pi*f*t2) X1 np.abs(np.fft.rfft(x1)) * 2 / len(x1) X2 np.abs(np.fft.rfft(x2)) * 2 / len(x2) freq1 np.fft.rfftfreq(len(x1), 1/fs) freq2 np.fft.rfftfreq(len(x2), 1/fs)画出来你会发现整周期截断的频谱在50Hz左侧几乎干净非整周期截断的结果在45Hz到55Hz之间产生一大片扩散50Hz峰值也变低了。再把x2乘以np.hanning(len(x2))再做FFT泄漏明显被压下去但主峰也稍微变宽了一点。这个实验值得亲手跑一次跑完你对窗函数的理解会远超背参数表。6. 图像处理里的傅里叶变换从一维到二维的跳跃6.1 图像频谱到底在看什么二维傅里叶变换是把二维图像信号分解成不同方向和不同频率的平面波。一维时只有频率高低之分二维多了方向维度。图像频谱的中心位置对应低频边缘对应高频从这个角度看图像的边缘、纹理、细节都是高频成分平坦区域则集中在低频。这个视角在图像处理中非常好用一个典型场景是频域滤波。想去除图像中的周期噪声比如扫描图里的莫尔条纹噪声在频谱上表现为一组亮斑点你可以在频谱上找到这些点并做掩码消除再逆变换回去噪声就消失了大半。这种方法在空间域几乎无法轻松实现但转到频域后思路非常直观。6.2 卷积定理在图像与神经网络中的应用图像卷积在深度学习里卷积神经网络能自动学习一组卷积核本质上就是在用冲激响应描述局部特征的提取方式。虽然现代深度学习框架多做空间域小卷积核但理解大卷积核可用FFT加速的原理对做长距离建模很有启发。一些老式图像处理算法例如“将图像与高斯核卷积实现模糊”直接做是O(N·M)复杂度转为频域变成一次乘法对处理超大图像或超大核时速度优势明显。虽然现在GPU和深度学习框架把空间卷积优化得很好但理解频域加速的数学底层对算法选型还是很重要。6.3 离散余弦变换为什么在压缩领域更重要要特别提一下离散余弦变换DCTJPEG压缩的核心就是它。DCT本质上是对实信号做偶延拓后的傅里叶变换好处是输出的频率系数全是实数而且能量更加集中很多接近零的小系数可以被舍弃而不明显影响观感。这就是JPEG的“有损压缩”步骤之一量化表背后的逻辑就是人眼对高频细节不敏感允许牺牲这部分信息换来更高压缩比。视频编码H.264、H.265也都基于整数的DCT变体。所以当你理解了傅里叶变换把信号从时域换到频域、让能量更集中这个思想再去看DCT、小波变换都会觉得顺理成章它们都是“变换编码”这个大家族的不同选择。7. 使用FFT进行频谱分析我踩过的几个坑和避坑套路汇总7.1 坑一不先滤掉直流频谱周围的“小山丘”挡住了真实峰值如果信号均值不为零FFT的第一个点也就是直流分量会非常大。它在图上表现为一个尖峰同时由于频谱泄漏这个巨大的直流峰还会“裙边”式地覆盖旁边的低频区域。我处理实际数据时会先做去均值把整段数据减去平均值再做FFT这样直流分量的影响就削弱很多。7.2 坑二频率轴换算错了结果“差一倍”用rfft时返回的样本中后半部分负频率被省略了长度变为N/21。频率轴要用np.fft.rfftfreq(N, 1/fs)去生成而不是自己用np.arange(0, N/2)再做简单缩放。很多人在这个细节上吃过亏横轴算错之后整个频谱对不上物理量。还有一个注意点如果信号中包含一个幅度为A的正弦波rfft出来的对应谱线模值再乘以2/N之后才等于A。如果你直接用abs值去还原波幅会得出减半的结论。用完整FFT再拆正负频信息时正负两个分量加起来的能量才能对应原信号幅度所以rfft时严格记着乘以2/N。7.3 坑三不加窗直接看频谱电机的“真实频率”被噪声模糊了我做电机振动分析时遇到过这种情况电机在48Hz附近运转但频谱图上50Hz附近一大片频谱全是乱的原因是采样观测时长跟电机转速周期无法对齐截断产生了严重频谱泄漏。加上汉宁窗之后再分析48Hz的基频和二次谐波都非常清晰定位故障一下子容易了。但加窗会牺牲频率分辨率特别是两个频率只相差很小的情况。要同时兼顾分辨率就只能延长采样时间这是最可靠的办法。7.4 弄一个“先验证后分析”的处理流程我给自己固定了一套处理流程每次拿到新数据都不慌第一步画出原始时域波形看看有没有明显异常、是否有直流偏置第二步去均值必要时剔除野值第三步根据目标频率范围和信号特性选采样率与观测时长第四步加合适窗函数第五步FFT后正确归一化用已知频率幅度信号校验第六步再进入业务分析。这套流程非常朴素但每步都对应一个真实的坑。很多人拿到数据就直接FFT要把窗、去均值这些“预处理”都跳过去最后折腾半天也搞不清频谱上那些莫名其妙的分量是哪来的。在实际工作里傅里叶分析很少是“算出来就结束了”它往往是整个判断链条的第一环。你可以用它定位异常频率再结合机械结构或系统模型推断激励源最后做针对性整改。频域思路的价值不在于公式本身而在于给你提供一套用频率连接物理现象的思维框架。回头再看文章标题里“从基础到应用”这几个字我自己的体会是基础指的不是会背公式而是懂得每个公式背后的假设条件应用指的不是调一个现成函数而是遇到实际问题时能判断该用什么工具、结果该信几分、又该做哪些补偿把这几件事练到形成肌肉记忆才算真正把傅里叶分析“用”起来了。
返回列表