1. 基于振动数据的轴承退化模拟与健康指标构建
任务说明
本案例面向PHM(故障预测与健康管理)中的轴承退化评估问题。目标为:构造一段模拟轴承全生命周期振动的加速度信号(从健康到严重退化),并从中提取能够反映退化趋势的健康指标(HI)。要求最终输出一条随时间单调变化的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)。