资讯动态

MATLAB小波分析实战:时频分解、信号去噪与故障诊断

发布时间:2026/10/14 19:55:28 来源:尧图企业网站定制
简介面向信号处理与数据分析研究人员这份关于MATLAB小波分析的PDF资料系统讲解了小波分析相对傅里叶变换的优势并聚焦于非平稳信号的处理。内容以实际应用为主线覆盖小波基选择如db4、多尺度分解、近似与细节系数提取、阈值去噪、信号重构及信噪比评估并讨论了边界效应和分解层数选择等常见问题同时介绍了利用小波包分解自适应筛选特征频段、界定安全分解层数等进阶思路。资源体积小巧共1个PDF文件109KB方便快速查阅配套的大量MATLAB代码示例可直接运行验证适用于心电/脑电等生物医学信号去噪、机械设备振动特征提取等场景也可用于定位信号中的瞬态特征与周期成分。目前已吸引105人学习对希望将小波分析从理论落地到实际工程的研究者颇具参考价值。1. 小波分析把「什么时刻出现什么频率」一次说清楚一段振动信号里50 Hz 的分量在 0.3 秒突然出现、0.6 秒又消失傅里叶变换能告诉你频率成分却给不出出现和消失的时刻短时傅里叶试图补上时间维又被迫在时间分辨率与频率分辨率之间二选一。基于 MATLAB 的小波分析就是用一组可缩放、可平移的基函数把信号拆成不同尺度同时保留时频两维信息而 MATLAB 里的 wavedec、wrcoef、cwt 这几个函数把这些理论变成了几行能直接跑的命令。这篇文章写给两类人小波刚入门的学生以及做振动分析、故障诊断、信号去噪时总在傅里叶和小波之间纠结的工程师。读完你能判断自己的问题该用 CWT 还是 DWT能跑通分解–处理–重构的完整流程也知道哪些参数是玄学、哪些坑真的会翻车。2. 连续小波与离散小波时频分辨率的原理边界与选型小波变换的全部价值建立在「多分辨率」三个字上。一个冲击在 0.1 秒处发生它同时包含极宽的频带傅里叶变换会把这个冲击摊平到整个频谱上任何频点的幅值都被稀释小波变换则用短基函数去匹配这个局部事件高频部分的定位能力远比傅里叶好。理解这一点就不难接受为什么小波分析的代码就那么几行但选型却决定结果好坏。2.1 从短时傅里叶的死结到多分辨率分析短时傅里叶变换STFT把信号切成长度固定的窗每个窗内做傅里叶。窗宽一旦定下来整个时间轴都是同一把尺子窗越宽频率分辨率越高但一个窗内的多个瞬态事件被平均掉时间定位变差窗越窄时间定位好了频率分辨率又断崖式下跌。这个权衡不是工程取舍而是数学上由不确定性原理锁死的窗函数再精心设计也只是在中间找平衡点。小波的做法看起来很像加窗本质却不同它不固定窗长而是让窗跟着频率走。分析高频成分时用窄而短的基函数分析低频成分时用宽而长的基函数。这样在时频平面上高频段的格子窄而高时间定位准、频率定位粗低频段的格子宽而低频率定位准、时间定位粗。这种自适应分辨率就是「多分辨率分析」的含义也是小波在非平稳信号上优于傅里叶的根本原因。举例一个每秒 1000 次采样的传感器信号里若关心 0.5 秒处一次 2 ms 的冲击STFT 需要窗短到 2 ms 才能在时间轴上把它分离出来但此时频率分辨率只剩约 500 Hz任何 10 Hz 级别的频率差异都看不出来。用小波分解后这个冲击的能量集中在第一层细节系数的一个小邻域内位置几乎不扩散。2.2 CWT 与 DWT两个入口两种用法MATLAB 里最容易混淆的就是连续小波变换CWT和离散小波变换DWT。CWT 对尺度和平移做连续取值实际实现是密集离散化输出是二维的时频系数矩阵数据冗余大但适合直接画时频图、观察瞬时频率变化、追踪某个成分随时间漂移。DWT 是正交变换尺度和平移都按 2 的幂采样输出系数总量与原始信号相同信息无冗余适合做去噪、压缩、突变检测这类后续需要重构的处理。维度CWTDWTMATLAB 入口cwtwavedec / wpdec系数冗余高尺寸远大于信号无冗余总系数等于信号长度时频图直接出直观需要逐层重构拼图常用场景瞬态频率观察、时频特征分析去噪、压缩、突变检测、故障诊断计算量较大小适合长信号实际项目里我的习惯是先跑一次 cwt 看时频图确认关心成分分布在哪些频带、什么时候出现再用 DWT 做定量处理。CWT 承担侦察DWT 承担落地。另外提醒一句cwt 在不同 MATLAB 版本里的调用方式差异很大动手前先跑 doc cwt 确认当前版本的签名别拿老教程的代码直接粘。2.3 小波基四个常见族系的性格差异小波基的选择是项目里最像「选工具」的一步——没有绝对最优只有合不合适。MATLAB 里最常用的是这四个族haar即 db1最简单只有两阶计算最快但因为基函数本身是阶梯状对平滑信号会产生台阶伪影一般只用在突变检测和教学示例里。db 族正交、紧支撑、消失矩可调db4 和 db6 是工程中默认选择。消失矩越高对低频光滑分量的压制越干净高频细节定位越准代价是支撑长度变长、边界效应范围变大。sym 族和 db 族几乎同一构造基函数近似对称相位畸变更小处理语音、生物电信号这类对波形形态敏感的数据更稳。coif 族对称性和消失矩之间更平衡系数冗余略大用得相对少但某些特定频带分离问题上比 db 族表现好。属性haardb4sym4coif3消失矩1223对称性是否近似对称近似对称支撑长度27717典型场景突变定位默认去噪波形敏感信号频带分离表中的支撑长度表示小波在时间轴上的覆盖范围支撑越长边界附近受污染的系数越多。判断一个候选小波是否合适最快的方法是分别用 db4 和 sym4 跑同一段数据比较细节层中目标特征的幅值和位置是否稳定。两个结果都稳定的特征可信度远高于只在一个小波下出现的特征——这是避免「选基玄学」最实用的办法。还有一个需要破除的误区小波不是「代替傅里叶」。傅里叶给出的是全局频域视角适合看稳态成分和整体频谱结构小波给出的是局部时频视角适合看非平稳事件。两者搭配使用才是工程常态第 4 章会给出一个实际的搭配流程。3. 用 MATLAB 跑通小波分解与重构三个核心函数与参数设置DWT 在 MATLAB 里的最小闭环是三行代码wavedec 做分解wrcoef 从系数里单层还原waverec 把系数直接重组回信号。先跑通这个闭环再讨论去噪和特征提取。3.1 最小可运行代码wavedec 分解与 wrcoef 逐层还原拿一段仿真信号出发。fs 取 1000 Hz包含 50 Hz 正弦和一个 200 Hz 余弦叠加白噪声长度 1 秒。这样后续每一层系数的物理含义都对着频率讲得清。fs 1000; % 采样率 1000 Hz t 0:1/fs:1-1/fs; % 时间轴 x sin(2*pi*50*t) 0.5*cos(2*pi*200*t) 0.3*randn(size(t)); % 三层分解近似 A3 细节 D3、D2、D1 wname db4; % 小波基db4 level 3; % 分解层数 [c, l] wavedec(x, level, wname); % 逐层重构回时间域便于画图和定量分析 a3 wrcoef(a, c, l, wname, level); % 0 ~ 62.5 Hz d3 wrcoef(d, c, l, wname, 3); % 62.5 ~ 125 Hz d2 wrcoef(d, c, l, wname, 2); % 125 ~ 250 Hz d1 wrcoef(d, c, l, wname, 1); % 250 ~ 500 Hzwavedec 返回两个东西c 是系数向量把各层系数按从低频到高频的顺序首尾拼接成一维数组l 是长度数组记录每一块的长度。wrcoef 的作用是拿某一个块的系数其它块全部置零反变换回时间域这样每层信号长度与原始 x 一致可以直接 plot 对比。上面代码中dn 的频带范围由采样率决定第 n 层细节覆盖 [fs/2^(n1), fs/2^n] Hz。所以 fs1000 时d1 是 250~500 Hzd2 是 125~250 Hzd3 是 62.5~125 Hza3 是 0~62.5 Hz。50 Hz 的成分应该出现在 a3 里200 Hz 的成分主要在 d2 里d1 里基本是噪声。注意上面注释里的频带边界是按 fs1000 Hz 计算的。采样率改掉所有频带边界等比缩放。% 验证分解结果和频带对应关系一眼可见 subplot(4,1,1); plot(t, x); title(原始信号); subplot(4,1,2); plot(t, a3); title(A3: 0~62.5 Hz); subplot(4,1,3); plot(t, d2); title(D2: 125~250 Hz); subplot(4,1,4); plot(t, d1); title(D1: 250~500 Hz);如果分解正确A3 里能看到干净的 50 Hz 正弦噪声已被压掉一半多D2 里能看到 200 Hz 余弦加残余噪声D1 里几乎完全是噪声。这本身就是一种验证手段先造一个已知成分的信号确认每层系数与理论频带一致再去处理真实数据心里才有底。3.2 理解系数向量的存储结构先看懂 l 再动手wrcoef 隐藏了系数重组的细节但排查问题、手写阈值时还是要直面 c 和 l。l 的每一列代表一段系数的长度c 则按「最低频近似 → 从低到高的各层细节」顺序拼接。% 按 l 把 c 手动切回各层独立系数 cA3 c(1 : l(1)); % 第三层近似系数 cD3 c(l(1)1 : l(1)l(2)); % 第三层细节系数 cD2 c(l(1)l(2)1 : l(1)l(2)l(3)); % 第二层细节系数 cD1 c(l(1)l(2)l(3)1 : l(1)l(2)l(3)l(4)); % 第一层细节系数手动切片之后就能对某一层单独做处理置零、缩放、阈值然后用 waverec 重组。wrcoef 做的事情其实就是「单块保留、其余清零、再反变换」理解存储结构后阈值处理就变成纯粹的数组操作。l 的最后一个元素是原始信号长度。检查重构出错时先看这段索引有没有对错位。我见过不少翻车现场问题都出在 l 的偏移上写循环时少加了一个 l(1)导致所有系数错位一个块重构出来的波形形状对但幅值全乱。3.3 阈值去噪一行封装与手写软硬阈值MATLAB 提供了现成封装 wdenoise新版代码里最常见xden wdenoise(x, level, Wavelet, db4, ... DenoisingMethod, Bayes, ... ThresholdRule, Soft, ... NoiseEstimate, LevelDependent);wdenoise 把「分解 → 每层估计噪声 → 选阈值 → 阈值处理 → 重构」全包了。几个参数DenoisingMethod 两种主流策略Bayes贝叶斯阈值更自适应UniversalThreshold固定阈值更保守ThresholdRule 选 Soft 或 HardSoft 对系数整体收缩信号更平滑Hard 保留大幅值系数边缘更清晰但可能引入毛刺NoiseEstimate 选 LevelDependent 时按每层分别估计噪声处理有色噪声更好选 Independent 时假设白噪声。不方便用封装的时候手写阈值流程其实很短[c, l] wavedec(x, level, db4); thr wthrmngr(dw2ddenoLVL, c, l, Bayes); % 按层生成阈值数组 c_thr wthresh(c, s, thr); % 软阈值逐系数处理 xden waverec(c_thr, l, db4);wthrmngr 是按噪声水平为每一层生成阈值的函数返回的 thr 与 c 等长直接用 wthresh 对整个系数向量做软阈值即可。软阈值公式是系数绝对值小于阈值时置零大于时向零收缩阈值那么多硬阈值则把小于阈值的置零大于的保持不变。去噪场景中软阈值更常用因为它保证了重构信号的连续性代价是幅值略有压缩。我在实际项目里的习惯是先跑 wdenoise看结果再用等效手写流程复现观察每一层到底削掉了什么。这样既能快速出结果也不会把处理过程变成黑匣子。另外不同版本对 Method 的枚举名支持略有差异装好环境后先 doc wdenoise 确认一遍再批量跑数据。4. 在信号处理里用起来的三个方向去噪、突变定位与压缩wavedec 和 wrcoef 跑通之后小波的价值体现在处理策略上。下面三个方向覆盖了信号处理里最常见的诉求代码都可在上一章的仿真信号上直接跑。4.1 突变检测第一层细节系数的模极大值为什么可靠信号的突变点在数学上是奇异点奇异点在小波变换下表现为细节系数出现模极大值。层数越低对应高频带突变定位越准层数越高对应低频带突变体现越模糊但抗噪性越好。工程上常用第一层或第二层找位置用高层细节确认时间范围。% 构造带突变的测试信号一段平坦信号中间插入一个阶跃 x [zeros(1,400), 1.5*ones(1,200), zeros(1,400)]; x x 0.05*randn(size(x)); % 用 db2 做单层分解db2 对阶跃类突变定位更干净 [c, l] wavedec(x, 1, db2); d1 wrcoef(d, c, l, db2, 1); % 找模极大值阈值取 3 倍标准差最小间距 20 点 [pks, locs] findpeaks(abs(d1), MinPeakHeight, ... 3*std(d1), MinPeakDistance, 20); disp(locs);findpeaks 返回的 locs 就是突变发生的采样点位置。阈值取 3 倍标准差是一个经验起点噪声服从近似高斯分布时3 倍标准差外基本只剩真实事件。MinPeakDistance 用来排除同一突变在附近产生的多个局部峰值。findpeaks 在信号处理工具箱里没有这个工具箱时可以自己写一个局部最大值扫描逻辑不复杂。注意一个常见误用把阈值设成固定幅值。不同场景噪声水平差一个数量级固定幅值没有任何泛化能力。我用过最小二乘法做自适应阈值估计效果反而没有「3 倍标准差 肉眼复核」稳定——统计阈值在大多数工程信号上够用不必相信复杂的自适应算法。我在某次振动监测里处理过一段轴承信号轴承故障的冲击特征频率在 80~120 Hz 区间但信号里有一个 3 Hz 的转频分量和大量高频噪声。用 5 层 db4 分解后转频落在 a5噪声集中在 d1、d2目标冲击特征清晰地出现在 d4 和 d5。将 d4、d5 的系数做软阈值后重构在时域波形上能看到每个冲击的准确时刻。如果只用原始信号做包络谱冲击特征完全被转频谐波淹没。这类流程的核心只有两点频带对应关系和阈值策略其余都是两个函数来回调用。4.2 信号压缩保留大系数其余置零DWT 的正交性意味着能量集中在少数大系数上把大量小系数置零后重构可以保留绝大部分信息。这是小波压缩的基本盘也是 JPEG2000 的核心思路。% 用上一章的含噪信号压缩前先看能量集中程度 [c, l] wavedec(x, 4, db4); E_total sum(c.^2); [sorted_abs, idx] sort(abs(c), descend); keep_ratio 0.05; % 只保留 5% 的系数 keep_num round(length(c) * keep_ratio); c_thresh zeros(size(c)); c_thresh(idx(1:keep_num)) c(idx(1:keep_num)); E_keep sum(c_thresh.^2); x_comp waverec(c_thresh, l, db4); snr 10*log10(sum(x.^2) / sum((x-x_comp).^2));运行后会看到5% 的系数通常保留了 90% 以上的能量重构信噪比在 15~25 dB 之间具体数值取决于信号本身的平坦程度。信号里纯随机噪声比例越高需要保留的系数比例越大——压缩比和信噪比是一对直接矛盾。排序选大系数的写法有个好处阈值是自适应的不管信号强还是弱保留的都是相对突出的结构成分。对比按绝对阈值压缩的做法排序法在信号幅值波动时不需要重新调参。这是我在多个项目里用排序法而不是绝对阈值法的原因。4.3 与傅里叶配合先用小波做带限重构再做频谱分析小波处理完的信号经常还要用傅里叶看频谱里的具体峰值。一个干净的流程是先做 DWT丢弃明显是噪声的细节层用剩下的近似层和部分细节层重构再对新信号做 FFT峰值会明显干净。% 保留 a3 d3 d2丢弃 d1高频噪声带 c_new c; c_new(l(1)l(2)l(3)1 : end) 0; % d1 系数全部置零 x_filt waverec(c_new, l, db4); % 对比滤波前后的频谱 f (0:length(x_filt)-1) * fs / length(x_filt); X abs(fft(x_filt));这段代码的意图是把 250~500 Hz 的 d1 当作噪声带直接丢弃再重构得到限带信号。它的等价物是数字滤波器但小波的好处是每一层的频带边界是二进划分的处理多带混杂信号时一次分解就能把几个目标频带全部解开而不必挨个设计带通滤波器。实际项目中频谱泄漏很难完全避免边界处的旁瓣还会让弱峰值看不清。小波前置处理之后再做 FFT弱峰值的可辨识度通常能上一个台阶。这里的代价是频带边界固定做不到滤波器那种任意截止频率。对频带边界敏感的场景优先考虑小波包第 6 章。5. 小波分析避坑指南5 个高频踩坑点与排查思路小波分析在 MATLAB 里跑通很容易但结果「看起来不对」的时候大多数问题出在这 5 个地方。每一条都是被反复问过的真实问题按「现象 → 原因 → 解决」写清楚。5.1 重构信号两端出现大幅假跳变现象wrcoef 或 waverec 出来的信号两端几十个采样点出现明显畸变幅值比信号主体大几倍有时候直接冲出坐标轴。原因DWT 在分解时对边界做延拓默认延拓方式产生的边界系数不是数据真实规律重构时这些伪系数被放大成端点假跳变。信号越长、滤波器支撑越长污染范围越靠近端点。解决在处理前显式指定延拓模式或在处理后裁掉边界段。MATLAB 提供 dwtmode 用来设置全局延拓方式dwtmode(sym); % 对称延拓信号连续性好工程中最常用 % dwtmode(per); % 周期延拓要求信号长度是 2^level 的整数倍 % dwtmode(zpd); % 零填充边界会出现衰减到零的假象数据足够长时我习惯分解前先用 wextend 把两端各扩展几十个点处理完再裁掉这样边界效应彻底隔离在裁剪区间里不污染有效段。定位边界畸变时把重构信号和原始信号叠加画在同一张图里畸变呈包络衰减形状、集中在端点一眼就能认出来。5.2 分解层数凭感觉设置现象噪声滤不干净或者低频逼近层完全变成一条缓慢摆动的曲线原有节奏信息丢失调到别的层数结果忽好忽坏。原因层数过多时近似层包含的频率范围过窄信号主体低频成分被拆散到多个低频细节层层数过少时噪声和有效成分在最高层细节里仍然混在一起阈值无从下手。解决按采样率和目标最低频率估算层数。fs1000 Hz目标最低有效成分是 2 Hz则最高分解层数应满足 fs/2^(level1) ≈ 2即 level ≈ log2(fs/2/2) ≈ 8实际取 5~7 留裕量。另一个工程判据增加一层后新出现的细节层能量占比小于 1%再往上加就没有信息增益。level floor(log2(fs / f_low)); % f_low 是最低关注频率注意这个公式给的是上限实际取值要留 2~3 层余量因为逼近层还需要容纳最低关注频率附近的过渡带。层数细节频带 (fs1000)逼近频带1250~500 Hz0~250 Hz2125~250 Hz0~125 Hz362.5~125 Hz0~62.5 Hz431.25~62.5 Hz0~31.25 Hz515.625~31.25 Hz0~15.625 Hz提示先确认 f_low 定义的是有效信号的最低频率而不是噪声最低频率。把噪声的慢漂移当成有效成分来选层数结果一定会偏差。5.3 Haar 小波处理平滑信号出现台阶伪影现象用 haar 分解重构后的信号变成一堆方波段拼接原本连续变化的波形出现锯齿。原因haardb1的基函数是阶跃函数消失矩只有 1它无法用两段常量去逼近斜坡和曲线高频细节被强制量化成台阶。解决对连续信号不要用 haar。db4、db6 的消失矩更高对光滑成分的逼近能力强得多。反过来如果目标就是检测阶跃突变haar 反而比 db4 干净因为 db4 的振铃会在阶跃附近产生一串伪峰。选基之前先回答「信号里占主导的是平滑变化还是阶跃变化」。5.4 简单固定阈值把有效信号一起削掉现象去噪后信号变干净了但原本的冲击幅值明显变小或者周期瞬态成分消失重构后的信号「听话」但丢失特征。原因固定阈值比如全局 3 倍标准差在大幅瞬态出现的地方同时压掉了真实事件。小波去噪的隐含假设是噪声在每一层均匀分布但实际信号的非平稳段会让这一假设失效。解决改用分层阈值估计按每一层细节系数的噪声标准差单独计算阈值。MATLAB 里 wthrmngr 的 dw2ddenoLVL 就是按层估计手写时对每层分别取 std再乘一个随层数调整的系数通常 3~4。对冲击类信号还可以考虑只对噪声主导层做阈值保留特征层不动。thr wthrmngr(dw2ddenoLVL, c, l, Bayes);这是最省事且多数时候足够好的方案。判断阈值是否过狠有一个定量方法比较去噪前后各层细节能量的比值如果特征所在层的能量被削掉 50% 以上阈值就过头了需要降低系数或换成只处理噪声层的策略。5.5 分解时报错或结果错位信号长度与层数不匹配现象wavedec 在某些模式下运行报错或者重构出来的信号长度与原始信号不一致画图时时间轴对不上。原因DWT 每做一层会做 2 倍下采样信号长度在每层必须能被 2 整除。奇数长信号或某些延拓模式下长度不满足条件系数数组和长度数组 l 就对不上。解决分解前做长度规整。N length(x); N_new floor(N / 2^level) * 2^level; x x(1:N_new);截断是最直接的方式。代价是丢掉末尾不足一个分解块的数据对大多数工程信号来说这段数据量极小影响可以忽略。如果末尾数据不能丢就改用 wextend 补零到最近的 2^level 整数倍长度处理完再裁掉补零段。6. 从小波到小波包把频带细分再榨一层信息的进阶做法DWT 的频带划分是二进制的每层只细分低频半边高频细节不再往下拆。如果关心的特征同时落在 60~80 Hz 这样的窄带里DWT 的边界62.5 Hz恰好把它劈成两半结果是特征在两个相邻层里各出现一半哪个都不完整。小波包WPT解决的就是这个问题——它对每一层的高低频都继续分解频带划分变成任意可选的格子。6.1 小波包树用 wpdec 把一个频带单独拆出来wp wpdec(x, 3, db4); % 3 层小波包分解返回小波包树对象 % 查看第 3 层全部 8 个节点的能量分布 for k 0:7 coeffs wpcoef(wp, [3 k]); % 节点坐标 [层, 序号] E(k1) sum(coeffs.^2); end bar(0:7, E / sum(E));wpdec 返回的对象是一棵二叉树。节点编号 [3 k] 表示第 3 层第 k 个节点对应频带为 [k*fs/16, (k1)*fs/16]fs1000 时每个子带宽 62.5 Hz。wpcoef 取出该节点的系数能量也可以用 wenergy(wp) 直接拿或像上面这样逐节点累加平方。能量分布图能快速找出特征集中在哪个子带这是做频带筛选的第一刀。6.2 按子带自适应阈值不再「一刀切」小波包把频带细分之后可以按每个子带的噪声水平独立做阈值thr zeros(8, 1); for k 0:7 cnode wpcoef(wp, [3 k]); thr(k1) 3 * median(abs(cnode)) / 0.6745; % 鲁棒标准差估计 endmedian(|c|)/0.6745 是高斯噪声标准差的鲁棒估计比 std 更抗离群值。对每个子带用独立的鲁棒阈值做软阈值处理然后 wpdencmp 重构效果明显好于对整棵树的系数统一设阈值。这套做法在轴承振动、语音端点检测这类信噪比变化大的数据上差别非常直观。我在多个项目里的习惯是先用小波包能量分布做特征频带筛选再对筛选出的子带单独做阈值和重构。代价是计算量比 DWT 大但对短段信号完全可接受。最后说一句经验之谈小波分析调参时把每次的分解参数、阈值策略、重构信噪比记录下来换成新数据时先套旧参数再看偏差比每次都从零试要快得多。希望帮到你。本文还有配套的精品资源点击获取

读完文章,也想定制专属网站?

尧图设计师 24 小时内与您沟通定制方案

免费获取报价 →
↑