去年在做一个旋转机械故障诊断项目时,我花了整整两周时间调试小波变换的参数。当时设备振动信号里混杂着轴承损伤特征频率,常规傅里叶变换根本捕捉不到瞬态冲击成分。这段经历让我深刻体会到,掌握小波分析工具对工程信号处理有多重要。
今天分享的这套MATLAB程序集,包含小波变换和小波包变换的完整实现,能帮你快速完成信号分解重构、特征频率提取以及频谱可视化。不同于教科书上的理论推导,我会重点演示如何用这些工具解决实际的工程信号分析问题。
MATLAB的Wavelet Toolbox提供了完整的离散小波变换(DWT)函数库。实际工程中最常用的是wavedec和waverec这对黄金组合:
matlab复制% 4层小波分解示例
[c, l] = wavedec(signal, 4, 'db4');
% 信号重构
recon_sig = waverec(c, l, 'db4');
选择小波基函数时,我习惯用db4(Daubechies 4阶小波)作为默认起点。它的时频局部化特性在多数机械振动信号中表现稳定。对于包含瞬态冲击的信号,可以尝试sym5小波,其不对称结构更适合捕捉突变特征。
重要提示:分解层数不是越多越好。通常采样点数N与层数L的关系应满足N ≥ 2^(L+1)。对于10kHz采样的信号,4-6层分解足够覆盖常见故障特征频段。
小波包变换(WPT)比常规DWT提供了更精细的频带划分。这个特性在齿轮箱复合故障诊断中特别有用:
matlab复制% 小波包树构建
wpt = wpdec(signal, 4, 'db4');
% 提取特定节点系数
node3 = wpcoef(wpt, [3 0]);
通过bestlevt函数可以自动确定最优分解树,但我更推荐手动选择节点——先画出完整的小波包树,再根据先验知识锁定特征频带对应的节点编号。
这是我调试过最稳定的频谱分析流程:
matlab复制% 常规频谱
[pxx,f] = pwelch(signal, hamming(1024), 512, 2048, fs);
% 包络谱
env_sig = abs(hilbert(wpcoef(wpt, [4 3])));
[env_pxx, env_f] = pwelch(env_sig, hamming(512), 256, 1024, fs);
对于滚动轴承故障诊断,一定要用包络谱分析。实测表明,对分解后的高频细节分量做包络解调,能显著提高故障特征频率的信噪比。
这个自定义函数帮我节省了大量人工读谱时间:
matlab复制function [peak_freq, peak_mag] = find_peaks(pxx, f, thresh)
[peaks, locs] = findpeaks(pxx, 'MinPeakHeight', thresh*max(pxx));
peak_freq = f(locs);
peak_mag = peaks;
end
阈值thresh建议设置在0.2-0.3之间,太敏感会引入噪声峰值,太保守会漏检弱特征。配合已知的故障特征频率计算公式,可以实现半自动化的故障诊断。
小波变换的边界失真问题在短时信号中尤为明显。我的解决方案是:
matlab复制ext_len = round(length(signal)/4);
ext_sig = [mean(signal(1:100))*ones(1,ext_len), signal];
[c,l] = wavedec(ext_sig, 5, 'db4', 'mode','sym');
recon = waverec(c,l,'db4');
recon = recon(ext_len+1:end);
根据香农定理,采样频率应至少是目标最高频率的2.56倍。对于轴承故障诊断:
实测发现,当信号长度是2的整数幂时,计算效率最高。建议采样时控制数据长度为1024、2048等标准值。
以某风机轴承振动信号为例(采样率12.8kHz,数据长度8192点):
matlab复制% 数据预处理
signal = detrend(raw_signal - mean(raw_signal));
signal = filter(fir1(100, 0.1), 1, signal);
% 小波包分解
wpt = wpdec(signal, 5, 'db4', 'shannon');
% 关键节点分析
node_coef = wpcoef(wpt, [5 12]);
env_sig = abs(hilbert(node_coef));
% 可视化
subplot(2,1,1);
plot(linspace(0,1,length(node_coef)), node_coef);
title('节点[5 12]小波包系数');
subplot(2,1,2);
[pxx,f] = pwelch(env_sig, hamming(512),256,1024,12800);
semilogy(f, pxx);
xlabel('频率 (Hz)');
title('包络谱');
这个流程成功提取出了轴承外圈故障特征频率(理论计算值127.6Hz),在包络谱中清晰可见128.3Hz的峰值,与理论值误差仅0.5%。