连续小波变换原理详解:从傅里叶死穴到Python时频图实操

发布时间:2026/9/21 2:35:49
连续小波变换原理详解:从傅里叶死穴到Python时频图实操 站在信号处理这个行当里摸爬滚打这些年我越来越觉得“连续小波变换CWT”是个被低估的工具。很多人一听“时频局部分析”就觉得高深其实它解决的是一个特别接地气的问题傅里叶变换能告诉你信号里有什么频率却说不清这些频率是什么时候出现的。而CWT就是把“频率随时间变化”这张图给画出来。这篇东西写给正在做故障诊断、生物电信号分析、地震勘探或者单纯被时频分析搞得头大的朋友我会从傅里叶的死穴讲起把CWT的原理、参数、代码和坑一次说清楚。1. 为什么傅里叶变换做不了“局部”分析1.1 傅里叶变换的本质把时间抹平掉的频谱傅里叶变换的核心思想是把一段信号分解成无穷多个正弦波的叠加。数学上长这样[ X(f) \int_{-\infty}^{\infty} x(t) e^{-j2\pi ft} dt ]这个公式干了一件很“暴力”的事它把时间变量 t 直接积分掉了。积分意味着什么意味着信号在每一个时刻的大小都被叠加到了同一个结果里。比如一段10秒的信号前9秒是50Hz的纯音最后1秒突然变成了200Hz的纯音。傅里叶变换看过去只会告诉你“哦这个信号里有50Hz和200Hz的成分”至于200Hz是出现在开头还是结尾它一概不知。我经常跟人打比方傅里叶变换像是把一整首交响乐搅拌成一份“食材清单”清单上写着“有小提琴、有鼓、有钢琴”但谁先响、谁后响、谁在哪一秒独奏完全看不出来。对于平稳信号这根本不是问题反正频率成分从头到尾都一个样。可现实世界的信号——语音、机械振动、心电、地震波——几乎没有一个是平稳的。轴承磨损初期的高频冲击只会在特定转角出现癫痫发作时的棘波也只是偶尔蹦出来。这些瞬态信息才是诊断的关键而傅里叶变换恰恰把它们“平均”没了。这就引出了时频分析的核心诉求我们既要频率信息又要时间信息而且还要知道“某个频率成分到底在什么时刻活跃”。1.2 短时傅里叶变换STFT和它的窗口困境傅里叶做不了局部那直接加个窗口不就行了这就是短时傅里叶变换STFT的思路用一个小窗口把信号切成一段一段对每一段分别做傅里叶变换然后把结果按时间顺序排成一幅“时间-频率”图。公式是[ STFT(t, f) \int_{-\infty}^{\infty} x(\tau) w(\tau - t) e^{-j2\pi f\tau} d\tau ]窗口 w 的宽度决定了时间分辨率和频率分辨率的平衡。窗口越短时间定位越准能看到瞬态发生在哪一刻但频率分辨率越差频谱被拉宽两个靠近的频率分不开窗口越长频率分辨得越清楚但时间上就模糊了短时间内发生的突变会被“摊”进整个窗口里。这个矛盾就是海森堡测不准原理在信号处理里的表现一旦窗口长度固定整个时频图上所有位置的频率分辨率都一样不管信号是低频还是高频。这种固定分辨率的做法非常不划算。现实问题里低频成分往往持续很长时间比如机器的转频需要频率精度高一点高频冲击往往只存在一瞬间比如轴承点蚀的脉冲需要时间精度高一点。STFT用一个固定窗口等于逼你在“看整体”和“看细节”之间二选一选完了还不能反悔。我当时第一次用STFT分析轴承振动信号时为了看那个高频脉冲窗函数选短了结果转频附近的两个谐波糊成了一个窗加长了脉冲时间点又对不准来回试了十几组窗口参数最后只能折中。这就是STFT的先天缺陷——窗口长度是死的。那有没有一种办法让窗口自己会伸缩看高频时自动变窄看低频时自动变宽有这就是连续小波变换。2. 连续小波变换的核心思路2.1 小波到底是什么有限长的波“小波”wavelet这个词本身就挺直白——“小的波”。傅里叶变换用的基函数是正弦波从负无穷延伸到正无穷永不衰减。小波不一样它是一个有限长度、平均值为零的波形能量集中在一小段区间内这段区间之外的振幅迅速衰减到零。这个“有限长”是革命性的。正弦波像一盏永不熄灭的灯照得整个房间都很亮却分不清光是从哪个方向来的小波像手电筒光束集中指哪打哪。用小波去做分解就能在“某个时间位置”上看到“某个频率成分”的活跃程度。常见的母小波有几种Morlet小波是一个复值小波形状是复正弦乘以高斯包络适合分析振荡型信号也是使用最广的墨西哥帽小波Ricker小波是高斯函数的二阶导数形状像一顶倒扣的帽子适合检测脉冲和突变Haar小波是个方波虽然简单但光滑性差时频图很难看。选哪种小波没有绝对标准要看信号形态信号里是持续振荡就用Morlet信号里是尖锐冲击就试试墨西哥帽这个选择直接决定时频图的质量后面我会详细讲。2.2 CWT的数学定义尺度与平移连续小波变换的公式是[ CWT_x(a, b) \frac{1}{\sqrt{|a|}} \int_{-\infty}^{\infty} x(t) \psi^*\left(\frac{t-b}{a}\right) dt ]这里的 \psi(t) 是母小波a 是尺度参数scaleb 是平移参数shift星号表示共轭。这个公式的直觉是把母小波 \psi(t) 在时间轴上挪到位置 b再拉伸或压缩成尺度 a然后和信号 x(t) 做内积。内积越大说明在这个位置、这个尺度下信号和小波的相似度越高。尺度参数 a 和频率是反向关系a 越大小波在时间上被拉得越宽频率越低a 越小小波被压得越窄频率越高。这正是“自适应窗口”的来由——当你在高频段扫查时小波的等效窗口自然就变窄了。这里有个关键点值得掰开揉碎CWT的小波是对同一个母小波做“缩放平移”得到的所以本质上它的多分辨率是“内嵌”在基函数里的。STFT的窗口长度固定频率分辨率和时间分辨率全局一致CWT的窗口自动随尺度变化低频段窗口宽、高频段窗口窄。这意味着同一幅时频图上低频端的频率精度高高频端的时间精度高——这正是现实信号分析最需要的分配方式。我第一次跑出CWT时频图时看到低频段几条谱线清楚分开、高频段脉冲位置精确对应真有那种“这玩意早该用上”的感慨。2.3 尺度参数到频率的换算用CWT最大的一个困惑就是我把尺度 a 从1取到128画出来的图横坐标是尺度不是频率怎么和实际故障特征频率对上这中间隔着一个换算公式。对于复数Morlet小波中心频率为 fc母小波本身的频率通常在0.8到1.5之间采样率为 fs尺度 a 对应的“伪频率”是[ f_a \frac{f_c \cdot f_s}{a} ]举个例子如果 fs 1000 HzMorlet的中心频率 fc 1那么尺度 a 100 对应的频率是 10 Hz尺度 a 10 对应的是 100 Hz。也就是说如果你关心的是 1 Hz 到 100 Hz 的低频范围尺度就要取 10 到 1000如果你关心的是 100 Hz 到 1000 Hz尺度就要取 1 到 10。换算逻辑想清楚之后选尺度范围就变成了一道简单的除法题先确定目标频率区间下限 f_min 和上限 f_max再反推尺度范围[ a_{max} \frac{f_c \cdot f_s}{f_{min}}, \quad a_{min} \frac{f_c \cdot f_s}{f_{max}} ]很多人懒得算这步直接用默认的尺度范围跑结果画出来的图频率轴根本对不上实际物理频率这是CWT入门最常见的翻车点。在这个问题上花两分钟算一下尺度范围能让后面省下几个小时的分析时间。3. CWT实操用Python把时频图跑出来3.1 环境准备和信号构造工欲善其事必先利其器。CWT在Python里有两条路一条是用 SciPy 的scipy.signal.cwt底层是自己传小波函数另一条是用 PyWaveletspywt库内置各种小波和连续小波变换的封装。我个人习惯用 pywt因为内置小波种类多且直接支持返回复数小波的结果比手写小波函数省事。先造一段测试信号。我建议用“chirp突变”组合一个频率线性扫频的chirp信号中间叠加一个短时高频脉冲。这种信号是检验时频分析算法最好的试金石——chirp能看出频率分辨率脉冲能看出时间分辨率。import numpy as np import matplotlib.pyplot as plt import pywt fs 1000.0 t np.linspace(0, 1, int(fs), endpointFalse) # 频率从10Hz线性扫到100Hz的chirp信号 f0, f1 10, 100 chirp np.sin(2 * np.pi * (f0 * t 0.5 * (f1 - f0) * t**2)) # 在0.5秒处叠加一个200Hz的短时脉冲 pulse np.zeros_like(t) idx_pulse int(0.5 * fs) pulse[idx_pulse:idx_pulse30] np.sin(2 * np.pi * 200 * np.arange(30) / fs) * np.hanning(30) signal chirp pulse这段信号的第一个成分是平滑扫频第二个成分是0.5秒处的一个极短振荡。拿它去跑STFT和CWT能非常直观地看出两种算法在一个固定窗口下有多尴尬而CWT又怎么避开这个坑。3.2 用pywt实现CWT的核心代码pywt的cwt函数用法很直接传入信号、尺度数组、小波名返回小波系数矩阵和对应的频率数组。scales np.arange(1, 128) coeffs, freqs pywt.cwt(signal, scales, cmor1.5-1.0, sampling_period1/fs) # 画时频图 plt.figure(figsize(10, 6)) plt.imshow(np.abs(coeffs), extent[0, 1, freqs[-1], freqs[0]], aspectauto, cmapjet) plt.colorbar(labelMagnitude) plt.ylabel(Frequency (Hz)) plt.xlabel(Time (s)) plt.title(CWT Scalogram) plt.ylim(0, 250) plt.show()cmor1.5-1.0这个字符串值得多说几句cmor代表复数Morlet小波1.5是带宽参数1.0是中心频率。pywt里小波命名的格式是“名字带宽-中心频率”带宽越大小波在频域的支撑越宽频率分辨率越高但时间分辨率变差中心频率就是前文公式里的 fc直接参与尺度到频率的换算。这里有个特别容易踩的坑pywt.cwt的返回值里freqs是按尺度从小到大排列的但小波系数的行顺序也是尺度从小到大。如果用extent参数画图freqs的顺序必须和矩阵行对齐。freqs[0]对应的是最小尺度也就是最高频率freqs[-1]对应最大尺度、最低频率。如果你照抄网上的代码却把extent写成[0, 1, freqs[0], freqs[-1]]图就会上下颠倒频率轴直接反了。我见过不止一个同事在这种细节上浪费了半天就为了查“为什么时频图和想象的不一样”。3.3 小波选择与参数调节经验小波类型和参数的选择我总结了几个原则基本能覆盖绝大多数分析场景先看信号形态。如果你分析的是振动、声音、脑电这类振荡信号首选复Morlet小波如果你分析的是冲击脉冲、雷击、地层反射这类瞬态信号墨西哥帽小波mexh往往更合适。复Morlet的好处是能同时给出幅值和相位信息做包络分析很方便墨西哥帽是实值小波只有幅值但对脉冲敏感定位更锐利。再看带宽参数。Morlet的带宽参数决定小波在频域里的宽度。带宽越大频率分辨率越高适合需要区分相邻频率分量的场景带宽越小时间分辨率越高适合定位突变时刻。经验上做机械故障诊断时带宽取1.5比较均衡做语音分析时可以试着调高到2.0以上但这个参数没有通用最优值必须结合信号特征反复试。最后记住一个原则时频图不是越“亮”越好。很多人看到结果里一片红色亮带就兴奋其实那往往是小波参数不匹配导致的能量扩散真正的特征应该是“清晰、局部、可解释的”。4. CWT与STFT的对比实验4.1 同一条信号、两种算法的效果对比拿上面那段chirp脉冲信号分别用STFT和CWT跑一遍差异非常明显。STFT选一个居中的窗口长度比如128个点跑出来的时频图里chirp谱线是中段的直线但在低频段和高频段两端都可能发糊而那个0.5秒处的脉冲在图上被拉成一个竖直的宽线时间上没法精确定位到0.5秒这个点。同样信号跑CWT尺度从1到128、Morlet小波chirp谱线从头到尾都清晰连续频率越高谱线越细脉冲则在时频图上变成一个尖锐的垂直短线时间位置正好卡在0.5秒处。这就是CWT的“自适应”带来的直接收益高频细节用高时间分辨率去看低频趋势用高频率分辨率去看不用人为选窗口。对比代码也很简单STFT可以用SciPy的signal.stftfrom scipy.signal import stft f_stft, t_stft, Zxx stft(signal, fs, nperseg128, windowhann, noverlap96) plt.pcolormesh(t_stft, f_stft, np.abs(Zxx), cmapjet, shadinggouraud) plt.ylim(0, 250) plt.colorbar(labelMagnitude) plt.title(STFT Spectrogram)把两张图放一起看STFT的固定窗口问题就暴露无遗了窗口长则脉冲糊窗口短则低频线糊。你没法让一个窗口同时照顾好两端但CWT天然就做到了。4.2 分辨率取舍的直观理解我常跟人解释时频分辨率的取舍本质上就是一个“亮度”问题。任何时频分析都不可能无限同时提高时间和频率精度这是信息论决定的规律。STFT的选择是“全局统一”整个时频平面上所有位置的分辨率都一样像一个固定焦距的镜头你只能选聚焦中景还是聚焦特写。CWT的选择是“按需分配”频率越低镜头焦距越长频率越高镜头焦距越短所有位置看起来都是清楚的。这种自适应特性对工程分析意义很大。举个例子诊断一台齿轮箱时转频大概在20Hz上下齿啮合频率可能在1000Hz上下两者之间隔了几十倍。用STFT去分析窗口得把20Hz的几级谐波分清楚窗口就必须很长结果高频冲击的时间精度就完蛋了反过来窗口短了20Hz附近的谱线糊成一团连轴频都数不清。CWT则完全没有这个烦恼低频区自动提高频率精度高频区自动提高时间精度一张图全搞定。当然CWT不是银弹。它算出来的时频图是冗余的相邻尺度之间高度相关直接拿去做定量绝对值的比较得小心谨慎。下一节我会专门聊这些坑。5. 常见问题与排查技巧实录5.1 边界效应时频图两端的“假信号”CWT最容易被忽略的问题是信号边界处的小波系数完全没有可信度。原因很容易理解小波在尺度较大时宽度很宽在信号开头处做内积时小波会超出信号范围超出部分没有数据可取算法只能用补零或某种延拓方式去凑。凑出来的结果反映的不是真实信号而是边界假象。这种效应在时频图上表现为左右两侧各有一块“锥形”区域尺度越大频率越低锥形越宽。我在一份实测数据里就栽过跟头一个低频成分在信号末尾本来已经消失了但时频图末端还亮着一大片一开始我还以为发现了新特征后来一查才发现是边界效应。识别和规避这个问题的办法不算复杂信号采集时尽量留出足够长的“前导”和“尾巴”不要从信号开始就急着分析分析时把时频图两侧各截掉一部分宽度参考最大尺度的小波有效支撑长度如果主要关心高频瞬态边界影响通常不大因为高频对应的小波尺度小宽度窄边界效应范围有限高频成分在信号开头或结尾出现时结果只作定性参考别用边界区域的幅值去做定量判断。5.2 小波系数不是“功率”别直接拿它和FFT幅值比另一个常见的误区是把CWT的小波系数振幅直接当成和FFT幅值类似的东西去比较。CWT是冗余变换系数的大小受小波归一化方式、尺度密度、小波类型影响极大不同尺度之间、不同小波之间的数值没有直接可比性。如果你需要从时频图里提取定量指标比如某个频带的总能量、某个故障特征频率的幅值趋势建议先做一次“标定”用一段已知幅值、已知频率的纯正弦信号跑到CWT里找到对应尺度位置的最大系数反推一个缩放因子。后续分析用这个因子去换算结果才靠谱。我实验室每次换小波参数都会先拿正弦标准信号重新标定一遍这条路走过一次之后能少掉很多数据解释上的麻烦。5.3 参数调整速查我把CWT的参数调试经验整理成一个速查表方便遇到问题直接对照现象可能原因处理方向时频图整片发糊看不到清晰谱线尺度间隔太粗增加尺度数量或改用对数尺度分布高频细节看不清Morlet中心频率过高、带宽偏小降低中心频率或增大带宽参数低频谱线被切断、不连续尺度范围不够大按 f_min 反推增大最大尺度时频图上下颠倒extent参数顺序错确认freqs首尾顺序低频在前则frequency轴从高到低图两侧出现竖向亮带边界效应截掉两侧锥形区域再分析脉冲定位到了但频率对不上尺度-频率换算用了默认fc用实际使用的Morlet中心频率重算频率轴复小波画出的图振幅忽高忽低未取模或未取绝对值画图时对系数取 np.abs()这些参数里最核心的还是“尺度范围”和“小波中心频率”这两个。尺度范围决定你看到的频率范围中心频率决定尺度与频率的映射关系。先算清楚这两项再谈细调带宽和尺度数量基本就是CWT调参的标准路径。5.4 尺度分布均匀取还是对数取pywt的cwt函数默认接受一个尺度数组很多人习惯用np.arange(1, N)均匀取这在尺度跨度不大时够用。但如果你要分析的频率范围很宽比如10Hz到1000Hz跨两个数量级均匀尺度分布会让低频段相邻尺度对应的频率差很小冗余度过高高频段相邻尺度对应的频率差很大可能漏掉特征。更优的做法是采用对数分布让每个尺度对应频率间隔在相对意义上均匀scales np.logspace(np.log10(2), np.log10(256), 128)这样低频段尺度密集取值高频段自然变疏配合CWT自身的多分辨率特性时频图在超大频率跨度下看起来更均衡。我处理地震波数据时频率跨度经常超过三个数量级对数分布基本是必须的。5.5 关于“傅里叶作画”的一个小旁注最近“傅里叶作画”在网上挺火很多人拿傅里叶变换做图像处理、做艺术效果。这从一个侧面说明频域思维远不只是“算频谱”那么简单它和时频分析、图像滤波、压缩编码是同一套哲学的不同应用。CWT在图像里也有对应物比如二维小波变换常用于图像去噪和边缘检测。如果你被“傅里叶作画”勾起了对频域变换的兴趣那CWT绝对值得纳入你的武器库——它比单纯傅里叶变换多了一个“局部”维度而“局部”恰恰是信息最丰富的地方。最后再分享一个我自己的操作习惯。每次拿到一段新信号我不是直接跑CWT而是先看原始波形和FFT频谱确定目标频段的大致范围然后反推尺度区间再跑CWT。跑完第一版时频图先检查两侧边界和整体背景噪声确认没有大面积假亮带后才会去抠具体的故障特征。CWT给了我们一张很“聪明”的放大镜但放大镜本身不会告诉你该看哪里——知道自己想看什么永远比工具本身更重要。

关于本文作者

来自尧图内容编辑团队

尧图内容编辑团队 内容团队

尧图内容编辑团队

本文由尧图网络内容编辑团队执笔。团队由资深项目经理、前端工程师与设计师组成,所有内容均来自亲手交付的真实项目,先讲清问题、再给出可落地的解法。尧图深耕北京网站建设十年,服务过京华建材集团、智造科技等各行业客户,把一线经验沉淀为可复用的行业观察。

  • 十年建站经验,覆盖建材、制造、服务、文创等
  • 项目经理把关选题与事实准确性
  • 工程师与设计师联合撰写专业细节
  • 统一编辑规范,保证文风与排版一致
  • 每月复盘转化数据,迭代选题方向

延伸阅读

相关资讯与近期热门内容

深度阅读推荐

建站决策前值得细读的三篇

网站改版的5个关键决策
2024-08-12

网站改版的5个关键决策

什么时候该改版、改到什么程度、如何避免流量掉光,京华建材集团改版复盘给出答案。

获取专属建站方案

看完文章,把您的行业与预算告诉我们,免费获取一份量身定制的官网建设方案与报价。

立即免费咨询