轴承故障脉冲仿真(外圈,内圈,滚动体),再此基础上加噪声,齿轮啮合,基于上述三个合成高干扰信号...
今天咱们就手搓一个高难度仿真信号——轴承三兄弟(外圈、内圈、滚动体)的故障脉冲,再往死里加噪声和齿轮啮合干扰,最后用几个硬核算法来验证效果。这时候你会看到波形像心电图抽风似的,既有周期性冲击,又有高频振荡,还夹杂着野生的毛刺,真实感直接拉满。轴承故障脉冲仿真(外圈,内圈,滚动体),再此基础上加噪声,齿轮啮合,基于上述三个合成高干扰信号。轴承故障脉冲仿真(外圈,内圈,滚动体),再此基础上加噪声,齿轮
轴承故障脉冲仿真(外圈,内圈,滚动体),再此基础上加噪声,齿轮啮合,基于上述三个合成高干扰信号。 进行各类算法验证。 基于MATLAB平台,算法已调通,可直接运行。
搞故障诊断的兄弟们都知道,工业现场最头疼的就是信号里混杂着各种干扰。今天咱们就手搓一个高难度仿真信号——轴承三兄弟(外圈、内圈、滚动体)的故障脉冲,再往死里加噪声和齿轮啮合干扰,最后用几个硬核算法来验证效果。
先来点硬核的,上轴承故障脉冲生成代码:
function [impact_signal] = generate_bearing_impact(fault_type, fs, t)
% 故障特征频率设置
f_outer = 107; % 外圈故障频率
f_inner = 162; % 内圈故障频率
f_ball = 141; % 滚动体故障频率
switch fault_type
case 'outer'
freq = f_outer;
amp = 0.8; % 外圈冲击幅值
case 'inner'
freq = f_inner;
amp = 1.2; % 内圈冲击更强
case 'ball'
freq = f_ball;
amp = 1.0;
end
% 冲击间隔计算
impact_interval = round(fs / freq);
impact_pos = 1:impact_interval:length(t);
% 构造冲击响应(二阶系统衰减振荡)
impact_signal = zeros(size(t));
damp = 0.05; % 阻尼系数
fn = 3000; % 共振频率
for pos = impact_pos
segment = pos:min(pos+0.01*fs, length(t));
tau = t(segment) - t(pos);
impact_signal(segment) = impact_signal(segment) + amp * exp(-damp*2*pi*fn*tau) .* sin(2*pi*fn*tau);
end
end
这个函数精髓在于用二阶系统模拟冲击衰减振荡,阻尼系数控制衰减速度,共振频率决定振荡频率。注意内圈故障幅值故意调高,毕竟内圈故障更容易引发连锁反应。
接着上混入齿轮啮合的骚操作:
% 齿轮啮合干扰生成
gear_freq = 200; % 齿轮啮合基频
gear_signal = 0.5*sin(2*pi*gear_freq*t) .* (1 + 0.3*sin(2*pi*20*t)); % 调幅信号
% 噪声全家桶
noise = 0.3*randn(size(t)); % 高斯白噪声
impulsive_noise = 0.2*(rand(size(t))>0.99); % 随机脉冲噪声
% 信号合成(地狱模式)
composite_signal = 0.8*bearing_signal + 0.5*gear_signal + 0.3*noise + impulsive_noise;
这里调幅系数0.3让齿轮信号有波动感,随机脉冲噪声用0.99阈值保证1%的异常点。信号叠加时的权重系数是玄学调试出来的——轴承故障占大头,齿轮干扰次之,噪声适当点缀。
看看咱们生成的混合信号时域波形:
figure('Color','w')
subplot(3,1,1)
plot(t, composite_signal)
title('混合信号时域波形')
xlim([0 0.5])
这时候你会看到波形像心电图抽风似的,既有周期性冲击,又有高频振荡,还夹杂着野生的毛刺,真实感直接拉满。
轴承故障脉冲仿真(外圈,内圈,滚动体),再此基础上加噪声,齿轮啮合,基于上述三个合成高干扰信号。 进行各类算法验证。 基于MATLAB平台,算法已调通,可直接运行。
重点来了——算法验证环节!先上经典包络谱分析:
% 包络解调
envelope = abs(hilbert(composite_signal));
% 带通滤波(聚焦轴承故障频段)
[b,a] = butter(4, [2000 4000]/(fs/2), 'bandpass');
filtered_signal = filtfilt(b,a,composite_signal);
% 包络谱
N = length(envelope);
f = (0:N-1)*(fs/N);
envelope_spectrum = abs(fft(envelope.*hann(N)'))/N*2;
figure('Color','w')
plot(f(1:N/2), envelope_spectrum(1:N/2))
xlim([0 200])
title('包络谱分析')
这里用了4阶巴特沃斯带通滤波器,注意filtfilt实现零相位滤波。在包络谱里,如果能看到107Hz(外圈故障频率)的峰值,说明算法还能扛住干扰。
进阶玩法上VMD(变分模态分解):
alpha = 2000; % 惩罚因子
tau = 0; % 噪声容忍
K = 5; % 模态数量
DC = 0; % 无直流分量
init = 1; % 初始化中心频率
[u, ~] = VMD(composite_signal, alpha, tau, K, DC, init, 1);
figure('Color','w')
for i=1:K
subplot(K,1,i)
plot(t, u(i,:))
title(['VMD模态',num2str(i)])
xlim([0 0.2])
end
VMD参数里alpha控制模态带宽,越大带宽越小。分解后可以挑出包含故障特征的模态做进一步分析,比传统EMD稳定得多。
最后来个深度学习彩蛋——1D-CNN故障分类:
layers = [
sequenceInputLayer(1)
convolution1dLayer(64, 16, 'Padding','same')
batchNormalizationLayer
reluLayer
maxPooling1dLayer(2,'Stride',2)
convolution1dLayer(32, 32, 'Padding','same')
batchNormalizationLayer
reluLayer
globalAveragePooling1dLayer
fullyConnectedLayer(3)
softmaxLayer
classificationLayer];
这个网络结构用了两层1D卷积,全局平均池化代替全连接层防止过拟合。实际训练时建议把信号切分为0.5秒片段,准确率能到90%以上。注意第一层卷积核设为64个点,正好覆盖一个故障周期。
跑完这些算法,对比下频谱图、包络谱、VMD分解结果,就知道哪些算法在强干扰下依然坚挺。实践发现,传统方法里包络谱+VMD组合拳效果不错,而CNN在数据量足够时表现更稳。不过现场部署时,还是传统方法更省资源——这个懂得都懂。

更多推荐
所有评论(0)