一、为什么用“数学显微镜”来给机器看病?
想象一下,你是一位经验丰富的设备医生,有一台大型风机在不停地运转。突然,它发出了和平时不太一样的“嗡嗡”声。你的耳朵能听出异常,但具体是轴承坏了,还是齿轮有裂纹,就很难精确判断了。这时,你就需要一台“数学显微镜”——小波分析。
传统的信号分析方法,比如傅里叶变换,就像一个音乐家只听出整首曲子用了哪些音调(频率),但不知道某个高音具体是在哪一秒出现的。这对于平稳的信号(比如持续的单音)很有效。但机械故障信号往往是突变的、瞬时的,比如一个短暂的撞击声,它只在某个瞬间出现。小波分析的神奇之处就在于,它既能看清信号的“全貌”(低频成分,代表整体振动趋势),又能用高倍率放大信号的“细节”(高频成分,代表瞬间的冲击),并且知道这些细节发生在什么时间。这就像给你的振动信号数据,做了一次精细的“时频联合体检”,故障特征自然就无所遁形了。而MATLAB,为我们提供了强大且易用的小波分析工具箱,让这项技术从理论走向了工程实战。
二、小波分析工具箱:你的诊断武器库
在MATLAB里进行小波分析,你不需要从零开始造轮子。Wavelet Toolbox(小波工具箱)已经为你准备好了全套“手术器械”。对于机械故障诊断,我们最常用的几把“手术刀”是:
- 连续小波变换:就像用不同倍率的放大镜,连续地扫描整个信号,生成一个时频图(也叫尺度图)。这张图上,颜色越亮的地方,表示该时刻、该频率成分的能量越强。一个微小的冲击故障,会在图上显示为一条垂直的亮线,非常直观。
- 离散小波变换与多分辨率分析:这把“手术刀”更擅长做分解和提炼。它可以把一个复杂的振动信号,像剥洋葱一样,一层层分解成不同频率范围的子信号(称为近似系数和细节系数)。通常,轴承、齿轮的故障冲击频率会隐藏在特定的高频细节层里。我们把“噪音”一层层剥离,故障特征就被“提纯”出来了。
- 小波包分析:这是离散小波变换的升级版,分解得更精细、更灵活。它不仅能分解低频部分,还能继续分解高频部分,确保任何频带里的故障特征都不会被遗漏,特别适合分析那些频率成分非常复杂的故障。
下面,让我们通过一个具体的例子,来看看如何用MATLAB小波分析,从一段模拟的轴承故障信号中,找到那个关键的“冲击”特征。
三、实战演练:从嘈杂信号中“揪出”轴承故障
假设我们采集到了一段风机轴承的振动加速度信号。轴承外圈有一个局部损伤,当滚珠滚过损伤点时,会产生一个周期性的冲击。但这个冲击被强烈的机器背景噪声和振动淹没了。我们的任务就是把它找出来。
技术栈:MATLAB (Wavelet Toolbox)
首先,我们模拟生成一段包含故障特征的信号。在实际工作中,这部分数据来自你的传感器。
% ========== 模拟轴承故障振动信号 ==========
clear; close all; clc;
% 1. 设置基本参数
fs = 10000; % 采样频率,10000 Hz,即每秒采1万个点
t = 0:1/fs:1; % 时间轴,总共1秒钟
N = length(t); % 信号总长度
% 2. 模拟故障特征:周期性冲击
f_fault = 100; % 故障特征频率,假设为100 Hz(每秒冲击100次)
impulse_train = zeros(size(t));
impulse_indices = 1:round(fs/f_fault):N; % 计算冲击发生的时间点索引
impulse_train(impulse_indices) = 1; % 在这些点上置为1,代表冲击
% 用一个衰减的正弦波来模拟一次冲击的波形
single_impulse = exp(-200*t) .* sin(2*pi*3000*t); % 3000Hz的衰减振荡
fault_signal = conv(impulse_train, single_impulse, 'same'); % 生成周期冲击故障信号
% 3. 模拟背景噪声和干扰
% 3.1 强力的低频旋转振动(比如转子不平衡)
low_freq_vib = 2 * sin(2*pi*30*t); % 30Hz的强振动
% 3.2 随机噪声(模拟电气噪声、环境干扰等)
random_noise = 0.5 * randn(size(t));
% 3.3 高频谐波干扰(可能来自其他齿轮)
harmonic_noise = 0.3 * sin(2*pi*500*t) + 0.2 * sin(2*pi*1500*t);
% 4. 合成最终观测到的信号
% 故障信号很微弱,被强大的噪声和振动淹没
raw_signal = 0.3 * fault_signal + low_freq_vib + harmonic_noise + random_noise;
% 5. 绘制原始信号,肉眼几乎看不出故障
figure('Position', [100, 100, 800, 400])
subplot(2,1,1)
plot(t, raw_signal, 'b-', 'LineWidth', 0.8);
xlabel('时间 (秒)'); ylabel('振幅');
title('原始观测信号 - 故障特征被完全淹没');
grid on;
运行上面的代码,你会看到第一条曲线,它看起来就是一段普通的、有些波动的振动信号,完全看不出哪里有规律的冲击。接下来,就是小波分析大显身手的时候了。
% ========== 使用连续小波变换进行诊断 ==========
% 6. 执行连续小波变换,生成时频图(尺度图)
% 这里我们选用‘cmor’复Morlet小波,它对瞬态特征非常敏感
freq_range = [100, 4000]; % 我们关心100Hz到4000Hz这个频段
scales = freq2scales(freq_range, 'cmor', fs); % 将频率范围转换为小波尺度
[cwt_coefs, frequencies] = cwt(raw_signal, scales, 'cmor', 1/fs); % 执行CWT
% 7. 绘制连续小波变换时频图
subplot(2,1,2)
imagesc(t, frequencies/1000, abs(cwt_coefs)); % 显示系数的绝对值(能量)
set(gca, 'YDir', 'normal'); % 将频率轴方向设置为正常(低频在下)
xlabel('时间 (秒)'); ylabel('频率 (kHz)');
title('连续小波变换时频图 - 故障冲击清晰可见');
colormap jet; colorbar; % 使用jet色彩并显示颜色条
ylim([freq_range(1)/1000, freq_range(2)/1000]); % 限制显示的频率范围
% 在时频图上标注预期的故障冲击时刻
hold on;
for idx = impulse_indices(impulse_indices < N)
plot(t(idx), f_fault/1000, 'wx', 'MarkerSize', 8, 'LineWidth', 1.5);
end
hold off;
legend('CWT能量', '理论故障时刻', 'Location', 'northeastoutside');
看第二张图!在时频图上,原本在时域信号中看不见的规律冲击,现在变成了一排排垂直向上的亮黄色“条纹”。这些条纹每隔大约0.01秒(对应100Hz)出现一次,并且主要能量集中在高频区域(比如2-3 kHz附近),这正是我们模拟的冲击衰减振荡频率。通过与标注的“理论故障时刻”对比,可以发现它们完美重合。至此,轴承外圈的周期性冲击故障就被明确诊断出来了。
四、更精细的解剖:离散小波变换去噪与特征提取
连续小波变换给了我们一个全局的、直观的视图。但有时我们需要将故障特征信号提取出来,做进一步分析(比如计算精确的频率)。这时,离散小波变换就派上用场了。它的核心思想是“滤波与降采样”,将信号分解到不同频带。
% ========== 使用离散小波变换进行多分辨率分析与去噪 ==========
% 8. 进行5层离散小波分解
% 选用‘db4’小波,它在振动信号处理中非常流行,具有较好的光滑性和紧支性
wavelet_name = 'db4';
decomposition_level = 5;
[c, l] = wavedec(raw_signal, decomposition_level, wavelet_name); % 分解
% 9. 提取各层细节系数和近似系数
% 细节系数(D1-D5)代表从高频到低频的不同频带成分
% 近似系数(A5)代表最低频的整体趋势
detail_coefs = cell(1, decomposition_level);
for i = 1:decomposition_level
detail_coefs{i} = detcoef(c, l, i); % 提取第i层细节
end
approx_coef = appcoef(c, l, wavelet_name, decomposition_level); % 提取第5层近似
% 10. 重构各层信号,观察哪个频带包含故障信息
reconstructed_details = cell(1, decomposition_level);
figure('Position', [100, 100, 800, 600])
for i = 1:decomposition_level
% 重构第i层细节信号
reconstructed_details{i} = wrcoef('d', c, l, wavelet_name, i);
% 绘制该层重构信号
subplot(decomposition_level+1, 1, i);
plot(reconstructed_details{i}, 'b-', 'LineWidth', 0.8);
ylabel(['D', num2str(i)]);
title(sprintf('第%d层细节重构信号 (高频到低频)', i));
grid on;
xlim([1, N]);
end
% 绘制近似信号(最低频趋势)
subplot(decomposition_level+1, 1, decomposition_level+1);
plot(approx_coef, 'r-', 'LineWidth', 1.2);
ylabel('A5');
title('第5层近似重构信号 (整体低频趋势)');
grid on;
xlim([1, length(approx_coef)]);
% 11. 重点观察包含故障冲击的层(通常是D1或D2)
% 根据采样率fs=10000Hz,D1层频带约为2500-5000Hz,包含我们的3000Hz冲击。
% 我们可以对D1层信号进行包络谱分析,进一步确认故障频率。
figure('Position', [100, 100, 800, 400])
subplot(1,2,1)
plot(reconstructed_details{1}, 'b-', 'LineWidth', 0.8);
xlabel('采样点'); ylabel('振幅');
title('D1层细节信号 (高频冲击成分)');
grid on;
% 计算包络谱(希尔伯特变换 + 傅里叶变换)
analytic_signal = hilbert(reconstructed_details{1}); % 希尔伯特变换得到解析信号
envelope = abs(analytic_signal); % 解析信号的模就是包络线
N_env = length(envelope);
f_env = (0:N_env-1)*(fs/N_env); % 包络谱频率轴
envelope_spectrum = abs(fft(envelope))/N_env*2; % 计算包络谱
subplot(1,2,2)
stem(f_env(1:N_env/2), envelope_spectrum(1:N_env/2), 'b', 'LineWidth', 1, 'Marker', 'none');
xlabel('频率 (Hz)'); ylabel('幅值');
title('D1层信号的包络谱');
grid on; xlim([0, 500]); % 重点关注0-500Hz
% 在包络谱上标注故障频率及其倍频
hold on;
for k = 1:5
stem(f_fault * k, 0.05, 'r^', 'LineWidth', 2, 'MarkerFaceColor', 'r');
end
hold off;
legend('包络谱', '故障频率(100Hz)及其倍频', 'Location', 'northeast');
通过离散小波分解,我们发现高频的D1层信号已经清晰地显示出了周期性的冲击脉冲,背景的低频振动和噪声被有效地过滤掉了。再对D1层信号做包络谱分析,在频谱图上可以清晰地看到100Hz的故障特征频率及其倍频(200Hz, 300Hz...),这是滚动轴承故障的典型谱图特征。至此,我们不仅“看到”了故障,还通过频谱分析定量地确认了它。
五、技术全貌:应用、优劣与避坑指南
应用场景: 小波分析在机械故障诊断中应用极其广泛。除了我们演示的滚动轴承故障,它还适用于:齿轮断齿、点蚀的诊断;转子碰摩、不对中、不平衡的分析;发动机燃烧状态监测;结构裂纹的早期检测等。任何与瞬态冲击、信号非平稳性相关的故障,都是小波分析的用武之地。
技术优点:
- 多分辨率:能够同时在时域和频域提供良好的局部化特性,非常适合分析突变信号。
- 灵活性:有大量的小波基函数(如Haar, Daubechies, Morlet等)可供选择,可以根据信号特征选择最合适的“放大镜”。
- 有效性:能有效分离强背景噪声下的微弱故障特征,信噪比提升效果显著。
技术缺点与注意事项:
- 小波基选择依赖经验:没有一种小波是万能的。选择不当可能导致特征模糊。通常需要根据信号特点和先验知识进行测试,
db系列和sym系列是振动分析中不错的起点。 - 边界效应:在对信号开头和结尾进行处理时,小波变换会产生失真。在实际应用中,常采用信号延拓(如对称延拓)来缓解,但需要留意。
- 计算量相对较大:尤其是连续小波变换,计算量和数据量、尺度数量成正比。对于超长实时信号,需要考虑计算效率,有时离散小波变换是更实用的选择。
- 结果解释需要专业知识:时频图上的特征需要与机械故障机理结合才能做出准确诊断。知道冲击频率与轴承几何尺寸、转速的关系至关重要。
总结: MATLAB小波分析工具箱,为我们提供了一套强大而直观的机械故障诊断“透视仪”。从全局扫描的连续小波变换,到精细解剖的离散小波分解,它让隐藏在复杂噪声中的故障特征无所遁形。掌握这项技术的关键在于理解其“时频局部化”的核心思想,并通过大量实践积累小波选择和参数设置的经验。当你的设备再次发出“不寻常的声响”时,不妨采集一段振动信号,用MATLAB的小波分析工具给它做一次深度“体检”,你可能会发现,数据早已揭示了问题的答案。记住,好的工具加上清晰的诊断思路,才是保障设备健康运行的关键。
评论