1. 基于振动数据的轴承退化模拟与PHM数据集构建
任务目标
构建一个包含正常、退化、故障三种状态的轴承全生命周期振动数据集,为后续PHM预测模型提供带标签的训练数据。数据集需包含时间序列振动信号、状态标签及退化程度指标,并具备可扩展性。
实现方案
采用仿真方式生成轴承振动信号:正常状态为平稳正弦叠加白噪声;退化状态为幅值逐渐增大且出现调制边带;故障状态为周期性冲击脉冲叠加高频共振。通过Python脚本生成数据并以CSV格式存储,同时输出可视化预览图。
环境依赖
numpy==1.24.3
pandas==2.0.3
matplotlib==3.7.2
关键完整代码
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
# 参数配置
fs = 20000 # 采样率 20kHz
duration = 10 # 每段时长 10秒
total_samples = fs * duration
f_shaft = 30 # 转频 30Hz
f_bpfo = 4.2 * f_shaft # 外圈故障特征频率 126Hz
f_resonance = 3000 # 高频共振频率
def generate_normal(t):
"""正常状态:基频振动 + 小幅随机噪声"""
signal = 0.5 * np.sin(2 * np.pi * f_shaft * t)
signal += 0.1 * np.sin(2 * np.pi * 2 * f_shaft * t)
noise = np.random.normal(0, 0.05, len(t))
return signal + noise
def generate_degraded(t, degradation_level):
"""退化状态:幅值增大 + 边带调制 + 噪声增强"""
# 幅值随退化程度线性增加
amp = 0.5 + 0.8 * degradation_level
signal = amp * np.sin(2 * np.pi * f_shaft * t)
# 边带调制(磨损引起的幅值波动)
sideband = 0.3 * np.sin(2 * np.pi * (f_shaft - 5) * t) * np.sin(2 * np.pi * f_shaft * t)
noise = np.random.normal(0, 0.1 + 0.2 * degradation_level, len(t))
return signal + sideband + noise
def generate_fault(t):
"""故障状态:周期性冲击 + 高频共振衰减"""
signal = np.zeros_like(t)
# 冲击间隔 = 1/f_bpfo
impact_interval = 1.0 / f_bpfo
impact_times = np.arange(0, duration, impact_interval)
for impact_time in impact_times:
# 每个冲击产生指数衰减的高频振荡
start_idx = int(impact_time * fs)
if start_idx >= len(t):
break
end_idx = min(start_idx + int(0.005 * fs), len(t)) # 5ms衰减
local_t = t[start_idx:end_idx] - impact_time
impact = 2.0 * np.exp(-local_t * 800) * np.sin(2 * np.pi * f_resonance * local_t)
signal[start_idx:end_idx] += impact
# 叠加正常振动分量
signal += 0.3 * np.sin(2 * np.pi * f_shaft * t)
noise = np.random.normal(0, 0.08, len(t))
return signal + noise
# 生成全生命周期数据
t = np.linspace(0, duration, total_samples, endpoint=False)
lifecycle_stages = [
("normal", 0.0, generate_normal(t)),
("degraded_early", 0.3, generate_degraded(t, 0.3)),
("degraded_mid", 0.6, generate_degraded(t, 0.6)),
("degraded_severe", 0.9, generate_degraded(t, 0.9)),
("fault", 1.0, generate_fault(t))
]
# 构建DataFrame并保存
records = []
for stage_name, level, signal in lifecycle_stages:
df_stage = pd.DataFrame({
"timestamp": t,
"vibration": signal,
"stage": stage_name,
"degradation_level": level
})
records.append(df_stage)
df_full = pd.concat(records, ignore_index=True)
df_full.to_csv("bearing_lifecycle_dataset.csv", index=False)
# 输出各阶段统计摘要
print("=== 数据集生成完成 ===")
print(f"总样本数: {len(df_full)}")
print(f"状态类别: {df_full['stage'].unique()}")
print("\n各阶段振动幅值统计:")
print(df_full.groupby('stage')['vibration'].agg(['mean', 'std', 'max']).round(4))
# 可视化预览(保存为PNG)
fig, axes = plt.subplots(5, 1, figsize=(12, 10), sharex=True)
for idx, (stage_name, _, signal) in enumerate(lifecycle_stages):
axes[idx].plot(t[:2000], signal[:2000], linewidth=0.5)
axes[idx].set_ylabel(stage_name)
axes[idx].set_ylim(-4, 4)
axes[-1].set_xlabel("时间 (s)")
plt.tight_layout()
plt.savefig("bearing_lifecycle_preview.png", dpi=100)
print("\n预览图已保存: bearing_lifecycle_preview.png")
运行方式
pip install numpy pandas matplotlib
python bearing_dataset_generator.py
验证方法
运行脚本后检查以下输出以确认数据集构建成功:
- 控制台打印“数据集生成完成”及总样本数(应为100,000条,即5阶段×20,000采样点);
- 状态类别包含normal、degraded_early、degraded_mid、degraded_severe、fault共5类;
- 各阶段振动幅值统计中,正常状态std约为0.05,退化状态std随退化程度递增,故障状态max值显著高于正常状态(冲击峰值约2.0);
- 打开bearing_lifecycle_preview.png,应看到正常阶段为平稳正弦波,退化阶段幅值逐渐增大且波形出现调制,故障阶段出现明显的周期性冲击尖峰。
数据集结构说明
生成的CSV文件包含4列:timestamp(时间戳)、vibration(振动加速度值)、stage(状态标签)、degradation_level(退化程度0~1)。该数据集可直接用于后续PHM模型训练,按stage列划分监督学习标签,或按degradation_level列进行回归预测。