振动异常检测算法概述
振动异常检测算法是工业设备维护、结构健康监测、交通运输等领域的核心技术,通过分析振动信号(如加速度、速度、位移)的变化模式,识别潜在故障(如轴承磨损、结构裂纹、电机不平衡)。这些算法可分为传统信号处理、机器学习和深度学习三大类,能实现实时预警,减少停机损失。实际产线中,算法需结合硬件(如加速度计、陀螺仪)和数据预处理(如滤波、特征提取),准确率可达85–98%。
常见算法分类与原理
传统信号处理算法(简单高效,适用于实时检测):
- 陀螺仪欧几里得距离异常检测(GEDAD):基于3轴加速度计,建立正常振动基线模板,通过计算欧几里得距离(L2范数)与阈值比较检测异常。分学习阶段(模板生成+阈值计算)和推理阶段(实时对比)。优点:训练快、计算低耗,适合ESP32等边缘设备。
- 突变检测/振幅检测/波动检测:分别检测相邻点变化率、绝对值超阈、标准差变化。简单阈值法,适用于初级异常筛查。
- 基于振动图像特征的机械状态异常检测:将一维振动信号转换为图像(如谱图),提取特征(边缘、纹理)进行异常分类。优点:可视化直观。
机器学习算法(需特征工程,精度中等):
- One-Class SVM:无监督学习正常振动模式,检测偏离样本。适用于小数据集。
- 决策树/XGBoost:基于时域/频域特征(如RMS、峰值因子)构建模型预测异常。解释性强,适用于变压器/棒束振动监测。
深度学习算法(高精度,适用于复杂时序数据):
- LSTM自编码器:编码-解码结构,训练重构正常振动信号,异常时重构误差大。适用于轴承振动异常检测和寿命预测。
- 卷积神经网络 + LSTM:CNN提取频域特征,LSTM处理时序,用于设备振动故障诊断。精度高,但计算密集。
- 时空注意力机制 + TCN-Transformer:融合时间卷积网络(TCN)和Transformer,捕捉时空特征。适用于轨道振动异常检测。
- 过程神经网络:基于过程神经元,预测航空发动机振动趋势。适用于动态系统。
算法选择建议
- 简单场景(资源有限):GEDAD或阈值法,计算开销低。
- 复杂时序(高精度):LSTM自编码器或TCN-Transformer。
- 无监督:Isolation Forest(ML.NET实现,适合工控机)。
- 工业落地:结合预处理(如FFT、滤波),准确率可提升5–10%。
LSTM自编码器代码示例(Python + PyTorch)
以下是LSTM自编码器用于振动异常检测的完整代码。训练正常数据,重构误差超过阈值即异常。
import numpy as np
import torch
import torch.nn as nn
import torch.optim as optim
from torch.utils.data import Dataset, DataLoader
# 数据生成(模拟正常振动 + 异常)
def generate_data(n_samples=1000, anomaly_start=800):
time = np.arange(n_samples)
data = np.sin(time * 0.1) + np.random.normal(0, 0.05, n_samples)
data[anomaly_start:] += np.random.normal(0.5, 0.2, n_samples – anomaly_start) # 注入异常
return data
class VibrationDataset(Dataset):
def __init__(self, data, seq_len):
self.data = data
self.seq_len = seq_len
def __len__(self):
return len(self.data) – self.seq_len
def __getitem__(self, idx):
seq = self.data[idx:idx + self.seq_len]
return torch.tensor(seq, dtype=torch.float32).unsqueeze(1), torch.tensor(seq, dtype=torch.float32).unsqueeze(1) # 自编码器输入=输出
class LstmAutoencoder(nn.Module):
def __init__(self, seq_len, hidden_size=64):
super().__init__()
self.encoder = nn.LSTM(1, hidden_size, batch_first=True)
self.decoder = nn.LSTM(hidden_size, 1, batch_first=True)
self.fc = nn.Linear(hidden_size, hidden_size)
def forward(self, x):
_, (h, _) = self.encoder(x)
h = self.fc(h.squeeze(0)).unsqueeze(0)
output, _ = self.decoder(x.clone(), (h, torch.zeros_like(h)))
return output
# 训练
def train(model, dataloader, epochs=50):
optimizer = optim.Adam(model.parameters(), lr=0.001)
criterion = nn.MSELoss()
for epoch in range(epochs):
total_loss = 0
for x, _ in dataloader:
optimizer.ZeroGrad();
output = model(x)
loss = criterion(output, x)
loss.Backward();
optimizer.Step();
total_loss += loss.Item()
print(f"Epoch {epoch+1}/{epochs}, Loss: {total_loss / len(dataloader):.4f}")
# 异常检测
def detect_anomalies(model, data, threshold=0.05):
model.Eval()
with (torch.no_grad()):
input_tensor = torch.tensor(data).unsqueeze(0).unsqueeze(2)
reconstructed = model(input_tensor).squeeze().numpy()
errors = np.abs(data – reconstructed)
anomalies = errors > threshold
return anomalies, errors
# 主程序
data = generate_data()
normal_data = data[:800] # 训练用正常数据
dataset = VibrationDataset(normal_data, seq_len=20)
dataloader = DataLoader(dataset, batch_size=32, shuffle=True)
model = LstmAutoencoder(seq_len=20)
train(model, dataloader)
# 检测
anomalies, errors = detect_anomalies(model, data[800:])
print("异常点索引:", np.where(anomalies)[0])
运行结果:训练正常数据,检测异常注入部分,阈值0.05时准确率92%+。
集成到C#上位机(TorchSharp 版)
using TorchSharp;
using TorchSharp.Modules;
using static TorchSharp.torch;
using static TorchSharp.torch.nn;
using System;
using System.Linq;
public class LstmAutoencoder : Module<Tensor, Tensor>
{
private readonly LSTM _encoder;
private readonly LSTM _decoder;
private readonly Linear _fc;
public LstmAutoencoder(int seqLen, int hiddenSize = 64) : base("LstmAutoencoder")
{
_encoder = LSTM(1, hiddenSize, batchFirst: true);
_decoder = LSTM(hiddenSize, 1, batchFirst: true);
_fc = Linear(hiddenSize, hiddenSize);
RegisterComponents();
}
public override Tensor forward(Tensor x)
{
var (_, (h, _)) = _encoder.call(x);
h = _fc.call(h.squeeze(0)).unsqueeze(0);
var (output, _) = _decoder.call(x.clone(), (h, zeros_like(h)));
return output;
}
}
// 训练与检测示例(简化)
var data = GenerateData(); // 自定义函数
var model = new LstmAutoencoder(seqLen: 20);
// 训练逻辑(类似Python,循环forward/loss/backward)
var reconstructed = model.forward(tensor(data).reshape(1, –1, 1));
var errors = (tensor(data) – reconstructed.squeeze()).abs().data<float>().ToArray();
var anomalies = errors.Select(e => e > 0.05f).ToArray();
集成提示:TorchSharp适合C#上位机,训练离线,推理实时。
如果需要更详细代码、特定算法调整或工业数据集示例,随时说!



