1. 基于振动数据的轴承退化模拟与健康指标构建

基于振动数据的轴承退化模拟与健康指标构建 学习卡片

任务说明

本案例面向PHM(故障预测与健康管理)中的轴承退化评估问题。目标为:构造一段模拟轴承全生命周期振动的加速度信号(从健康到严重退化),并从中提取能够反映退化趋势的健康指标(HI)。要求最终输出一条随时间单调变化的HI曲线,为后续剩余寿命预测提供输入特征。

实现方案

采用外圈故障特征频率及其谐波分量的幅值增长来模拟退化过程。健康阶段以低幅值高斯白噪声为主;退化阶段逐步叠加故障特征频率成分,并加入幅值调制以模拟载荷波动。健康指标选用振动信号在故障特征频率处的窄带能量占比(即带通能量与总能量之比),该指标随故障加剧而上升,具备明确的物理意义。

轴承退化模拟与HI构建流程 参数初始化 fs=20kHz, N=10s BPFO=98.4Hz, 采样点数=200k 退化信号生成 幅值随退化系数a(t)增长 叠加噪声+谐波+调制 分帧提取特征 每帧1s, 共10帧 计算HI = E_band / E_total 趋势输出 HI曲线(10点) 单调上升验证 退化系数 a(t) 与 HI 趋势示意 时间 t (归一化) 幅值 / HI a(t) 退化系数 HI 健康指标 退化系数 a(t) 健康指标 HI

Python代码实现

import numpy as np

# ========== 1. 参数设置 ==========
fs = 20000          # 采样率 20kHz
duration = 10       # 总时长 10秒
n_samples = fs * duration
t = np.arange(n_samples) / fs

# 轴承外圈故障特征频率 (BPFO)
bpfo = 98.4         # Hz

# 退化系数 a(t): 从0线性增长到1,模拟退化过程
a = np.linspace(0, 1, n_samples)

# ========== 2. 模拟振动信号 ==========
# 2.1 基础噪声(健康阶段)
noise = 0.05 * np.random.randn(n_samples)

# 2.2 故障冲击成分:BPFO基频 + 2次、3次谐波,幅值随a(t)增长
fault_signal = np.zeros(n_samples)
for harmonic in [1, 2, 3]:
    freq = bpfo * harmonic
    # 幅值随退化系数增长,谐波幅值递减
    amp = a * (0.8 / harmonic)
    # 加入随机相位偏移
    phase = np.random.uniform(0, 2*np.pi)
    fault_signal += amp * np.sin(2 * np.pi * freq * t + phase)

# 2.3 幅值调制(模拟载荷波动,频率1Hz)
modulation = 1 + 0.3 * np.sin(2 * np.pi * 1.0 * t)
fault_signal *= modulation

# 合成最终振动信号
vibration = noise + fault_signal

# ========== 3. 分帧提取健康指标 ==========
frame_len = fs        # 每帧1秒
n_frames = duration    # 共10帧
hi_values = []

for i in range(n_frames):
    start = i * frame_len
    end = start + frame_len
    frame = vibration[start:end]

    # 计算频谱
    spectrum = np.fft.rfft(frame)
    freqs = np.fft.rfftfreq(frame_len, 1/fs)
    power = np.abs(spectrum) ** 2

    # 总能量
    total_energy = np.sum(power)

    # 故障特征频带能量:BPFO ± 5Hz 范围内
    band_mask = (freqs >= bpfo - 5) & (freqs <= bpfo + 5)
    band_energy = np.sum(power[band_mask])

    # 健康指标 = 频带能量占比
    hi = band_energy / total_energy if total_energy > 0 else 0
    hi_values.append(hi)

hi_values = np.array(hi_values)

# ========== 4. 输出结果 ==========
print("帧序号 | 健康指标(HI)")
for i, hi in enumerate(hi_values):
    print(f"  {i+1:2d}   | {hi:.6f}")

# 单调性验证:计算相邻差分
diff = np.diff(hi_values)
print("\nHI单调递增:", np.all(diff > 0))
print("HI最小值:", hi_values.min(), " HI最大值:", hi_values.max())

运行与验证

运行方式:将上述代码保存为 bearing_degradation.py,在已安装NumPy的Python环境中执行 python bearing_degradation.py。

预期输出特征:程序将打印10帧的HI值。由于退化系数a(t)从0线性增长到1,故障特征频率处的能量占比应逐帧上升,因此预期HI序列呈现单调递增趋势,且最小值接近0(健康状态),最大值接近0.5~0.8(严重退化状态)。

判定标准:满足以下条件即视为案例通过:

  • 程序无报错运行,输出10个HI值;
  • 输出的HI序列严格单调递增(相邻差分均大于0);
  • HI最小值小于0.05,最大值大于0.3,表明动态范围覆盖健康与退化状态。

说明:由于代码中使用了随机噪声和随机相位,每次运行的具体HI数值会略有不同,但单调递增趋势和量级范围保持稳定。若需完全复现相同数值,可在代码开头添加 np.random.seed(42)。