基于复Morlet小波变换的振动信号包络谱分析(MATLAB实战)
1. 复Morlet小波变换基础入门
第一次接触复Morlet小波变换时,我也被那些数学公式搞得头晕。但后来发现,把它想象成一个"智能放大镜"就简单多了。这个放大镜不仅能看清信号的局部特征,还能自动调节放大倍数(尺度)和观察位置(平移),特别适合分析非平稳信号。
复Morlet小波的核心是一个被高斯函数调制的复指数函数,数学表达式看起来复杂:
phi = exp(-t^2/2) * exp(1i*w0*t)但实际上可以拆解为两部分:exp(-t^2/2)是高斯包络,控制着时域窗口的大小;exp(1iw0t)是旋转的复指数,负责频率分析。我在调试轴承故障信号时发现,w0(中心频率)设为5-10效果最好,既能保证频率分辨率,又不会丢失时域细节。
尺度因子a的选择很有讲究:
- a>1时:相当于把镜头拉远,看到更低频成分
- a<1时:相当于显微镜放大,观察高频细节
- 一般建议从a=1开始尝试,根据信号特征调整
2. MATLAB实战:从振动信号到包络谱
去年分析齿轮箱故障时,我完整走通了这套流程。首先加载振动信号(假设采样率fs=10kHz):
load('bearing_vibration.mat'); t = (0:length(signal)-1)/fs;关键步骤分解:
- 小波参数配置
wavename = 'cmor3-3'; % 带宽3,中心频率3 scales = 1:128; % 经验值:覆盖50Hz-5kHz coefs = cwt(signal, scales, wavename);- 包络提取技巧
envelope = abs(coefs(30,:)); % 选取特定尺度 envelope_smooth = smoothdata(envelope, 'gaussian', 50);- 频谱分析
[pxx,f] = pwelch(envelope_smooth,[],[],[],fs); plot(f,10*log10(pxx)); xlabel('Frequency (Hz)');常见坑点:
- 带宽参数过小会导致包络出现伪振荡
- 尺度范围选择不当会漏检特征频率
- 直接使用原始小波系数会使包络太粗糙
3. 旋转机械故障诊断实战案例
最近处理的一个风机轴承案例很典型。原始振动信号时域上看不出明显异常,但经过复Morlet变换后:
故障特征提取流程:
- 先通过时频分析确定可疑频段
[cfs,frq] = cwt(signal,'amor',fs); contour(t,frq,abs(cfs))- 针对特征频段(约1200Hz)优化小波参数
wavename = 'cmor5-1'; % 窄带分析 scales = fc./(frq/fs); % fc=1Hz- 包络谱中清晰可见87Hz的故障特征频率(对应轴承外圈缺陷)
参数选择经验表:
| 故障类型 | 推荐带宽 | 尺度范围 | 注意要点 |
|---|---|---|---|
| 轴承外圈损伤 | 1-3 | 50-150 | 关注转频谐波 |
| 齿轮局部缺陷 | 3-5 | 20-80 | 检查啮合频率边带 |
| 转子不平衡 | 5-10 | 10-50 | 需结合相位分析 |
4. 高级技巧与性能优化
经过多次项目实践,我总结出几个提升分析效率的方法:
并行计算加速:
parpool('local',4); spmd segment = signal(1:end/4); coefs = cwt(segment,scales,wavename); end自动尺度选择算法:
[~,peakIdx] = findpeaks(fft(signal)); optimalScales = fc./(peakIdx/fs*2);可视化调试技巧:
figure('Position',[100,100,1200,400]) subplot(131); plot(t,signal); subplot(132); imagesc(t,scales,abs(coefs)); subplot(133); plot(f,pxx); linkaxes('x');有次处理齿轮箱信号时,发现常规参数效果不佳。后来改用多尺度联合分析:
coefs1 = cwt(signal, 1:50, 'cmor3-1'); coefs2 = cwt(signal, 50:100, 'cmor3-3'); envelope = max([abs(coefs1(30,:)); abs(coefs2(30,:))]);这种组合策略成功捕捉到了被噪声淹没的调制特征,后来成了我的标准操作流程之一。
