基于 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步:包络分析
- 目的:提取故障冲击的调制包络
- 处理方法: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文件控制
- 增量处理:支持源域/目标域分别处理
💡 工程价值
这个预处理流程实现了从原始振动信号到高质量特征数据的完整转换,融合了:
- 信号处理理论(滤波、包络、时频分析)
- 轴承故障机理(特征频率、冲击特性)
- 机器学习需求(数据标准化、增强)
- 工程实用性(参数可配置、多源兼容)
为后续的深度学习模型提供了物理机理指导的高质量输入特征,是轴承智能故障诊断系统的重要基础。