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

验证方法

运行脚本后检查以下输出以确认数据集构建成功:

  1. 控制台打印“数据集生成完成”及总样本数(应为100,000条,即5阶段×20,000采样点);
  2. 状态类别包含normal、degraded_early、degraded_mid、degraded_severe、fault共5类;
  3. 各阶段振动幅值统计中,正常状态std约为0.05,退化状态std随退化程度递增,故障状态max值显著高于正常状态(冲击峰值约2.0);
  4. 打开bearing_lifecycle_preview.png,应看到正常阶段为平稳正弦波,退化阶段幅值逐渐增大且波形出现调制,故障阶段出现明显的周期性冲击尖峰。

数据集结构说明

生成的CSV文件包含4列:timestamp(时间戳)、vibration(振动加速度值)、stage(状态标签)、degradation_level(退化程度0~1)。该数据集可直接用于后续PHM模型训练,按stage列划分监督学习标签,或按degradation_level列进行回归预测。

轴承全生命周期振动信号特征演变 t=0 运行时间 t=寿命终点 正常 早期退化 中期退化 严重退化 故障 退化程度 0→1 平稳正弦 幅值增大 冲击脉冲 退化程度≈0 退化程度≈1