ARTICLE DETAIL

资讯详情

深耕郑州网站建设与运营推广的一线实战洞察。

旋转机械故障诊断:从振动数据分析到特征提取与AI识别

旋转机械故障诊断:从振动数据分析到特征提取与AI识别 简介一份docx格式的旋转机械故障诊断技术资料主要面向具备一定编程基础、从事转子试验台、齿轮箱或滚动轴承维护与状态监测的工程师和技术人员。内容从振动数据采集与预处理入手系统讲解时域特征RMS、峭度等、FFT频谱分析、轴承故障特征频率计算、Hilbert包络解调、小波变换以及CNN故障分类模型的实现路径并针对不平衡、不对中、齿轮啮合损伤、轴承内外圈故障等典型问题给出诊断思路。每个方法均配有可运行Python代码、逐段解释与可视化图表便于对照设备实际数据演练也可作为课程设计或企业内训的参考资料。资源为1个docx文档压缩包约42KB体量精简但覆盖了从经典信号处理到AI分类的完整流程。目前已有116人学习浏览适合用作课程项目复现和设备故障诊断入门参考。1. 旋转机械故障诊断振动数据分析为什么成了必修课一台风机轴承出现早期点蚀时温度还没升、声音还没变、电机电流也看不出异常加速度传感器却已经在轴承座上捕捉到一连串冲击脉冲。这就是振动数据分析最核心的价值它比人的感知和绝大多数常规监测量更早发现故障。所谓旋转机械故障诊断本质上是在这些振动数据里把正常和故障的边界找出来常见做法覆盖电机、泵、风机、齿轮箱、压缩机这类设备也覆盖从实验室台架到产线不停机设备的所有场景。适合读这篇内容的人也很明确工厂里的设备运维工程师、机械工程专业做课题的研究生、想落地工业AI应用的开发者。这篇内容按实际落地顺序讲传感器与预处理、时域频域特征提取、AI建模与验证代码可以直接改着用。2. 从传感器到特征向量预处理决定诊断上限很多人拿到振动数据就立刻算FFT、上模型结果往往是模型训得再漂亮放到现场照样翻车。问题大多不是出在模型上而是数据从采集到入库这一步就没做对。预处理要解决四件事采样率到底覆盖到多少赫兹、直流和奇异点怎么去掉、转速波动会不会把频谱糊掉、信号能不能在不同工况之间对齐。这四件事不做后面提什么特征都是在沙地上盖楼。2.1 采样率、传感器与抗混叠滤波先算清要看多高的频率传感器选型不是越贵越好而是频响范围要覆盖你关心的故障频率。工业现场用得最多的是加速度传感器频响可以从0.5Hz一直做到10kHz以上齿轮啮合频率、轴承冲击引起的高频共振都能接住。速度传感器对低频段更灵敏适合看不平衡、不对中这类1倍频分量位移传感器主要用在大型旋转机械的轴振监测上。这里有个常见坑有人拿加速度信号做数字积分想变成速度信号但积分会显著放大低频噪声结果往往是低频趋势项淹没真实转频分量。真要看速度谱直接在硬件上换速度传感器别指望事后积分补救。采样率按奈奎斯特定理至少要达到最高分析频率的2倍实际采集卡通常按2.56倍设置这个余量是给抗混叠滤波器用的。做设备状态监测的时候先算两组数转频frrpm/60齿轮啮合频率GMF齿数×转频。比如一台风机转速1470rpm转频是24.5Hz齿轮箱齿数100的啮合频率就是2450Hz加上轴承早期故障冲击激起的高频共振峰往往会落在2kHz到10kHz区间采样率设成25600Hz算是一个覆盖很广的保险值。如果只是监测低速重载设备转频几个赫兹采样率5120Hz也够没必要盲目追求高采样率——数据量大了存储和计算都跟着吃亏。2.2 去均值、去奇异点与零相位滤波让信号干净到能做特征原始振动信号直接做FFT第一个频点上经常顶着一个巨大的直流分量这不是真实振动是传感器零漂和ADC偏置会掩盖低频段真实谱峰。去掉它的操作就一行signal减去均值。这不只是数字游戏直流分量不去掉后续加窗后的频谱在低频段会出现明显斜坡泄漏。去奇异点也是预处理里的必修课。传感器底座松动、外界敲击、电缆摩擦都会产生单个尖峰脉冲这种尖峰如果不处理时域的峰值和峭度会被它一个点拉飞后面提特征直接失真。用滑动中值滤波而非滑动均值中值滤波可以干净地吃掉单点异常而不会把尖峰扩散成一段脉冲。kernel_size一般是5或7太大反而会把真实的短冲击也抹掉。如果一段数据里奇异点频繁出现优先检查传感器安装而不只是滤波。高通滤波去除基座晃动、温度漂移引起的趋势项工业上常见截止频率设在0.5Hz到2Hz。低速设备取0.5Hz因为转频可能只有1Hz截止频率太高会把转频本身的能量削掉。滤波时我会用零相位滤波也就是filtfilt做两次滤波让相位偏移归零否则滤波后的信号在时间轴上整体偏移后面按时间对齐特征时会出现偏差。2.3 变转速工况角域重采样这步跳过FFT就得糊变转速是振动分析里最容易踩的坑。固定采样率下每个数据点对应固定的时间间隔但绝大多数振动故障都和转轴转角相关转一圈出现一次冲击。转速一旦波动同一个故障在时间轴上不再是等间隔出现FFT谱峰会被展宽边带混在一起分不清包络谱里该有的故障特征频率被糊成一片。这种场景下需要做角域重采样把等时间间隔的信号转换成等角度间隔的信号也就是阶比分析。阶比的单位是每转次数转频永远是1阶轴承外圈故障大约在n/2×(1-d/D·cosα)阶这个位置跟转速变化无关这比频率谱稳定得多。判断一个设备要不要做角域重采样就看转速波动量。恒转速设备比如稳定运行的电机、泵转速波动率在1%以内可以不重采样。皮带打滑的工况、起停机过程、变速负载不做角域重采样后面基本没法诊断。下面是采集后处理的主流程代码包含去均值、去奇异点和高通滤波角域重采样部分给出示意。import numpy as np from scipy.signal import butter, filtfilt, medfilt # 读取采集卡导出的CSV两列分别是时间(s)和加速度(m/s^2) data np.loadtxt(vib.csv, delimiter,, skiprows1) time data[:, 0] raw data[:, 1] fs 25600 # 采样率由采集卡决定注意与抗混叠滤波器设置匹配 # 1. 去均值消除直流分量防止FFT低频段出现斜坡泄漏 x raw - np.mean(raw) # 2. 滑动中值滤波去奇异点kernel_size必须是奇数5表示每个点看左右各2个点 x medfilt(x, kernel_size5) # 3. 零相位高通滤波去掉基座漂移和温度趋势项保留2Hz以上成分 sos butter(4, 2.0, btypehighpass, fsfs, outputsos) x filtfilt(sos, x) # 4. 角域重采样示意需配合键相脉冲或编码器 # tacho_angle: 键相脉冲累计转角(rad)通过转速计获得 # angle_grid: 等角度网格按每转720点设定 # order_x np.interp(angle_grid, tacho_angle, x) # 重采样后的信号用阶次谱分析而不是频率谱这段代码里fs25600针对轴承和齿轮故障足够如果只盯低速转频可以降到5120Hz以减小数据量。medfilt的kernel_size5能去掉单点尖峰但如果信号本身就是每秒几百个冲击的轴承剥落不要加中值滤波真实冲击会被吃掉。高通截止频率2Hz适合大多数工业设备低速重载设备建议降到0.5Hz。注释里提到的角域重采样真正的工程实现还需要转速探头每转给出一个脉冲或者在轴上装编码器再根据脉冲时间序列拟合瞬时转速曲线。没有转速通道又想粗略估计阶次可以在频域里找转频峰值反推这种做法精度有限只适合转速缓慢变化的场合。3. 时域特征提取用均值、峰值和峭度给设备做体检时域特征是最先会被算出来的一批指标因为计算简单、实时性好嵌入式系统里也能轻松跑。但时域特征不是越多越好关键是分清楚哪些指标描述振动能量、哪些指标描述冲击形态、哪些指标受工况波动影响小。一套健康的特征组合应该同时覆盖整体恶化程度和早期局部损伤两个维度。3.1 有量纲特征能量大小但躲不开工况波动有量纲特征直接反映振动信号的物理幅值最常见的三个是均值、RMS和峰值。RMS叫均方根值反映振动能量大小对均匀磨损、不平衡这类故障很敏感是设备状态评估里最通用的基础指标。峰值和峰峰值反映的是最大瞬时冲击对轴承点蚀、齿轮断齿这类短促冲击更敏感。但它们的共同问题是随转速和载荷变化明显同一台设备空载和满载的RMS可能差出几倍所以有量纲特征适合固定工况下的趋势监控比如每天同一负载下测一次RMS看它逐周爬升的趋势不适合拿不同工况下的RMS直接做横向比较。需要提醒一点峰值这个指标对单个异常点极度敏感如果采集卡偶发丢点或传感器有噪声毛刺峰值会被一个坏点拉高。计算峰值前先做完2.2里的奇异点剔除否则峰值指标稳定性没法看。峰峰值在转速不平衡诊断里更实用它反映的是轴每转一圈最大的摆动幅度。3.2 无量纲特征峭度这类数为什么能抗干扰无量纲特征的价值在于幅值归一化后对载荷、转速变化不那么敏感适合不同工况之间比较。最核心的是峭度它衡量信号概率分布的尖峰程度正常设备振动接近正态分布峭度在3附近轴承出现点蚀、剥落后信号里出现周期性冲击概率分布尾部变厚峭度会明显大于3。我见过不少车间里用峭度做早期预警效果比RMS提前一周到两周。波形指标是RMS除以整流平均值正常波形在1.1到1.5之间冲击越多数值越大。峰值指标是峰值除以RMS轴承故障早期峰值指标会先抬升。脉冲指标是峰值除以整流平均值对单个冲击更敏感。裕度指标是峰值除以方根幅值方根幅值对小幅值成分更敏感所以裕度指标对齿轮早期断齿这类微弱冲击的辨识度更好。需要注意的是峭度这类无量纲参数也有盲区如果一段信号里混入一个巨大的敲击尖峰整段峭度都会被这一个点主导看起来像严重故障实际只是干扰这也是必须先做奇异点剔除的原因。3.3 时域特征批量计算的代码骨架实际项目里不会只算一个特征而是把上百条样本批量计算后喂给AI模型。下面是提取一组常用时域特征的函数覆盖了有量纲和无量纲两类指标输出直接做成DataFrame的行。import numpy as np def extract_time_features(sig): 从一段振动信号中提取常用时域特征 n len(sig) mean_val np.mean(sig) rms np.sqrt(np.mean(sig**2)) peak np.max(np.abs(sig)) peak_peak np.ptp(sig) rect_mean np.mean(np.abs(sig)) # 整流平均值 root_amp np.mean(np.sqrt(np.abs(sig)))**2 # 方根幅值 var np.var(sig) std np.sqrt(var) # 峭度四阶中心矩除以方差平方正态分布约为3 kurt np.mean((sig - mean_val)**4) / (var**2 1e-12) # 偏度描述分布不对称程度对松动类故障有一定指示性 skew np.mean((sig - mean_val)**3) / (std**3 1e-12) features { mean: mean_val, rms: rms, peak: peak, peak_peak: peak_peak, rect_mean: rect_mean, root_amp: root_amp, kurtosis: kurt, skewness: skew, waveform: rms / rect_mean, # 波形指标 crest: peak / rms, # 峰值指标 pulse: peak / rect_mean, # 脉冲指标 margin: peak / root_amp, # 裕度指标 } return features # 使用示例假设sig是预处理后的一段振动信号 # feat extract_time_features(sig) # 批量处理时把每条样本的特征拼成数组再丢给sklearn或XGBoost代码里加了1e-12的epsilon防止方差为0时除零这在信号长度较短时是实际会遇到的问题。峭度和偏度都是无量纲的RMS的单位和输入信号一致比如加速度信号就是m/s²。使用建议上日常趋势监控优先看RMS当RMS还在正常范围内但峭度连续几次超过4就要怀疑早期轴承故障齿轮类故障可以把裕度指标和峰值指标结合看两者同时抬升的可能性更高。注意峭度对信号长度敏感短样本的峭度波动很大一般建议每条样本至少包含30到50转以上的振动数据也就是信号长度大于50倍转频周期。4. 频域特征提取FFT与包络谱把故障频率钓出来时域特征能告诉你设备状态变差了但很难告诉你是哪个零件坏了。频域特征解决的是定位问题FFT把信号拆成不同频率成分不平衡在1倍频突出、不对中在2倍频附近有明显分量、齿轮故障在啮合频率附近出现边带。频域提取是旋转机械故障诊断里绕不开的核心环节。4.1 FFT分辨率与谱泄漏参数怎么定做FFT前先想清楚两个参数频率分辨率和窗函数。频率分辨率df等于采样率除以FFT点数比如fs25600Hz做32768点FFTdf约等于0.78Hz这意味着频谱上能区分的最小频率间隔是0.78Hz。低速设备转频只有几Hz时这个分辨率会偏粗需要增大FFT点数。但FFT点数不是越大越好点数超过信号实际长度后再补零只是插值不会带来真实分辨率提升。加窗是为了控制谱泄漏。振动信号不会天然整周期截断矩形窗会造成频谱能量泄漏到旁瓣表现为真实谱峰周围出现一串衰减的假峰。工程上最常用汉宁窗它对周期成分的旁瓣抑制好适合振动频谱分析。如果只想精确测量信号里是不是存在某个特定频率成分可以用flattop窗幅值误差更小。加窗后频谱幅值会被压低恢复真实幅值要除以窗增益汉宁窗的增益约0.5也就是幅值校正系数是2。下面代码里用的是Hanning窗加校正。import numpy as np from scipy.fft import fft, fftfreq def power_spectrum(x, fs, n_fftNone): 计算振动信号的幅值谱加汉宁窗并做幅值校正 n n_fft if n_fft is not None else len(x) win np.hanning(len(x)) x_win (x - np.mean(x)) * win # 去均值后加窗 spec fft(x_win, nn) freq fftfreq(n, 1/fs)[:n//2] amp np.abs(spec[:n//2]) * 2.0 / np.sum(win) # 幅值校正 # 去掉直流分量对应的0Hz谱线避免掩盖低频真实成分 return freq[1:], amp[1:]这段代码里x_win是加窗后的信号除以win_sum完成幅值校正只取前半段是奈奎斯特频段后半段与前半段对称没有额外信息。fftfreq的1/fs参数表示采样周期。如果n_fft大于len(x)会自动补零但补零不增加真实分辨率只让谱线更密。输出结果里0Hz谱线被去掉因为预处理后理论上不该有直流残余保留它会影响显示尺度。4.2 包络谱希尔伯特解调找出隐藏的冲击周期轴承早期故障的冲击信号本身很微弱它激起的是轴承座结构的高频共振直接做FFT时共振频带会顶起一大片草从这片草里根本分辨不出故障频率。包络分析的思想是先提取冲击包络再对包络做FFT这样原来藏在高频共振里的冲击重复周期就被解调出来了。希尔伯特变换是实现包络提取最常见的技术手段对信号做希尔伯特变换得到解析信号取模就是包络。包络谱上的横轴不再是共振频率而是冲击重复频率。外圈故障的冲击间隔等于BPFO对应周期包络谱上会在BPFO处出现明显谱峰并伴随2倍、3倍谐波。这套做法对轴承故障、齿轮断齿都是必用的手段。from scipy.signal import hilbert def envelope_spectrum(x, fs, n_fftNone): 对振动信号做包络谱分析Hilbert变换→取包络→FFT n n_fft if n_fft is not None else len(x) env np.abs(hilbert(x)) # 包络信号 env env - np.mean(env) # 去直流避免0Hz谱峰 win np.hanning(len(env)) spec fft(env * win, nn) freq fftfreq(n, 1/fs)[:n//2] amp np.abs(spec[:n//2]) * 2.0 / np.sum(win) return freq[1:], amp[1:] # 使用示例freq, amp envelope_spectrum(x_preprocessed, fs25600) # 然后在谱图上找轴承故障特征频率BPFO/BPFI处的峰值希尔伯特包络谱的关键参数是数据长度。要分辨BPFO附近的边带至少需要几个完整的冲击周期落入分析窗一般建议数据长度覆盖50到100转。包络谱上如果出现0.5倍转频的谱峰往往暗示不对中或支座松动这个经验在工程现场很实用。4.3 滚动轴承故障特征频率的计算要判断包络谱上的谱峰对应哪种故障先要算出该轴承的特征频率。四种典型故障特征频率的公式如下它们只与转频fr、滚动体数n、滚珠直径d、节圆直径D和接触角α有关和载荷大小没有直接关系这是理论值实际谱峰可能会因为打滑偏离1%到2%。故障部位特征频率公式说明外圈BPFO n/2 × fr × (1 - d/D×cosα)最常出现的谱峰内圈BPFI n/2 × fr × (1 d/D×cosα)常伴随转频边带滚动体BSF D/(2d) × fr × (1 - (d/D×cosα)²)谱峰位置最难抓保持架FTF 1/2 × fr × (1 - d/D×cosα)频率最低实际工程里把这些公式写进代码每台设备按型号参数算好等于有了寻故障频率的名单。import numpy as np def bearing_fault_freq(rpm, n_balls, d_mm, D_mm, alpha_deg0.0): 计算滚动轴承四种典型故障特征频率单位Hz rpm: 转速 n_balls: 滚动体数量 d_mm: 滚动体直径(mm) D_mm: 轴承节圆直径(mm) alpha_deg: 接触角(度) fr rpm / 60.0 alpha np.deg2rad(alpha_deg) cos_a np.cos(alpha) bpfo n_balls / 2.0 * fr * (1 - d_mm / D_mm * cos_a) bpfi n_balls / 2.0 * fr * (1 d_mm / D_mm * cos_a) bsf D_mm / (2.0 * d_mm) * fr * (1 - (d_mm / D_mm * cos_a)**2) ftf 0.5 * fr * (1 - d_mm / D_mm * cos_a) return {BPFO: bpfo, BPFI: bpfi, BSF: bsf, FTF: ftf} # 某风机轴承实例1470rpm10颗滚动体滚珠直径15mm节圆直径70mm freqs bearing_fault_freq(1470, 10, 15, 70) for name, f in freqs.items(): print(name, round(f, 2), Hz)代码里d_mm和D_mm只要单位一致就行使用毫米只是为了输入方便。注意BSF公式里频率对d/D比值很敏感如果轴承型号手册里没有精确的接触角取0度近似通常已经够用。实际诊断时拿着包络谱的谱峰位置和这些计算值对照偏差在2%以内即可确认故障频率不需要完全相等。这些参数也可以在设备铭牌、轴承型号手册里查到如果查不到用卡尺量滚动体直径和节圆直径误差对结果影响不大。5. 特征到AI诊断的避坑清单5个绕不开的坑时域频域特征提取完后接下来是AI建模。多数人最难受的不是模型不收敛而是验证集上准得吓人一上现场就废。这类问题九成出在数据划分和评估方式上不是模型本身。以下五条每一条都是实际踩过的按现象→原因→解决展开。5.1 训练集和测试集混进了同一个工况的样本现象模型在验证集上准确率99%到了现场不同转速、不同负载下预测一塌糊涂误报漏报都有。原因收集数据时同时混入了0%、50%、100%负载下的样本随机划分数据时每个负载工况的样本同时进入训练集和测试集。模型真正学到的是对工况的记忆而不是对故障的识别。换个工况故障特征分布一变模型立刻失效。这不叫泛化这叫背答案。解决按工况或设备ID划分数据集。sklearn里用GroupKFold分组变量放设备编号或负载档位。更严格的验证是独立工况验证只拿50%负载下载的数据训练用100%负载下的数据测试只有这个精度能说明模型真正学会了故障特征而不是记住工况。5.2 在切分数据集之前就做了归一化现象验证集效果很好在线从采集卡读取新数据预测时效果直线下降而且偏差模式没有规律。原因数据处理流程里先对全部数据计算了均值和标准差再做标准化然后才切分训练集和测试集。测试集的均值、方差信息已经参与进了标准化参数的估计这属于典型的数据泄漏验证集上的指标虚高。现场新数据进来时使用的是训练集统计量分布发生了偏移模型自然变差。解决先切分训练集和测试集再单独在训练集上fit标准化器测试集和推理阶段都复用训练集的mean和std。一句话scaler只能fit训练集的分布测试集只能transform。from sklearn.model_selection import train_test_split from sklearn.preprocessing import StandardScaler # X_features 是所有样本的特征矩阵y 是对应标签 X_train, X_test, y_train, y_test train_test_split( X_features, y, test_size0.3, random_state42, stratifyy ) scaler StandardScaler() X_train_scaled scaler.fit_transform(X_train) X_test_scaled scaler.transform(X_test) # 这里只transform不能再fitrandom_state固定是为了复现stratifyy确保分类问题里训练集和测试集的类别比例一致这个参数对不平衡数据集特别重要。5.3 滑动窗口重叠太高样本几乎算是复制粘贴现象模型训练时加样本数量感觉不到效果提升反倒过拟合越来越重验证集和训练集之间的差距很小换一段新数据立马露馅。原因用滑动窗口连续切样本时窗口重叠率设到80%甚至90%相邻窗口内的数据大部分相同几乎就是复制粘贴。随机划分训练集和测试集后同一段信号的孪生样本会同时出现在两端模型等于提前看到了答案。解决重叠率降到50%以内或者干脆做无重叠切分。更稳妥的是按设备连续运行段做分组一段连续采集的数据要么全部进训练集要么全部进测试集不让同一段数据横跨两个集合。注意增广操作正常滑动窗口本身也正常错的是切分方式。增广应该完全作用在训练集内部测试集永远只用原始、未增广的样本。5.4 小样本硬训深度学习训练集漂亮测试集翻车现象用了1D-CNN模型训练loss能降到0.01测试集F1只有0.6典型的过拟合。原因几千条振动样本对深度网络来说远远不够。CNN参数动辄几万几十万数据量喂不饱时模型会把训练集的噪声细节也学进去。工业现场能拿到的故障样本本来就少断层层不完、轴承不会按计划坏小样本是常态。解决优先用随机森林、XGBoost这类传统模型特征提得足够好时这些模型在小样本上的表现更稳。真要上CNN或者LSTM必须带正则化dropout加在池化层后面比例从0.3开始调早停监控验证集losspatience设10到20个epoch数据增强用加噪声、时间轴小幅拉伸、幅值缩放但记住增强只作用于训练集。另一个补救办法是迁移学习用正常工况的大量无标签数据做自编码器预训练再用少量故障样本微调这条路比直接硬训靠谱得多。5.5 只报准确率故障类召回率垫底也没人发现现象模型报告准确率95%但车间实际感受是故障经常漏报模型形同虚设。原因设备故障数据天然不平衡正常样本占95%以上故障样本只有5%。模型只要把所有样本都判成正常准确率就有95%但这显然没有诊断价值。准确率在不平衡数据集上是欺诈指标不能作为唯一的评估标准。解决看混淆矩阵重点关注故障类的召回率和精确率用F1分数综合评估。故障诊断场景里漏报的代价通常比误报高宁可多几次误报去停机检查也不能让真实故障溜过去。实际操作用precision-recall曲线选阈值不盲目用默认0.5把决策阈值往召回率方向移动。下面给出一个用混淆矩阵和PR曲线评估的代码骨架from sklearn.metrics import confusion_matrix, f1_score # y_pred_proba 是模型输出概率y_true 是真实标签 threshold 0.3 # 降低阈值优先提高故障召回率 y_pred (y_pred_proba threshold).astype(int) cm confusion_matrix(y_true, y_pred) print(cm) # 看左下角漏报数 print(F1:, f1_score(y_true, y_pred))阈值0.3只是起点实际画一遍precision-recall曲线找到召回率开始下跌的拐点那个位置就是现场报警阈值。这个方法和第6章的健康基线阈值可以配合使用一个解决分类问题一个解决报警问题。6. 用健康基线做自适应报警阈值比拍脑袋定阈值靠谱模型输出的是故障概率但现场真正要落地的是一个报警规则什么时候响报警。最常见的做法是拍个经验阈值比如RMS超过4.5就报警这对单台设备可能有效换一台设备往往就误报。我自己的教训是早期把所有设备的阈值统一写死在配置文件里换了一台新风机之后误报三天这才改成按设备建立健康基线。具体做法是设备正常运行的第一个月采集足够多的健康状态样本提取RMS、峭度、峰值指标这些特征建立分布模型报警阈值取99.9%分位数。正常波动最多覆盖到0.1%概率的极端值超过这个线就说明有异常趋势。实际报警规则加一条连续3次超限才报警避免单次毛刺误报。import numpy as np # healthy_rms健康工况下每天采一段样本计算出的RMS值列表 # 建议覆盖不同负载分工况建立基线 healthy_rms np.array([3.1, 2.9, 3.3, 3.0, 3.2, 3.1, 3.4]) # 自适应阈值取健康分布的99.9%分位数 threshold np.quantile(healthy_rms, 0.999) def should_alarm(latest_rms_values): 连续3次超过阈值才报警防止单点毛刺误报 return sum([v threshold for v in latest_rms_values]) 3 # 在线使用 # if should_alarm(rms_buffer[-3:]): 触发报警固定阈值和自适应阈值的差别可以从两个维度看固定阈值依赖外部标准或经验一条线管所有工况自适应阈值依赖设备自身历史数据分工况建立基线随设备状态滚动更新。分位数阈值还有一个好处是天然适配非高斯分布RMS这类特征不怎么服从正态分布用均值加3倍标准差反而容易出错分位数不依赖分布假设更稳。对比项固定阈值健康基线自适应阈值依据经验值/标准限值设备自身健康状态分布换设备重新调参自动重新统计转速变化误报率升高分工况基线可控早期故障发现晚峭度/RMS联合判断提前最后补一个配合技巧把峭度和RMS组成二维报警平面RMS超线说明整体振动能量升高峭度超线说明出现了冲击性故障两者同时超线再报警能压掉不少单一指标导致的假警。这个方向做下来报警配置从每台设备单独调数变成跑一遍统计代码就自动定值维护成本低一个量级。每个设备都有自己的健康长相振动数据分析先告诉你它正常时是什么样之后才能谈故障诊断。希望帮到你。本文还有配套的精品资源点击获取
返回列表