振动信号分析是机械故障诊断和生物医学工程中的核心环节。传统方法如希尔伯特变换在提取信号包络时,常因噪声干扰或非平稳特性导致结果失真。复Morlet小波变换凭借其优异的时频局部化能力,成为解决这一痛点的利器。本文将带您深入理解其原理,并手把手演示如何用MATLAB五步完成高质量包络提取。
在轴承故障诊断中,我们常遇到调制现象——高频载波信号被低频故障特征调制。提取这个低频包络就能定位故障频率。希尔伯特变换通过构造解析信号来获取包络,但它存在三个致命缺陷:
案例:某风电齿轮箱振动分析中,希尔伯特变换提取的包络在故障频率处出现明显波动,而实际检测发现是相邻部件的干扰所致。
复Morlet小波变换通过以下机制克服这些局限:
复Morlet小波的数学表达式为:
matlab复制% MATLAB中的复Morlet小波函数示例
function psi = cmorlet(t, fc, fb)
psi = (pi*fb)^(-0.5) * exp(2i*pi*fc*t) .* exp(-t.^2/fb);
end
其中关键参数:
fc:中心频率(Hz),决定小波振荡频率fb:带宽参数,控制高斯窗的宽度| 参数 | 物理意义 | 选择依据 | 典型取值 |
|---|---|---|---|
| fc | 小波主频 | 接近信号特征频率 | 0.5-5Hz(轴承故障) |
| fb | 频率分辨率 | 值越大频带越宽 | 1-10(平衡时频分辨率) |
实际工程中,建议通过以下步骤确定参数:
matlab复制% 加载示例数据(轴承外圈故障)
load('bearing_vibration.mat');
fs = 12000; % 采样频率(Hz)
t = (0:length(signal)-1)/fs;
% 带通滤波预处理
[b,a] = butter(4, [500 3000]/(fs/2));
filtered_signal = filtfilt(b, a, signal);
matlab复制% 自动估算中心频率
[pxx,f] = pwelch(filtered_signal,[],[],[],fs);
[~,idx] = max(pxx);
fc_auto = f(idx);
% 设置小波参数
fb = 2; % 经验值
scales = fc_auto*fs./(1:0.5:100); % 自动尺度序列
matlab复制% 执行连续小波变换
[cwt_coeffs, ~] = cwt(filtered_signal, scales, 'amor');
% 提取模值作为包络
envelope = abs(cwt_coeffs);
% 选择最优尺度层
[~, optimal_scale_idx] = max(mean(envelope,2));
final_envelope = envelope(optimal_scale_idx, :);
matlab复制% 平滑处理
window_size = round(0.02*fs); % 20ms窗口
smoothed_env = movmean(final_envelope, window_size);
% 重采样到均匀时间轴
t_env = linspace(0, length(signal)/fs, length(smoothed_env));
matlab复制figure('Position', [100 100 800 600])
subplot(3,1,1)
plot(t, filtered_signal)
title('滤波后振动信号')
subplot(3,1,2)
imagesc(t, 1:size(envelope,1), envelope)
ylabel('尺度层级')
title('小波变换时频图')
subplot(3,1,3)
plot(t_env, smoothed_env, 'r', 'LineWidth',1.5)
xlabel('时间(s)')
title('提取的包络信号')
当信号中存在多个调制源时,可采用分层提取策略:
matlab复制% 小波包分解示例
wp = wpdec(filtered_signal, 3, 'db4');
for i=1:7
band = wprcoef(wp, [3,i-1]);
% 对各频带执行包络提取...
end
开发了一套基于遗传算法的参数自动优化方案:
matlab复制% 适应度函数定义
function fitness = env_fitness(params)
fc = params(1); fb = params(2);
scales = fc*fs./(1:0.2:50);
coeffs = abs(cwt(signal, scales, 'amor'));
% 计算包络的峭度作为适应度指标
fitness = kurtosis(mean(coeffs,1));
end
% 调用优化器
options = optimoptions('ga', 'PopulationSize', 20);
[opt_params, ~] = ga(@env_fitness, 2, [], [], [], [], [0.5 0.5], [10 10], [], options);
问题1:强背景噪声下包络失真
问题2:变转速工况分析
问题3:微弱故障特征提取
为验证方法有效性,在某汽轮机轴承实验台上获取了不同故障状态的振动数据:
| 方法 | 故障检出率 | 计算时间(s) | 噪声鲁棒性 |
|---|---|---|---|
| 希尔伯特变换 | 72% | 0.05 | 差 |
| 复Morlet小波 | 93% | 0.8 | 优 |
| 小波包分解 | 88% | 1.5 | 良 |
实测发现,当信噪比低于10dB时,传统方法已无法识别故障频率,而小波方法仍能保持85%以上的检出率。在MATLAB 2022b环境下,单通道1秒数据的完整分析流程可在1秒内完成,满足实时监测需求。