基于 preprocess_and_viz.py 代码,按完整预处理流程分析每一步的目的与处理方法:


🔄 完整预处理流程分析

第1步:数据加载与解析

1
rec = read_mat_any(fpath)
  • 目的:从MAT文件中提取振动信号数据
  • 处理方法
    • 智能匹配变量名(DE/FE/BA/time/RPM)
    • 兜底机制:选择最长数组作为DE信号
    • 标准化为1D float64数组
  • 输出:包含多通道振动数据的字典

第2步:通道选择策略

1
2
3
x = rec["DE"]; used_ch = "DE"
if x is None: x = rec["FE"]; used_ch = "FE"
if x is None: x = rec["BA"]; used_ch = "BA"
  • 目的:选择最优振动信号通道
  • 处理方法:优先级排序 DE > FE > BA
  • 原理:驱动端(DE)最接近故障源,信噪比最高

第3步:采样率统一化

1
2
fs_src = 1.0/dt if rec["time"] else (48000 if "48khz" in fpath else 12000)
x = resample_to_uniform(x, fs_src, fs_out)
  • 目的:统一不同数据源的采样率差异
  • 处理方法
    • 估计原始采样率:时间戳差值 → 频率
    • 线性插值重采样到目标频率(32kHz)
  • 意义:为后续处理提供统一的时间分辨率

第4步:信号去趋势

1
2
if cfg["preprocess_default"].get("detrend", True):
x = detrend(x)
  • 目的:去除信号中的低频趋势和直流偏置
  • 处理方法:线性去趋势 scipy.signal.detrend
  • 原理:消除传感器漂移、环境温度等非故障因素

第5步:阶次分析(关键创新)

1
2
3
if use_order and rpm_val > 0:
x_ord, fs_ord = order_resample(x, fs_eff, rpm_val, spr=200)
x = resample_to_uniform(x_ord, fs_ord, fs_out)
  • 目的:消除转速波动对故障特征的影响
  • 处理方法
    • 时间域 → 角度域转换:theta = 2πfr*t
    • 等角度间隔重采样:200样本/转
    • 回到统一时间域
  • 优势:使周期性故障特征更稳定

第6步:谱峭度自适应频带选择(核心算法)

1
2
3
bands, freqs, sk = spectral_kurtosis_band(x, fs_eff, …)
if len(bands)>0:
f1, f2 = bands[0]
  • 目的:自动识别故障冲击最显著的频带
  • 处理方法
    • 短时FFT计算时频谱:X(t,f)
    • 计算频域四阶矩:SK(f) = μ₄/σ² - 3
    • 选择峭度最大的频段作为滤波频带
  • 原理:故障冲击具有高峭度特性,正常信号接近高斯分布(峭度≈0)

第7步:自适应带通滤波

1
x_bp = bandpass(x, fs_eff, f1, f2)
  • 目的:突出故障特征频段,抑制噪声
  • 处理方法
    • Butterworth 4阶带通滤波器
    • 零相位滤波 sosfiltfilt 避免相位失真
  • 频带来源:谱峭度自选 或 配置默认值

第8步:包络分析

1
x_env = envelope(x_bp)  # Hilbert变换
  • 目的:提取故障冲击的调制包络
  • 处理方法:Hilbert变换求解析信号的幅值
  • 物理意义:轴承故障产生周期性冲击 → 高频载波被低频调制

第9步:信号标准化

1
x_norm = zscore(x_env) if pp.get("normalize")=="zscore" else x_env
  • 目的:消除幅值差异,便于模型训练
  • 处理方法:Z-score标准化 (x-μ)/σ
  • 效果:不同文件的特征在同一量级

第10步:滑动窗口分割

1
wins = windowing(x_norm, fs_eff, win_sec=1.0, overlap=0.5, drop_edges_sec=0.0)
  • 目的:生成固定长度的训练样本
  • 处理方法
    • 丢弃边缘噪声段
    • 1秒窗口,50%重叠滑动
    • 保证每个样本32k采样点
  • 意义:增加数据量,提供局部特征

第11步:数据持久化与索引

1
2
3
4
for i,w in enumerate(wins):
outp = os.path.join(out_dir, f"{base}__{i:04d}.npy")
np.save(outp, w.astype(np.float32))
rows.append((outp, label, used_ch, f1, f2, rpm_val, fs_eff))
  • 目的:保存预处理结果供模型训练
  • 处理方法
    • 每个窗口保存为独立.npy文件
    • 生成CSV索引:路径、标签、参数记录
  • 优势:支持大规模数据的懒加载

🎯 关键技术亮点

1. 智能频带选择

  • 传统方法:固定频带(如1-10kHz),可能遗漏关键频段
  • 本方法:谱峭度自适应选择,精准定位故障频段
  • 效果:信噪比显著提升

2. 阶次分析融合

  • 问题:变转速工况下故障特征频率漂移
  • 解决:角度域重采样,消除转速波动
  • 应用:实际列车运行中转速不恒定的场景

3. 轴承机理指导

  • 特征频率计算:基于几何参数自动计算BPFO/BPFI/BSF
  • 包络谱标注:可视化中自动标记理论故障频率
  • 物理约束:预处理参数与轴承机理相匹配

4. 多域特征保留

  • 时域:原始冲击波形
  • 频域:PSD功率谱
  • 包络域:调制包络信号
  • 谱峭度域:冲击检测指标

📊 流程效果评估

信号质量指标

  • 信噪比提升:带通滤波 + 包络提取
  • 特征突出度:谱峭度指导的频段选择
  • 稳定性:阶次分析消除转速影响

数据标准化

  • 采样率统一:32kHz标准
  • 窗口标准化:1秒固定长度
  • 幅值归一化:Z-score消除量级差异

可扩展性

  • 多数据源兼容:智能MAT解析
  • 参数可配置:YAML文件控制
  • 增量处理:支持源域/目标域分别处理

💡 工程价值

这个预处理流程实现了从原始振动信号高质量特征数据的完整转换,融合了:

  1. 信号处理理论(滤波、包络、时频分析)
  2. 轴承故障机理(特征频率、冲击特性)
  3. 机器学习需求(数据标准化、增强)
  4. 工程实用性(参数可配置、多源兼容)

为后续的深度学习模型提供了物理机理指导的高质量输入特征,是轴承智能故障诊断系统的重要基础。


http://example.com/posts/136.html
作者
司马吴空
发布于
2026年3月30日
许可协议