拓冰建站拓冰建站
首页 / 资讯中心 / 正文

傅里叶变换从时域到频域:FFT、窗函数与频谱分析的工程实战

1. 从一杯咖啡看时域与频域傅里叶变换到底在干什么做信号处理这些年我遇到过无数人问同一个问题傅里叶变换学了到底有什么用课本上那一堆公式考试前背得滚瓜烂熟考完就忘等到真正做项目时又发现绕不开它。我在带团队做高速连接器仿真的时候CST里跑时域TDR时域反射计仿真最后还是要切到频域去看插损回损在调试音频算法时时域的波形肉眼看着很正常可低频嗡声和高频底噪混在一起怎么都定位不了问题源头一旦切到频域一眼就看出问题出在哪个频点。这个场景相信很多做通信、射频、音频、控制、图像处理甚至机械振动分析的朋友都似曾相识。傅里叶变换的价值恰恰就藏在这种从时域切到频域的思维转换里。那到底什么是时域和频域用一句大白话说时域是看信号随时间怎么变频域是看信号里有哪些频率成分、每个成分占多大比重。两者的关系用我常给学生打的一个比方就能讲明白——一杯咖啡。时域是你看到的这杯咖啡的整体状态颜色、温度、香气随时间的变化一口喝下去是苦是甜这些是你在时间轴上的真实感受。频域则是把这杯咖啡拆解成成分清单多少水、多少咖啡因、多少糖、多少奶、比例如何。清单虽然不告诉你这杯咖啡好不好喝但告诉你味道到底由什么构成。傅里叶变换干的事就是把那杯混在一起的咖啡送进一台成分分析仪吐出一张配料表。这杯咖啡式的比喻我建议所有学信号处理的人都收下。因为一旦你看懂了这张配料表——频域图——接下来无论是滤波、降噪、调制解调还是压缩、特征提取你就知道每一步操作到底在动时间波形还是在动频率成分手里有了地图再也不怕迷路。这篇文章我就把傅里叶变换这条主线从头捋一遍从最朴素的物理直觉出发把连续傅里叶变换、离散傅里叶变换和FFT之间的血缘关系讲清楚再结合我在高速连接器CST时域仿真、音频时域掩蔽效应处理和SAR方位向压缩里实际用到傅里叶变换的案例聊一聊什么时候该用频域思维计算时参数怎么定踩过哪些坑。我尽量用做项目时真正关心的角度来讲不罗列一堆推不完的数学求证但核心的公式物理意义和分析逻辑一样都不会少。2. 一切信号的底层逻辑为什么非要把时域信号拆成频率2.1 时域和频域不是两个世界而是同一个信号的两副面孔先花点篇幅把时域和频域的人格分裂讲透。这步如果没想清楚后面所有的实操都是空中楼阁。我们最常见的信号表示方式就是示波器上看到的那根波形横轴是时间纵轴是电压或振幅这根波形记录了信号在每一个瞬间的大小。这就是时域表示。它的优势是直观——你看到的东西就是信号真实的样子毛刺就是毛刺突跳就是突跳不需要任何想象。但时域有一个致命短板当多个频率成分叠加在一起的时候你几乎无法从波形上分辨出里面到底有哪些频率。举个例子一个1kHz、幅度为1V的正弦波叠加一个100kHz、幅度为0.1V的正弦波时域波形看起来只是主波的周围多了一层细密的毛边。你要是想滤掉那层毛边又不想伤到主波在时域里直接动手几乎无从下手——你不知道该用什么样的窗函数、什么样的滤波系数。频域呢同样是这个信号画出来就是两根清晰的谱线一根在1kHz处高度为1一根在100kHz处高度为0.1。任务瞬间明确把100kHz那根砍掉1kHz那根留着。所有操作都变得一目了然。傅里叶变换要解决的核心矛盾就是信号的时间和频率信息无法同时高分辨率地直观呈现。它通过把信号投影到一组正交基不同频率的正弦和余弦函数上把叠加在一起的频率成分一一分离出来。这个思路本质上和线性代数里把一个向量分解到坐标轴分量一模一样。正弦和余弦相互正交任何一段满足条件的信号都可以视为它们的线性组合这就是傅里叶变换能成立的数学根基。2.2 合成与分解傅里叶变换的一体两面傅里叶变换从来不是单方向的。我在实际讲这个知识点时一定会强调它的两面性——分解和合成对应数学上的正变换和逆变换。合成方向任何信号都可以用一组正弦波叠加出来。哪怕是一个方波理论上也可以用无穷多个奇次谐波的正弦波叠出来。你想象一下一个方波从没有到有其实是一次一次加上去的过程先加一个基频正弦方波变得圆润粗糙再加三次谐波边沿变陡再加五次、七次……加得越多越接近理想方波的直角边沿。这就是逆傅里叶变换的物理图景。分解方向正傅里叶变换干的是反过来的事。它把一堆叠加在一起的正弦波重新拆回一条条独立的谱线。数学上它通过积分或求和的方式将原始信号与每一个候选频率的正弦波做相关性检测——信号里如果存在某个频率成分那么信号与这个频率的正弦波相乘后积分的值就大反之这个积分值几乎为零。积分结果的大小就对应了这个频率成分的幅度。这两个方向加在一起就构成了一个完整的编码-解码系统。我们做的很多信号处理工作本质都在这个系统里穿梭先正变换到频域处理滤掉某些频率再逆变换回时域用还原出处理后的波形。频域不是终点而是加工车间。2.3 为什么正弦波是那个天选之基很多人会问为什么偏偏选正弦波做基函数用方波、三角波不行吗这是个好问题。答案是正弦波经过线性系统之后依然是正弦波只是幅度和相位可能变了。这个性质叫做特征函数性质。打个比方你给一个系统输入一个100Hz的正弦波系统的输出哪怕波形被拉变形了但只要系统是线性的、时不变的输出的频率依旧是100Hz的正弦波顶多幅度小一点、相位偏了一点。这种频率保持特性让我们可以把任意复杂信号拆成正弦波的组合然后逐个频率地研究系统对它的响应最后再把所有输出拼起来。这就是为什么频域分析对电路、滤波器、信道这些线性系统这么有效。如果换方波做基输入方波经过一个低通滤波器输出马上就变成圆头圆脑的怪形状你再想把它按方波基函数展开就会碰到无穷无尽的谐波完全失去简洁性。所以正弦波不是唯一的选择但绝对是最省力、最优雅的选择。这也是傅里叶变换能够渗透到几乎所有工程技术领域的底层原因。3. 从连续到离散傅里叶变换真正落地要过的三关3.1 连续世界的傅里叶变换公式背后的物理直觉连续傅里叶变换的公式长这样X(f) ∫ x(t)·e^(-j2πft) dt刚看到这个公式时不少人的第一反应是这e的复指数是什么鬼为什么来个负号为什么要积分我换个说法可能会舒服很多。这个公式其实是在干一件事把信号x(t)和频率为f的参考正弦波做内积。复数指数e^(-j2πft)展开之后是cos(2πft) - j·sin(2πft)也就是同时拿信号的实部去和余弦比、再拿信号和正弦比积分代表在整个时间段上做平均式的乘法叠加。信号里有多少这个频率的成分跑出来的那个复数的模就多大信号起始点相对参考波形的偏移则体现在复数的辐角——相位上。所以X(f)是一个复数。它的模就是该频率成分的幅度它的辐角就是该频率成分的相位。很多时候我们只画幅度谱|X(f)|但相位谱同样重要特别是在图像重建、系统均衡、滤波器相位线性度这些场景里丢了相位信息信号就会严重变形。我自己做高速信号的群延迟分析时对相位谱的敏感度甚至高于幅度谱。连续傅里叶变换的适用场景是理论推导和模拟信号分析。它的定义域是连续函数积分从负无穷到正无穷。但在数字世界里我们没有无限长的连续信号只有一个一个的采样点所以必须做离散化改造。3.2 离散傅里叶变换数字世界真正能算的那个公式离散傅里叶变换DFT的公式长这样X(k) Σ x(n)·e^(-j2πkn/N)n从0到N-1这个公式和连续版本长得几乎一样只是积分变成了求和f变成了离散的频点序号kN是采样点数。DFT的输出是N个复数每一个对应一个离散频率点。第k个频率点对应的真实物理频率是k·(fs/N)其中fs是采样率。N个输入点N个输出点这N个输出点均匀分布在0到fs的频率范围内。其中第0个点是直流分量第1个点对应fs/N第2个点对应2fs/N以此类推。注意DFT的输出是对称的——第k个点和第N-k个点关于N/2对称幅度相同这个N/2对应的频率就是奈奎斯特频率。也就是说采样率fs的系统最高能看到fs/2的频率信息这是由采样定律决定的硬约束。很多人在刚接触DFT时最容易绕晕的就是k到底代表什么频率。我自己的经验是永远先算出频率分辨率Δf fs/N然后用Δf乘以k就是第k个频点的物理频率。这一步在任何信号分析软件里都是第一件事务必养成习惯。3.3 FFT到底快在哪很少有人讲清楚的突破点FFT快速傅里叶变换不是一种新的变换它是DFT的一种高效算法。这个区别非常关键——FFT算出来的结果和DFT一模一样只是快得多。DFT直接算N个点需要N²次复数乘法。当N是1024时大约是100万次乘法现代计算机能轻松扛住但当N变成65536、131072这样的规模时N²就是一个天文数字直接计算会让仿真卡到怀疑人生。FFT利用了旋转因子的周期性和对称性把大N分解成小N的DFT把计算量从O(N²)降到O(N·log2N)。举个例子N131072时直接算DFT需要约171亿次复数乘法而FFT只需要约220万次——差距是四个数量级。这就是为什么我们在做CST仿真、音频处理、SAR成像时所有工具的背后都在用FFT跑DFT。写代码时如果自己手动实现DFT而不是调用FFT函数在数据量稍大时完全无法忍受。3.4 采样率和点数怎么定与频域分辨率有关的血泪经验在实际做频谱分析时最常遇到的坑就是频率分辨率不够。频率分辨率等于fs/N。这意味着你想要分辨两个相距很近的频率成分就必须让N足够大。但N受限于采样时长因为N fs·TT是你采集信号的总时长。总结下来就是一条铁律频率分辨率只和采样总时长有关和采样率无关。这句话我刚入行时绕了很久。直观理解是你看的时间窗越长你越能区分两个频率微小的差异采样率再高如果只采了很短的时间频率分辨率照样很差。我做高速连接器TDR测试时经常要判断一个微小的阻抗不连续点在什么位置。TDR时域上看得清楚但想分析它的频域特征时就得保证采集窗口足够长否则频域谱线全是糊在一起的。这个经验无数次提醒我动手做FFT之前先想清楚目标和时间窗口而不是盲目堆采样率。4. 傅里叶变换的工程实战三个让我真正理解它的应用场景4.1 高速连接器设计CST时域仿真的频域切片先讲我接触最多的场景高速连接器的SI信号完整性设计。很多人以为我们这类工程师天天在看眼图和抖动实际上我们大量时间花在换个角度看同一个问题上。CST软件里的TDR时域仿真本质上就是给连接器的信号通路送一个阶跃脉冲观察反射波随时间的返回情况。反射波在哪个时间点出现说明不连续点在传输路径的哪个位置反射的极性和强度说明该处阻抗是偏高还是偏低。这个时域分析非常直观能够快速定位哪一段过孔、哪一段焊盘影响了阻抗匹配。但时域TDR解决不了所有问题。比如我要评估这个连接器在5Gbps、10Gbps甚至更高速率下能不能用单看TDR曲线还不够——我需要知道它的频域插损和回损。做法是把时域的阶跃响应做FFT变换到频域看S参数曲线在相关频段的表现。CST仿真能同时给出时域波形和频域频谱的视图我经常来回切换先TDR定位物理位置再FFT看频域幅度和相位两者互相验证。这个流程里傅里叶变换承担的职责是桥接——把物理上的位置信息时域和电气上的频率响应信息频域对应起来。没有这个变换你只能靠经验猜阻抗不连续点对高频信号的影响有多严重有了频域曲线设计改哪里、怎么改方向就清晰多了。这也回答了很多新人的疑问做仿真为什么要学傅里叶变换因为高频设计里的所有指标——插损、回损、串扰、走线阻抗——本质上都是频率的函数而你的仿真软件默认给出的很多结果又是时域的二者必须靠FFT打通。4.2 音频处理里的时域掩蔽效应为什么听觉和频谱图绑定再讲一个跨到音频领域的例子。时域掩蔽效应简单说就是一个响的声音出现之后紧跟着的一个弱声音会暂时听不见因为强声把弱声盖住了。这本质上是一种时域现象。但你在做音频编解码算法时要利用掩蔽效应去决定哪些频率成分可以舍弃这时候就非得转到频域不可。MP3、AAC这些有损压缩格式背后都是先做MDCT变换一种改良的离散余弦变换和FFT同宗同源把时域波形切成片段每段变换到频域然后根据人耳的掩蔽阈值把那些听不见的或细微的频率分量砍掉保留主要成分从而大幅压缩数据量。这个过程中时域掩蔽和频域掩蔽是一起工作的时域掩蔽决定哪些时间段的重要度高频域掩蔽决定哪些频率带可以粗量化。我自己调试过一个小型的音频降噪程序原始录音里有一段背景电流声外加一段人声。时域上你很难手动抠出电流声的波形但在频域里电流声往往集中在50Hz或者它的整次谐波上而人声集中在几百Hz到几kHz。设计一个频域滤波器把50Hz和它的谐波频点的增益拉下来再逆变换回时域人声质量损失极小电流声基本消失。这就是傅里叶变换在音频处理里的典型应用范式时域听感问题变换到频域解决再变换回来。4.3 雷达成像的方位向压缩到底是压缩时域还是频域最近看到有网友在问方位向压缩是压缩的频域还是时域这是个很典型的混淆点。要回答这个问题得先分清楚两个方向距离向和方位向。在SAR合成孔径雷达成像中距离向压缩通常是在频域做的——对每个脉冲回波做FFT在频域做匹配滤波再IFFT逆FFT回来这个过程叫脉冲压缩。它压缩的是时域的脉冲宽度但实际操作在频域完成。方位向压缩则是对同一目标在多个不同方位角接收到的回波做处理沿方位向做FFT后在方位向频域也就是多普勒频域做匹配滤波再IFFT回来。从操作上看方位向压缩的匹配滤波也是在频域执行的但从物理含义上说压缩的是方位向的时域合成孔径长度。所以严格来讲SAR的两个方向压缩执行层面都是频域但被压缩的物理量在时域或者说空间域因为雷达平台移动时方位向采样点对应不同的时间位置。这类问题如果只在时域打转永远不会通透你必须同时掌握时域和频域两套坐标系并且随时准备在两个坐标系之间切换。傅里叶变换就是切换开关。5. 参数选择的隐形陷阱频谱泄漏、窗函数和零填充5.1 频谱泄漏的根源截断即加窗做FFT时我们永远只能处理有限长的信号段。这就是一个截断操作等价于把原始信号乘上了一个矩形窗。矩形窗在频域是sinc函数形状它会把单一频率的能量涂抹到旁边的频率上形成拖尾这就是频谱泄漏。频谱泄漏的严重程度取决于截断位置是否恰好是信号周期的整数倍。如果你的采样时长恰好包含整数个周期的正弦波FFT谱线就是干净的但只要多截了半个周期谱线就会从一根针变成一座山旁边还有一大片旁瓣。我记得有次分析一个12.8kHz信号采样率是51.2kHz我取了1000个点做FFT结果谱线周围全是旁瓣主瓣宽得离谱。后来把采样点数改成1024并加了一个汉宁窗旁瓣立刻被压下去一大截主瓣也锐利了。因为1024点恰好包含更多个完整周期的12.8kHz信号。这个经验说明做频谱分析时选择FFT点数不是随便定的要考虑信号频率和采样率的整数关系必要时加窗函数来抑制泄漏。5.2 窗函数怎么选主瓣宽度和旁瓣抑制的取舍窗函数没有绝对的好只有适合不适合。常见的几个矩形窗主瓣最窄频率分辨能力最强但旁瓣电平最高约-13dB容易造成虚假频率。汉宁窗主瓣宽一点约1.44倍但旁瓣衰减到-31dB非常适合一般频谱分析。海明窗和汉宁窗类似但旁瓣抑制略好-43dB不过在更远的地方衰减速度不如汉宁。布莱克曼窗主瓣更宽旁瓣衰减最大-58dB适合需要极小旁瓣的场景比如测量弱信号旁的强信号。凯泽窗有可调参数β可以动态在分辨率与旁瓣抑制间折中。我的习惯是先不做精度对比时用汉宁窗需要判断两个频率很近的信号是否独立存在时用矩形窗需要把动态范围拉大比如看微弱谐波旁边是否有杂散时用布莱克曼或凯泽窗。选窗函数时不用背参数表打开软件看旁瓣高度心里有数就行。5.3 零填充的真相补零不能提高分辨率另一个常见的误解是做FFT之前把信号末尾补上一堆零频域采样点变多了是不是就能分辨出更细的频率答案是不能。零填充只改变了频域的插值密度——谱线变细密了看起来更平滑但两个真实频率成分能否被分开仍然取决于原始信号的有效长度或者说主瓣宽度。频率分辨率永远由原始时域长度决定。举个例子1kHz和1.02kHz两个正弦如果采样时长只有0.1秒分辨率是10Hz这两个频率只差20Hz理论上恰好不太能完全分开。此时补零到1024点谱线是细了但1kHz和1.02kHz的主瓣依然糊在一起看不出两个峰。要想真正区分它们必须采够足够长的时间让频率分辨率小于20Hz。这条经验我在实际测量中反复碰到过。很多人看到补零后频谱曲线变光滑以为精度提升了其实那只是插值出来的视觉效果。真正的物理分辨率没有变。理解和区分频域采样间隔和物理频率分辨率是看穿很多FFT误用的关键。6. 傅里叶变换的亲戚们拉普拉斯、Z变换和视觉傅里叶6.1 拉普拉斯变换、Z变换和傅里叶变换一个家族的三兄弟很多教材把傅里叶变换、拉普拉斯变换和Z变换分开讲导致大家以为它们是三个毫不相关的东西。实际上它们是同一套思想在不同使用场景下的变体很多学生在这里绕晕非常可惜。傅里叶变换是把信号分解到纯虚指数e^(-j2πft)上适合分析稳态频率成分对信号是否稳定不敏感。拉普拉斯变换是把信号分解到复指数e^(-st)上s是复数包含了实部和虚部——实部对应衰减/增长速率虚部对应振荡频率。这相当于在傅里叶的基础上扩展了一个衰减维度所以它天然适合分析系统的稳定性极点在左半平面系统就稳定在右半平面就发散。Z变换则是离散世界的拉普拉斯变换把s域映射到z域单位圆对应的就是傅里叶变换的离散版本。滤波器设计、控制系统分析几乎都离不开Z变换。放在一起记就清晰了傅里叶是只看稳态频率拉普拉斯是加上了瞬态衰减Z变换是拉普拉斯的离散版本。三兄弟各有分工但基因一模一样——都是把信号分解到正交/复杂基函数上用变换域里的系数来揭示时域里看不出的信息。6.2 视觉傅里叶变换图像的频率到底指什么视觉傅里叶变换最近讨论很热。很多做图像处理的人一开始接触的是空域卷积算子和边缘检测不知道图像和频率什么关系。其实图像的傅里叶变换非常好理解图像是二维信号横纵坐标是像素位置灰度值相当于信号幅度。二维傅里叶变换把图像分解为不同方向、不同频率的二维正弦条纹。低频对应图像大面积的平缓变化如墙壁、天空高频对应边缘、纹理、噪点。我试过用FFT对图像做高通滤波——把频域中心的低频区域置零再逆变换回来图像细节被保留大面积的明暗渐变只剩平均亮度。这就是图像锐化的另一种实现。反过来低通滤波就是把高频细节抹掉相当于模糊也能用于去噪。学过时域信号处理的人一旦意识到图像也是信号视觉傅里叶变换的概念就是水到渠成的。这个方向现在在图像压缩JPEG的DCT变换、图像去模糊、水印检测上都在大量使用。7. 常见误区与实战排查手册7.1 频域峰值和实际幅度的对应关系很多人对FFT出来的纵轴数值感到困惑为什么一个幅度为1V的正弦波FFT后峰值不是1这通常是因为没有区分单边谱和双边谱。FFT默认输出的是双边谱能量均匀分布在正负频率上所以正频率那根谱线的高度大约是原始幅度的一半约0.5V。如果你想要单边谱的幅度需要对正频率部分乘以2直流分量第0点除外。我每次手写频谱分析脚本时第一件事就是检查纵轴标定。这个细节在所有FFT工具里都一样搞错了后面所有定量分析都白搭。7.2 为什么频域谱线忽高忽低、噪声底不平频域谱线的随机起伏很多情况下不是信号本身的问题而是FFT点数太少、平均次数不够。在做噪声测量时单次FFT的频谱方差很大等于信号功率的平方要想平滑估计噪声底一个常用的做法是韦尔奇方法Welchs method把长信号切成多段重叠片段每段加窗做FFT然后对所有片段的功率谱做平均。平均次数越多噪声底越平滑。这一点在检查电源噪声、射频底噪时尤其重要。7.3 时域和频域结果对不上先检查相位对齐有次我做一个滤波器的仿真时域波形明显衰减了但频域幅度谱看不出异常。排查到最后才发现原来是滤波器在通带边缘引入了很大的相位偏移信号的时域波形被搅乱了但幅度谱基本没变。这说明一个重要的排查思想时域波形和频域幅度谱不是完全对应的幅度谱丢掉了相位维度。如果时域对不上先看相位谱、群延迟再看幅度谱。很多时候问题出在相位而非幅度上。这也是为什么做高速数字设计时工程师对相位线性度和群延迟畸变高度敏感。7.4 直接FFT之前别忘了这三个预处理根据我的实操经验任何正经的频谱分析做FFT之前都应该做三件事去直流计算信号的均值并减去。不然直流分量会在第0个频点产生巨大谱线干扰其他频点的观测尤其如果后面要加窗直流还会随窗函数泄漏到低频区。加窗根据目标选择窗函数抑制截断带来的频谱泄漏。检查采样率确认信号中没有高于fs/2的频率成分否则会混叠。这不仅是理论要求也是实操里最常见的数据质量问题。这三步看似简单但每次都能规避很多低级错误。养成这样的规范化流程之后基本不会再出现FFT结果怎么这么怪的情况。7.5 别忘了逆变换频域加工完要回到时域在工程里做滤波、均衡、压缩等处理时频域改完通常还得把信号逆变换回时域去使用。做IFFT时有一个细节很关键如果修改了频域数据的幅度谱却没有保证共轭对称性逆变换回到时域就会得到复数结果甚至波形严重变形。这通常因为你把正频率改了但负频率没跟着改。手写代码时我建议改频域时按对称索引统一操作避免这种隐性问题。8. 工具实操手把手写一个最简单的频谱分析脚本讲到这里还是得上点实操。用Python写一个最简单的FFT频谱分析流程代码很短但每一步都是前面理论的具体落地。我用的是numpy和matplotlib这是音频和信号处理领域最常用的组合。import numpy as np import matplotlib.pyplot as plt # 参数设置 fs 1000.0 # 采样率 1000 Hz T 1.0 # 采样时长 1 秒 N int(fs * T) # 采样点数 1000 t np.linspace(0.0, T, N, endpointFalse) # 构造测试信号50Hz 正弦 0.7V 120Hz 正弦 0.3V 少量噪声 f1, f2 50.0, 120.0 x 0.7 * np.sin(2.0 * np.pi * f1 * t) 0.3 * np.sin(2.0 * np.pi * f2 * t) x 0.05 * np.random.randn(N) # 预处理 x x - np.mean(x) # 去直流 win np.hanning(N) # 加汉宁窗 xw x * win # FFT X np.fft.fft(xw) freqs np.fft.fftfreq(N, 1.0/fs) # 单边谱幅度修正 half_N N // 2 mag np.abs(X[:half_N]) * 2.0 / N freqs_half freqs[:half_N] # 绘制 plt.figure(figsize(10, 4)) plt.plot(freqs_half, mag) plt.xlabel(频率 (Hz)) plt.ylabel(幅度 (V)) plt.title(频谱分析结果) plt.grid(True) plt.show()这段代码里有几个地方特意体现了前面聊到的原则。去直流对应7.4节说的预处理汉宁窗抑制频谱泄漏np.abs取幅度谱乘以2并除以N就是把双边谱修正为单边谱的幅度。注意这里除以N是与FFT的实现有关numpy的FFT没有归一化不同库可能略有差异但原理一致。跑完这段代码你应该能在50Hz和120Hz处看到两个明显的峰幅度分别接近0.7和0.3。如果少了去直流和加窗两步你可以试一下看看频谱底噪有多脏、峰旁边有多少旁瓣。动手对比的效果,比任何文字说明都直观。9. 时频分析当傅里叶变换不够用时怎么办傅里叶变换有一个前提假设信号是平稳的频率成分不随时间变化。但真实世界的信号很多是非平稳的——语音的发音随时间变化雷达回波的多普勒频率随目标运动变化机械振动的频谱随转速变化。面对这类信号单纯做一整个FFT得到的是整段时间的平均频谱丢失了频率在什么时候出现变化的信息。我在做音频的时域掩蔽效应分析时就对这个问题印象深刻。人耳听觉本身就对时间变化非常敏感一个持续50ms的声音和持续200ms的声音即使频率成分完全相同听感差异也很大。要捕捉这种时间维度上的频率变化需要短时傅里叶变换STFT。STFT的思路简单粗暴把长信号切成很多个小片段每个片段内近似认为平稳分别做FFT然后把一系列频谱按时间顺序排列得到一张时频图。横轴是时间纵轴是频率颜色深浅表示能量强度。这张图能同时展示频率成分随时间的变化是语音分析、音乐频谱图、机械故障诊断的标配工具。STFT里有两个参数决定了时频图的性状窗长和重叠率。窗长越短时间分辨率越高但频率分辨率越差窗长越长频率分辨率越好但时间分辨率越差。这就是著名的海森堡不确定原理在信号处理里的体现——不可能同时在时间和频率两个维度上获得任意高的分辨率。我的经验是窗长选2的整数次幂如256、512、1024个采样点重叠率选50%到75%具体数值取决于你关注的是时间细节还是频率细节。语音识别更看时间变化就选短窗分析音乐谐波结构更看频率精度就选长窗。10. 傅里叶变换学习路径建议从会用走向用活写了这么多最后给不同阶段的读者一条学习路径建议。如果你刚接触傅里叶变换被公式吓住了先别急着啃证明。我的建议是先动手把上面那段Python脚本跑起来改变频率、幅度、采样率观察频谱图怎么变化。有了直观感受之后再回头看书上那些公式你会发现它们不过是在描述你已经在屏幕上看到的东西。如果你已经会调FFT函数但总觉得自己对为什么这么做不够明白建议花时间研究三个方向一是窗函数的幅度谱和泄漏机理自己画一画不同窗函数的频响二是DFT与FFT的复杂度对比找一个相对大的N分别用直接乘法和FFT跑一遍感受一下时间差三是把拉普拉斯变换、Z变换和傅里叶变换放在一张图里对比搞清楚极零点和频率响应之间的关系。如果你已经比较熟练想进阶那就认真研究STFT、小波变换这些时频分析工具。它们不是要取代傅里叶变换而是在傅里叶变换的思路之上增加了时间定位能力。做非平稳信号分析时它们往往是正确的选择。我在实际项目中最大的体会是傅里叶变换不是一个需要你背熟公式的知识点而是一种看待信号的视角。时域和频域是同一个硬币的两面熟练地在两个视角之间切换比背下任何公式都重要。很多棘手的信号现象换一个域去看问题就自己解开了。这就像你在一个有双重身份的朋友面前不要只盯着他的一张脸另一张脸可能正好能解释你之前所有的困惑。
分享:

看完干货,该让你的企业上线了

免费需求沟通 · 48 小时内出具建站方案 · 河南本地可上门