声明:对于作者的原创代码,禁止转售倒卖,违者必究!
本期文章思路来自振动测试与诊断期刊的一篇三高论文,点击链接可跳转。https://mp.weixin.qq.com/s/hmmDj5IwpaozeL4F0iI-2g
文章摘要如下:
针对风机滚动轴承微弱故障信号所具有的非线性和非平稳特征及易被强背景噪声掩盖的特点,提出了一种变分模态分解(variational modal decomposition,简称VMD)和最大相关峭度解卷积(maximum correlated kurtosis deconvolution,简称MCKD)相结合的滚动轴承微弱故障诊断方法。为实现VMD和MCKD的参数自适应选择,采用粒子群优化算法(particle swarm optimization,简称PSO),对两种算法中的参数进行优化。首先,利用PSO优化VMD算法中的α和K,再基于VMD对微弱故障信号分解后的结果,选取最优模态分量;其次,利用PSO优化MCKD算法中的L和T,再基于MCKD算法加强最优分量信号中的故障冲击成分;最后,通过包络谱提取出轴承微弱故障特征。仿真和试验均表明,此方法能够自适应增强轴承微弱故障中的冲击成分,有效提取出被强噪声淹没的轴承微弱故障特征。
之前小淘发过一篇文章:改进的麻雀算法优化最大相关峭度解卷积(SCSSA-MCKD),这篇文章采用的是模拟的仿真信号,而且当时没有像论文中一样,先对VMD进行优化。
本期文章将采用西储大学轴承数据外圈故障130.mat为例,对该论文的主要方法进行完美复现!先看代码目录:所有代码均为.m文件,不是那种加密的.p文件!
在介绍步骤流程之前,这里先对西储大学的数据进行一个知识补充。
选择130.mat这个数据进行分析处理一下:
计算出此时的理论故障特征频率约为:
可以看到130.mat的理论故障频率为107.3050Hz。接下来的所有工作就是要在噪声淹没130.mat数据的情况下,还要能识别出来这个故障频率。
接下来针对代码目录截图讲步骤:
第一步:轴承数据分析
第一步是对西储大学130.mat的分析,大家也可以对其他数据进行分析。由于要模拟轴承被噪声掩盖的微弱故障信号,因此要先对原始的130.mat数据添加高斯白噪声数据,论文的原文也是这么做的。
运行Signal_Analysis.m文件,可以得到与论文中图10(a),图10(b),图10(c)相同的三幅图。并且会保存一个加了高斯白噪声的signal.mat文件,后面第二步是要针对这个signal.mat文件去优化VMD参数的。
可以看到,添加了高斯噪声的轴承信号,时域波形中几乎观测不出任何冲击成分,而在频谱图中,也无规律可循。对信号进一步进行包络解调,也未发现突出频率成分。
第二步:采用粒子群算法优化VMD,包络谱峰值因子为适应度函数
采用粒子群算法优化VMD参数,并找到最佳IMF分量:将第一步得到的signal.mat复制到第二步的文件夹中,采用VMD方法对第一步得到的signal.mat信号分解,计算分解得到的各个IMF分量的包络谱峰值因子,包络谱峰值因子最大的IMF分量即为最佳IMF分量;
运行PSOmain.m,可以得到论文中图11(a),图11(b),和一个PSO寻优VMD最佳参数的曲线图。并会将最佳的IMF分量进行保存,得到best_imf.mat文件,后面第三步要对这个best_imf.mat文件进行操作。第二步的代码运行结果如下:
最后得到的最佳VMD参数结果为:
从最佳IMF分量的包络谱中观测出在108Hz有明显的突出谱线,其幅值较其他谱线都大,但因为其倍频不够明显突出,不能确定108Hz为轴承故障频率。为了避免错诊,应做进一步分析。
第三步:采用粒子群算法优化MCKD,包络谱峰值因子为适应度函数
采用粒子群算法对最大相关峭度解卷积(MCKD)的三个参数进行寻优,得到增强的IMF分量。原文献中只对MCKD的[L,T]两个参数进行了优化,作者在这里进行了改进,对[L,T,M]三个参数进行了优化,以确保找到最佳的MCKD参数。
将第二步得到的best_imf.mat复制到第三步的文件夹中,运行main.m文件,会得到论文中的图12(a),图12(b),和一个PSO优化MCKD的寻优曲线。
处理过程如下:
得到的最佳参数分别是[L,T,M] = [532,111,6];
可以看到,与优化前的IMF分量包络谱比较,得到了明显的增强。解卷积后的包络谱中故障特征频率fi 及其2-9倍频的谱线均清晰可见,表明特征频率被准确提取。均是130.mat理论故障频率的倍数。
能够认真看到这里的同学,作者在这里在稍稍提一句,也算是个水论文不错的方法,可以将此文中的VMD方法换成其他数据分解的方法,也可以将粒子群算法换个算法,还可以对MCKD也找一种替换方法,这论文不就凑出来了嘛哈!
部分代码分享
%%
clear
clc
close all
fobj=@mckdcost; %包络谱峰值因子
%% 选取数据
load best_imf.mat %注意这里替换为自己的数据即可,数据形式为n行*1列,列数必须为1。
data = best_imf;
%% 设置参数
lb = [100 85 1]; %mckd下限
ub = [1000 142 7]; %mckd上限
dim = 3; % 优化变量数目
Max_iter=30; % 最大迭代数目
SearchAgents_no=10; %种群规模
fs = 12000; %采样频率
%% 调用PSO函数
[fMin , bestX, Convergence_curve ] = PSO(SearchAgents_no,Max_iter,lb,ub,dim,fobj,data,fs);
%% 画适应度函数曲线图,并输出最佳参数
figure
plot(-Convergence_curve,'Color',[0.9 0.5 0.1],'Marker','>','LineStyle','--','linewidth',1);
title('Objective space')
xlabel('Iteration');
ylabel('Best score obtained so far');
legend('PSO优化MCKD')
display(['The best solution obtained by PSO is : ', num2str(fix(bestX))]); %输出最佳位置
display(['The best optimal value of the objective funciton found by PSO is : ', num2str(-fMin)]); %输出最佳适应度值
%% 将最佳的MCKD参数回带,求出结果
filterSize = fix(bestX(1));
termIter = 30;
T = fix(bestX(2));
M = fix(bestX(3));
plotMode = 0;
%--------------- Run actual mckd code:数据进行mckd分解---------------------------
[y_final,~,~] = mckd(data,filterSize,termIter,T,M,plotMode);
%% 绘制MCKD处理后的时域波形
fs=12000;%采样频率
Ts=1/fs;%采样周期
L=4000;%采样点数,稍微多点即可,不用全部取完
t=(0:L-1)*Ts;%时间序列
figure;
plot(t,y_final); %故障信号
ylabel('幅值','fontsize',12);
xlabel('t/s','fontsize',12);
xlim([0 t(end)])
title('MCKD处理后的时域波形')
set(gcf,'unit','centimeters','position',[10 16 15 5])
每个代码都有详细的注释,文中提到的所有图片均可运行出来!大家按照文中步骤一一运行即可。
05代码获取
完整代码获取,点击下方卡片后台回复关键词,不区分大小写:
tgdm829