做多了基于机器学习和深度学习的机械故障诊断,感觉实在没意思,换个口味,写一下基于现代信号处理的轴承状态监测和故障诊断。本文主要讲解如何从滚动轴承的振动信号中提取特征、进行状态监测和故障诊断。
完整代码链接如下,面包多第三方下载:
首先加载振动信号,该振动信号是由滚动轴承外圈单点缺陷生成的,包含轴承不同运行工况的轴承多段振动信号(缺陷深度从 3um 逐渐增加到 3mm 以上),采样频率为 20 kHz。
导入数据
load data.mat
定义要处理的数据点的数量
numSamples = length(data);
定义采样频率
fs = 20E3; % 单位: Hz
绘制缺陷深度随时间的变化

绘制轴承健康数据和故障数据
time = linspace(0,1,fs)';
轴承健康信号
subplot(2,1,1);
plot(time,data{1});
xlabel('Time(s)');
ylabel('Acceleration(m/s^2)');
legend('Healthy bearing signal');
故障轴承信号
subplot(2,1,2);
plot(time,data{end});
xlabel('Time(s)');
ylabel('Acceleration(m/s^2)');
legend('Faulty bearing signal');

特征提取
从每个数据段中提取代表性特征用于轴承状态监测与故障诊断。 状态监测=的典型特征包括时域特征(均方根、峰值、信号峰度等)或频域特征(峰值频率、平均频率等)。在时域或频域或时-频域中可视化信号有助于发现退化或故障的信号模式。首先计算健康轴承数据的频谱图, 使用 500 个数据点的窗口大小和 90% 的重叠率(相当于 450 个数据点), FFT 的点数设置为 512,fs 表示之前定义的采样频率。
[~,fvec,tvec,P0] = spectrogram(data{1},500,450,512,fs);
fvec 是频率向量,tvec 是时间向量。然后绘制健康轴承信号的时频谱图
clf;
imagesc(tvec,fvec,P0)
xlabel('Time(s)');
ylabel('Frequency(Hz)');
title('Healthy Bearing Signal Spectrogram');
axis xy

绘制轴承故障振动信号的时频谱图,可以看到信号能量集中在更高的频率。
[~,fvec,tvec,Pfinal] = spectrogram(data{end},500,450,512,fs);
imagesc(tvec,fvec,Pfinal)
xlabel('Time(s)');
ylabel('Frequency(Hz)');
title('Faulty Bearing Signal Spectrogram');
axis xy

由于健康轴承和故障轴承信号的时频谱图不同,因此可以从频谱图中提取代表性特征并用于状态监测和故障诊断。 在本例中,从时频谱图中提取平均峰值频率作为健康指标。 平均峰值频率即峰值频率的平均值。


计算健康轴承信号的平均峰值频率
[~,I0] = max(P0); % 找出峰值频率的位置
meanPeakFreq0 = mean(fvec(I0)) % 计算平均峰值频率
meanPeakFreq0 = 666.4602
健康轴承振动信号的平均峰值频率约为 650 Hz,计算故障轴承信号的平均峰值频率。 平均峰值频率移至 2500 Hz 以上。
[~,Ifinal] = max(Pfinal);
meanPeakFreqFinal = mean(fvec(Ifinal))
meanPeakFreqFinal = 2.8068e+03
检查中间阶段的数据,此时缺陷深度不是很大,但已经开始影响振动信号
[~,fvec,tvec,Pmiddle] = spectrogram(data{end/2},500,450,512,fs);
imagesc(tvec,fvec,Pmiddle)
xlabel('Time(s)');
ylabel('Frequency(Hz)');
title('Bearing Signal Spectrogram');
axis xy

高频噪声分量遍布整个时频谱图,这种现象是原始振动和小缺陷引起的振动的混合效应。 要准确计算平均峰值频率,需要对数据进行滤波以去除那些高频分量。
对振动信号应用中值滤波器以去除高频噪声分量并保留高频中的有用信息,在中值滤波后绘制时频谱图, 高频成分被抑制。
[~,fvec,tvec,Pmiddle] = spectrogram(dataMiddleFilt,500,450,512,fs);
imagesc(tvec,fvec,Pmiddle)
xlabel('Time(s)');
ylabel('Frequency(Hz)');
title('Filtered Bearing Signal Spectrogram');
axis xy

由于平均峰值频率成功地区分健康轴承和故障轴承,因此从每个数据段中提取平均峰值频率。
% 初始化一个向量以存储提取的平均峰值频率
meanPeakFreq = zeros(numSamples,1);
for k = 1:numSamples
% 获取最新数据
curData = data{k};
% 应用中值滤波器
curDataFilt = medfilt1(curData,3);
% 计算spectrogram.
[~,fvec,tvec,P_k] = spectrogram(curDataFilt,500,450,512,fs);
% 计算峰值频率
[~,I] = max(P_k);
meanPeakFreq(k) = mean(fvec(I));
end
绘制提取的平均峰值频率与时间的关系
plot(expTime,meanPeakFreq);
xlabel('Time(min)');
ylabel('Mean peak frequency (Hz)');
grid on;

状态监测
使用预定义阈值和动态模型执行状态监测。对于状态监测,如果平均峰值频率超过预定义阈值,则触发警报。将平均峰值频率视为时间序列,则可以估计平均峰值频率的时间序列模型,并使用该模型来预测未来值。使用前 200 个平均峰值频率值创建初始时间序列模型,然后一旦有新值可用,则可以立即更新时间序列模型。这种更新时间序列模型的批处理模式可以捕捉瞬时趋势。本例更新的时间序列模型用于计算提前 10 步的预测。
tStart = 200; % 开始时间
timeSeg = 100; % 建立动态模型的数据长度
forecastLen = 10; % 定义预测时间范围
batchSize = 10; % 定义更新动态模型的批量大小
对于预测和状态监控,需要设置一个阈值来决定何时停止机器运行。 在本例中,使用健康轴承和故障轴承的统计数据来确定阈值。 健康轴承和故障轴承的平均峰值频率的概率分布通过轴承缺陷深度来计算。
绘制健康和故障轴承的平均峰值频率的概率分布
plot(pFreq,pNormal,'g--',pFreq,pFaulty,'r');
xlabel('Mean peak frequency(Hz)');
ylabel('Probability Distribution');
legend('Normal Bearing','Faulty Bearing');

根据上图,将平均峰值频率的阈值设置为 2000Hz,以区分健康轴承和故障轴承
threshold = 2000;
计算采样时间并将其单位转换为秒
samplingTime = 60*(expTime(2)-expTime(1)); % 单位: seconds
tsFeature = iddata(meanPeakFreq(1:tStart),[],samplingTime);
绘制最初的 200 个平均峰值频率数据。
plot(tsFeature.y)

因为最初轴承是健康的,平均峰值频率预计不会显著变化。
使用前 200 个数据点识别二阶状态空间模型, 获取规范形式的模型并指定采样时间。
past_sys = ssest(tsFeature,2,'Ts',samplingTime,'Form','canonical')
past_sys =
Discrete-time identified state-space model:
x(t+Ts) = A x(t) + K e(t)
y(t) = C x(t) + e(t)
A =
x1 x2
x1 0 1
x2 0.9605 0.03942
C =
x1 x2
y1 1 0
K =
y1
x1 -0.003899
x2 0.003656
Sample time: 600 seconds
Parameterization:
CANONICAL form with indices: 2.
Disturbance component: estimate
Number of free coefficients: 4
Use "idssdata", "getpvec", "getcov" for parameters and their uncertainties.
Status:
Estimated using SSEST on time domain data "tsFeature".
Fit to estimation data: 0.2763% (prediction focus)
FPE: 640, MSE: 602.7
初始估计的动态模型具有低拟合优度, 拟合优度指标是归一化均方根误差 (NRMSE),计算为

xtrue是真实值,xpred为预测值。当估计数据是恒定电平和噪声的组合时 , NRMSE接近于 0,绘制残差的自相关。
resid(tsFeature,past_sys)

可以看出,残差是不相关的,生成的模型是有效的
使用已识别的模型 past_sys 预测平均峰值频率值并计算预测值的标准偏差。
[yF,~,~,yFSD] = forecast(past_sys,tsFeature,forecastLen);
绘制预测值和置信区间
tHistory = expTime(1:tStart);
forecastTimeIdx = (tStart+1):(tStart+forecastLen);
tForecast = expTime(forecastTimeIdx);
绘制历史数据、预测值和 95% 置信区间。
plot(tHistory,meanPeakFreq(1:tStart),'b',...
tForecast,yF.OutputData,'kx',...
[tHistory; tForecast], threshold*ones(1,length(tHistory)+forecastLen), 'r--',...
tForecast,yF.OutputData+1.96*yFSD,'g--',...
tForecast,yF.OutputData-1.96*yFSD,'g--');
ylim([400, 1.1*threshold]);
ylabel('Mean peak frequency (Hz)');
xlabel('Time (min)');
legend({'Past Data', 'Forecast', 'Failure Threshold', '95% C.I'},...
'Location','northoutside','Orientation','horizontal');
grid on;

该图显示平均峰值频率的预测值远低于阈值。
随着新数据的到来更新模型参数,并重新估计预测值。 创建警报以检查信号或预测值是否超过故障阈值。
for tCur = tStart:batchSize:numSamples
tsFeature = iddata(meanPeakFreq((tCur-timeSeg+1):tCur),[],samplingTime);
% 当新数据进来时更新系统参数
% parameters as initial guesses.
sys = ssest(tsFeature,past_sys);
past_sys = sys;
% 预测更新后的状态空间模型的输出
[yF,~,~,yFSD] = forecast(sys, tsFeature, forecastLen);
% 查找与历史数据和预测值对应的时间
tHistory = expTime(1:tCur);
forecastTimeIdx = (tCur+1):(tCur+forecastLen);
tForecast = expTime(forecastTimeIdx);
% 绘制历史数据、预测的平均峰值频率值和 95%置信区间
plot(tHistory,meanPeakFreq(1:tCur),'b',...
tForecast,yF.OutputData,'kx',...
[tHistory; tForecast], threshold*ones(1,length(tHistory)+forecastLen), 'r--',...
tForecast,yF.OutputData+1.96*yFSD,'g--',...
tForecast,yF.OutputData-1.96*yFSD,'g--');
ylim([400, 1.1*threshold]);
ylabel('Mean peak frequency (Hz)');
xlabel('Time (min)');
legend({'Past Data', 'Forecast', 'Failure Threshold', '95% C.I'},...
'Location','northoutside','Orientation','horizontal');
grid on;
% 当实际监控变量或预测值超过故障阈值时显示警报
if(any(meanPeakFreq(tCur-batchSize+1:tCur)>threshold))
disp('Monitored variable exceeds failure threshold');
break;
elseif(any(yF.y>threshold))
% 估计系统达到故障阈值的时间
tAlarm = tForecast(find(yF.y>threshold,1));
disp(['Estimated to hit failure threshold in ' num2str(tAlarm-tHistory(end)) ' minutes from now.']);
break;
end
end

我需要在客户计算机上运行Ruby应用程序。通常需要几天才能完成(复制大备份文件)。问题是如果启用sleep,它会中断应用程序。否则,计算机将持续运行数周,直到我下次访问为止。有什么方法可以防止执行期间休眠并让Windows在执行后休眠吗?欢迎任何疯狂的想法;-) 最佳答案 Here建议使用SetThreadExecutionStateWinAPI函数,使应用程序能够通知系统它正在使用中,从而防止系统在应用程序运行时进入休眠状态或关闭显示。像这样的东西:require'Win32API'ES_AWAYMODE_REQUIRED=0x0
当我的预订模型通过rake任务在状态机上转换时,我试图找出如何跳过对ActiveRecord对象的特定实例的验证。我想在reservation.close时跳过所有验证!叫做。希望调用reservation.close!(:validate=>false)之类的东西。仅供引用,我们正在使用https://github.com/pluginaweek/state_machine用于状态机。这是我的预订模型的示例。classReservation["requested","negotiating","approved"])}state_machine:initial=>'requested
我正在玩HTML5视频并且在ERB中有以下片段:mp4视频从在我的开发环境中运行的服务器很好地流式传输到chrome。然而firefox显示带有海报图像的视频播放器,但带有一个大X。问题似乎是mongrel不确定ogv扩展的mime类型,并且只返回text/plain,如curl所示:$curl-Ihttp://0.0.0.0:3000/pr6.ogvHTTP/1.1200OKConnection:closeDate:Mon,19Apr201012:33:50GMTLast-Modified:Sun,18Apr201012:46:07GMTContent-Type:text/plain
对于作为String#tr参数的单引号字符串文字中反斜杠的转义状态,我觉得有些神秘。你能解释一下下面三个例子之间的对比吗?我特别不明白第二个。为了避免复杂化,我在这里使用了'd',在双引号中转义时不会改变含义("\d"="d")。'\\'.tr('\\','x')#=>"x"'\\'.tr('\\d','x')#=>"\\"'\\'.tr('\\\d','x')#=>"x" 最佳答案 在tr中转义tr的第一个参数非常类似于正则表达式中的括号字符分组。您可以在表达式的开头使用^来否定匹配(替换任何不匹配的内容)并使用例如a-f来匹配一
我目前正在使用以下方法获取页面的源代码:Net::HTTP.get(URI.parse(page.url))我还想获取HTTP状态,而无需发出第二个请求。有没有办法用另一种方法做到这一点?我一直在查看文档,但似乎找不到我要找的东西。 最佳答案 在我看来,除非您需要一些真正的低级访问或控制,否则最好使用Ruby的内置Open::URI模块:require'open-uri'io=open('http://www.example.org/')#=>#body=io.read[0,50]#=>"["200","OK"]io.base_ur
导读:随着叮咚买菜业务的发展,不同的业务场景对数据分析提出了不同的需求,他们希望引入一款实时OLAP数据库,构建一个灵活的多维实时查询和分析的平台,统一数据的接入和查询方案,解决各业务线对数据高效实时查询和精细化运营的需求。经过调研选型,最终引入ApacheDoris作为最终的OLAP分析引擎,Doris作为核心的OLAP引擎支持复杂地分析操作、提供多维的数据视图,在叮咚买菜数十个业务场景中广泛应用。作者|叮咚买菜资深数据工程师韩青叮咚买菜创立于2017年5月,是一家专注美好食物的创业公司。叮咚买菜专注吃的事业,为满足更多人“想吃什么”而努力,通过美好食材的供应、美好滋味的开发以及美食品牌的孵
matlab打开matlab,用最简单的imread方法读取一个图像clcclearimg_h=imread('hua.jpg');返回一个数组(矩阵),往往是a*b*cunit8类型解释一下这个三维数组的意思,行数、数和层数,unit8:指数据类型,无符号八位整形,可理解为0~2^8的数三个层数分别代表RGB三个通道图像rgb最常用的是24-位实现方法,即RGB每个通道有256色阶(2^8)。基于这样的24-位RGB模型的色彩空间可以表现256×256×256≈1670万色当imshow传入了一个二维数组,它将以灰度方式绘制;可以把图像拆分为rgb三层,可以以灰度的方式观察它figure(1
之前在培训新生的时候,windows环境下配置opencv环境一直教的都是网上主流的vsstudio配置属性表,但是这个似乎对新生来说难度略高(虽然个人觉得完全是他们自己的问题),加之暑假之后对cmake实在是爱不释手,且这样配置确实十分简单(其实都不需要配置),故斗胆妄言vscode下配置CV之法。其实极为简单,图比较多所以很长。如果你看此文还配不好,你应该思考一下是不是自己的问题。闲话少说,直接开始。0.CMkae简介有的人到大二了都不知道cmake是什么,我不说是谁。CMake是一个开源免费并且跨平台的构建工具,可以用简单的语句来描述所有平台的编译过程。它能够根据当前所在平台输出对应的m
C#实现简易绘图工具一.引言实验目的:通过制作窗体应用程序(C#画图软件),熟悉基本的窗体设计过程以及控件设计,事件处理等,熟悉使用C#的winform窗体进行绘图的基本步骤,对于面向对象编程有更加深刻的体会.Tutorial任务设计一个具有基本功能的画图软件**·包括简单的新建文件,保存,重新绘图等功能**·实现一些基本图形的绘制,包括铅笔和基本形状等,学习橡皮工具的创建**·设计一个合理舒适的UI界面**注明:你可能需要先了解一些关于winform窗体应用程序绘图的基本知识,以及关于GDI+类和结构的知识二.实验环境Windows系统下的visualstudio2017C#窗体应用程序三.
MIMO技术的优缺点优点通过下面三个增益来总体概括:阵列增益。阵列增益是指由于接收机通过对接收信号的相干合并而活得的平均SNR的提高。在发射机不知道信道信息的情况下,MIMO系统可以获得的阵列增益与接收天线数成正比复用增益。在采用空间复用方案的MIMO系统中,可以获得复用增益,即信道容量成倍增加。信道容量的增加与min(Nt,Nr)成正比分集增益。在采用空间分集方案的MIMO系统中,可以获得分集增益,即可靠性性能的改善。分集增益用独立衰落支路数来描述,即分集指数。在使用了空时编码的MIMO系统中,由于接收天线或发射天线之间的间距较远,可认为它们各自的大尺度衰落是相互独立的,因此分布式MIMO