行星齿轮箱这类设备,在风电、矿机、盾构、直升机主减速器里几乎都是核心传动件。它的特点是结构紧凑、传动比大、承载能力强,但诊断起来远比普通定轴齿轮箱麻烦。这些年我在设备健康管理项目里处理最多的就是行星齿轮箱的振动数据,说实话,光靠传统频谱看基频、倍频那一套,经常被多级啮合产生的复杂边带搞晕。后来真正让我觉得“够用”的,是转向时频特征组合——把振动信号在时间、频率两个维度同时打开,再结合故障特征频率去锁定异常能量。
这篇文章就围绕“行星齿轮箱时频特征故障诊断”展开,我会把完整的技术思路、特征频率推导、从信号预处理到时频特征提取再到故障判别的整套 Python 代码都放出来。适合刚接触设备故障诊断的工程师、研究生,也适合想从“看频谱”升级到“多维度分析”的现场技术人员。废话不多说,先把最难的部分摆到台面上讲清楚。
1. 行星齿轮箱的诊断难点与时频分析的价值
1.1 为什么行星齿轮箱比定轴齿轮箱难诊断
先说一个现场很常见的现象:同一台设备,定轴齿轮箱齿面点蚀,频谱上很容易看到啮合频率的幅值变化和明显的边带;但换成行星齿轮箱,同样程度的故障,频谱上往往只有一个不太起眼的“鼓包”,边带乱成一团,甚至看不出规律。这不是传感器灵敏度的问题,而是行星齿轮箱的传动结构决定了振动信号天然复杂。
行星齿轮箱的功率传递路线是:太阳轮同时和多个行星轮啮合,行星轮又同时和齿圈啮合。这意味着同一时刻有多个啮合点在工作,每个啮合点到传感器外壳的传递路径都不同。行星架旋转时,各个行星轮不断改变位置,振动从不同啮合点传到传感器上的路径长度和衰减程度一直在变化,传感器拾取的信号实际上是多路啮合振动信号的叠加。这种“时变传递路径”效应是行星齿轮箱故障诊断最大的拦路虎。
另一个麻烦在于低转频部件。输出轴转速往往很低,行星架转频可能只有几个赫兹,故障特征频率甚至低于 10 Hz。低频段的信噪比差,现场又有各种背景噪声和结构共振干扰,想在原始频谱里直接把这些特征抠出来,几乎不可能。
还有一个工程上的坑:行星齿轮箱换不同的工况,比如负载从 30% 升到 100%,载荷分布不均会导致各行星轮分担的载荷不一样,振动幅值和边带结构都会变化。现场数据往往不是实验室那种稳定转速、稳定载荷的干净信号,转速波动、负载波动才是常态。对于这种本质非平稳的系统,单独用一段时域波形的 RMS 值,或者单独用一张 FFT 频谱,丢失的信息都太多。
1.2 时频分析到底切中了哪些痛点
时频特征这张牌的好处,是可以把“什么时候出现异常能量”和“异常能量出现在什么频率”两件事同时讲清楚。比如行星架的 7.5 Hz 转频成分会周期性地改变传递路径,这会让故障冲击的幅值也随 7.5 Hz 周期波动——这种现象在时域波形里表现为“一阵强、一阵弱”,在频谱里表现为对啮合频率的调幅边带。如果只在频域看,你看到的是很多根谱线,很难确定这些边带是真实的故障调制还是结构共振造成假象;加上时频图像后,能量随时间的周期性变化一目了然。
时频分析对转速波动也更宽容。短时傅里叶变换或者同步压缩小波变换自带“局部时间窗”的属性,即便转速在小范围内波动,只要窗内信号近似平稳,依然能较清晰地看到频率成分的连续轨迹。相比之下,整段信号一次性做 FFT,转速波动会把谱线抹宽、能量摊薄,故障特征频率的峰值幅度会被严重低估。
还有一个实际原因是便于可视化汇报。现场拍板要不要停机检修,往往需要直观证据。一张时频谱图,异常能量带、边带周期、冲击间隔,看图的工程师和操作员都能快速理解;而单纯一堆谱线数字,只能靠分析人员口头解释,很容易被挑战“凭什么说这台设备有问题”。
2. 整体方案设计:仿真信号、故障特征与算法选型
2.1 算清楚特征频率再动手
不管用什么高级算法,第一件事永远是算特征频率。行星齿轮箱故障诊断说白了就是找“齿轮箱里哪个部件在啮合频率附近产生了不该有的调制和冲击”,而所有调制频率都和各部件的转频、啮合频率有关。
以最常见的固定齿圈、太阳轮输入、行星架输出的单级行星齿轮箱为例,我取一组典型参数:齿圈齿数 Z_r=72,太阳轮齿数 Z_s=24,行星轮齿数 Z_p=24,行星轮个数 N_p=3,输入轴转频 f_s=30 Hz(对应 1800 RPM)。固定齿圈传动结构的转速关系是:行星架转频 f_c = f_s × Z_s / (Z_s + Z_r) = 30 × 24 / 96 = 7.5 Hz。太阳轮与行星架之间的相对转频 f_sun_rel = f_s - f_c = 22.5 Hz。
啮合频率 f_m 由太阳轮与任一行星轮的啮合决定,公式为 f_m = (f_s - f_c) × Z_s = 22.5 × 24 = 540 Hz,它也等于 f_c × Z_r = 7.5 × 72 = 540 Hz。啮合频率是整台齿轮箱振动能量的主峰所在。
局部故障的特征频率则与故障部件相关,我按常用的工程简化公式整理成表,后面仿真和包络谱特征提取都会用到:
| 部件 | 特征频率公式 | 本例数值 |
|---|---|---|
| 啮合频率 | f_m = (f_s - f_c) × Z_s = f_c × Z_r | 540 Hz |
| 太阳轮局部故障 | N_p × (f_s - f_c) | 67.5 Hz |
| 行星轮局部故障 | 2 × f_m / Z_p | 45 Hz |
| 齿圈局部故障 | f_m / Z_r | 7.5 Hz |
| 行星架转频 | f_c | 7.5 Hz |
| 太阳轮调制边带间隔 | f_s - f_c | 22.5 Hz |
这里有一点特别容易混淆:边带间隔和故障冲击频率不是一回事。频谱上,太阳轮故障会在啮合频率两侧产生以 f_sun_rel=22.5 Hz 为间隔的调制边带,而包络谱中太阳轮故障的冲击特征峰在 N_p×(f_s - f_c)=67.5 Hz。现场分析时,如果不把这两个量分开,很容易误判。
2.2 仿真信号怎么搭才能贴近真实
实验室设备能拆开来人为制造磨损,但大多数工程师手里只有现场在线监测数据,缺少“已知故障标签”样本来验证算法。我的做法是先用仿真信号把算法流程跑通,让每个特征量都有确定的“标准答案”,再去处理真实数据。仿真信号搭得好不好,直接决定后面特征提取方法验证的可靠性。
健康行星齿轮箱振动主要由啮合频率及其谐波构成,并带有一定程度的调制:太阳轮转频对啮合振动产生小幅调幅,行星架通过时也会引起幅值波动。因此健康信号可以写成:
x_health(t) = A1 × cos(2π f_m t) × [1 + m1×cos(2π f_sun_rel t) + m2×cos(2π f_c t)] + A2 × cos(4π f_m t + φ) + n(t)
其中 m1=0.05、m2=0.05 是健康状态下的小调制系数,n(t) 是高斯白噪声。
太阳轮齿根裂纹故障时,故障齿每通过一个行星轮就会产生一次冲击,冲击周期是 1/67.5 秒左右。同时啮合刚度波动增大,啮合频率处的幅值调制明显加深。故障信号我在健康信号基础之上,额外叠加周期性瞬态冲击序列和更强的调幅项:
x_fault(t) = x_health(t) + A_imp × Σ exp(-β(t-t_k)) × sin(2π f_r (t-t_k)) × u(t-t_k) + ΔA × cos(2π f_m t) × cos(2π f_sun_rel t)
冲击间隔 1/67.5 s,衰减系数 β 控制冲击衰减快慢,f_r 取结构共振频率附近的 2700 Hz。这样构造出来的故障信号,理论上同时具备调制边带、周期性冲击和高频共振衰减三类特征,正好用来检验后面的特征提取手段。
为什么不直接采集一组真实故障数?因为真实数据里故障类型、程度、转速负载都是交叉耦合的,仿真信号反而能单独控制变量。建议一定要在仿真信号层面把“特征-故障”对应关系摸清楚,再上现场数据,否则调参都没有参照物。
2.3 STFT、CWT、HHT 怎么选
时频分析算法很多,不会全用到生产项目里。下面这张表我把三个常用方法的定位和适用场景整理了出来,后面代码里也主要围绕前两种展开。
| 方法 | 原理要点 | 优点 | 缺点 | 适用场景 |
|---|---|---|---|---|
| STFT 短时傅里叶变换 | 对信号分段加窗后逐段做 FFT | 实现简单、物理意义直观、计算快 | 时间频率分辨率受窗长限制,不能同时最优 | 转速相对稳定、需要快速出图的在线监测 |
| CWT 连续小波变换 | 用可变尺度的小波基与信号内积 | 低频处频率分辨率高,适合多分辨率分析 | 计算量大,小波基和尺度选择有讲究 | 冲击特征明显、需要捕捉瞬态成分的离线分析 |
| HHT 希尔伯特-黄变换 | 经验模态分解加希尔伯特谱 | 自适应性强,非常适合非平稳非线性信号 | 模态混叠、端点效应处理麻烦 | 剧烈非平稳、变速变载严重的深度分析 |
我个人的经验是:日常诊断先用 STFT 快速看全局,找到可疑频带后再用 CWT 放大看细节,HHT 属于“攻坚武器”,信号平稳度很差时才搬出来。三者的组合比任何单一算法都稳。
3. 代码实现:从特征提取到故障判别的完整流程
3.1 环境依赖与工程结构
代码基于 Python 3.9+,核心依赖是 NumPy、SciPy、Matplotlib,再加一个 PyWavelets 用于连续小波变换。这些库都可以用 pip 直接安装:
pip install numpy scipy matplotlib pywavelets工程结构我会按下面这样组织,信号生成、特征提取、故障判别各归各的模块,方便后面换成真实数据时只替换数据读取部分:
planetary_gearbox_diagnosis/ ├── config.py # 齿轮箱参数、采样率、特征频率 ├── signal_sim.py # 健康/故障信号仿真 ├── feature_extract.py # STFT、包络谱、统计特征 ├── fault_decision.py # 阈值判别逻辑 ├── run_demo.py # 一键运行脚本 └── output/ # 图像和中间结果输出目录3.2 信号仿真与预处理代码
先来看参数配置。采样率我取 8192 Hz,采样时长 4 秒。这个采样率既能覆盖 540 Hz 啮合频率和 2700 Hz 结构共振频率,又不至于让数据量太大。4 秒时长对 7.5 Hz 的行星架转频来说,能包含 30 个完整周期,足够观察周期调制规律。
import numpy as np from scipy.signal import hilbert, stft, find_peaks # -------- 齿轮箱基础参数 -------- Z_r = 72 # 齿圈齿数 Z_s = 24 # 太阳轮齿数 Z_p = 24 # 行星轮齿数 N_p = 3 # 行星轮个数 f_s = 30.0 # 太阳轮输入转频 Hz fsample = 8192 # 采样率 duration = 4.0 # 采样时长(秒) n_samples = int(fsample * duration) t = np.arange(n_samples) / fsample # -------- 特征频率推导 -------- f_c = f_s * Z_s / (Z_s + Z_r) # 行星架转频 7.5 Hz f_sun_rel = f_s - f_c # 太阳轮相对转频 22.5 Hz f_m = (f_s - f_c) * Z_s # 啮合频率 540 Hz f_sun_def = N_p * (f_s - f_c) # 太阳轮故障冲击频率 67.5 Hz f_planet_def = 2 * f_m / Z_p # 行星轮故障特征频率 45 Hz f_ring_def = f_m / Z_r # 齿圈故障特征频率 7.5 Hz print(f"行星架转频: {f_c:.2f} Hz") print(f"太阳轮相对转频: {f_sun_rel:.2f} Hz") print(f"啮合频率: {f_m:.2f} Hz") print(f"太阳轮故障特征频率: {f_sun_def:.2f} Hz")接下来是健康信号和太阳轮故障信号的仿真。故障信号的关键在于周期性冲击序列,我先创建一个冲击起始时刻数组,从 0 开始每隔 1/67.5 秒出现一次冲击,每个冲击点触发一个衰减振荡。这个过程用向量化写法避免 for 循环,速度快得多,对初学者也友好。
def generate_health_signal(t, fs): """健康信号:啮合频率为主,附正常调制和二阶谐波""" m1, m2 = 0.05, 0.05 A1, A2 = 0.5, 0.15 x = (A1 * np.cos(2 * np.pi * f_m * t) * (1 + m1 * np.cos(2 * np.pi * f_sun_rel * t) + m2 * np.cos(2 * np.pi * f_c * t))) x += A2 * np.cos(2 * np.pi * 2 * f_m * t + 0.3) noise = np.random.default_rng(42).normal(0, 0.02, t.shape) return x + noise def generate_sun_fault_signal(t, fs): """太阳轮齿根裂纹故障信号:调制加深 + 周期性冲击串""" x = generate_health_signal(t, fs) # 调制加深部分 delta_mod = 0.22 * np.cos(2 * np.pi * f_m * t) * np.cos(2 * np.pi * f_sun_rel * t) x += delta_mod # 周期性冲击 A_imp = 0.35 beta = 600.0 f_res = 2700.0 period = 1.0 / f_sun_def t_start = np.arange(0, duration, period) for ts in t_start: tk = t - ts mask = (tk >= 0) & (tk < 0.05) # 冲击长度限制在 50ms x[mask] += (A_imp * np.exp(-beta * tk[mask]) * np.sin(2 * np.pi * f_res * tk[mask])) return x这里有个细节值得单独说:冲击衰减系数 β 取 600,意味着衰减到 1/e 的时间大约是 1.7 ms,对应结构共振 2700 Hz 振荡约 4~5 个周期。β 太大会让冲击几乎变成一个瞬时的窄脉冲,能量散到整个频带,包络谱里反而看不清;β 太小则冲击拖尾和相邻冲击重叠,模拟出来的就不是“故障冲击”而是“连续振动”了。
3.3 时频特征提取代码
有了信号之后,特征提取是整个诊断流程的核心。我从四个维度入手:时频谱能量分布、包络谱峰值、边带能量比和统计指标。这四者的侧重点不同,结合起来能互相印证。
STFT 采用 1024 点 Hann 窗、重叠 512 点。1024 点窗在 8192 Hz 采样率下对应 0.125 秒,频率分辨率约 8 Hz。要问为什么不是 256 点?窗太短时频率分辨率太粗,540 Hz 和另一根 640 Hz 的谱线可能叠在一起分不开;窗太长则时间分辨率变差,7.5 Hz 的调制周期跟不上。1024 点是个兼顾两者的折中。
def extract_stft_features(x, fs): """ 短时傅里叶变换,提取啮合频带及边带能量 返回时频谱矩阵、时间轴、频率轴 """ f, t_spec, Zxx = stft(x, fs=fs, nperseg=1024, noverlap=512, window='hann', detrend=False) spec_mag = np.abs(Zxx) # 计算啮合频带能量 band_mask = (f > f_m - 20) & (f < f_m + 20) mesh_energy = np.sum(spec_mag[band_mask, :], axis=0) # 计算左侧边带能量(f_m - 22.5 附近作为代表) sb_mask = (f > f_m - f_sun_rel - 5) & (f < f_m - f_sun_rel + 5) side_energy = np.sum(spec_mag[sb_mask, :], axis=0) return f, t_spec, spec_mag, mesh_energy, side_energy包络谱分析是行星齿轮箱故障诊断里必不可少的一环。原理不复杂:先对信号做 Hilbert 变换得到解析信号,取模得到包络,再对包络做 FFT。包络谱能把故障冲击的周期性从载波调制中分离出来。太阳轮故障特征频率 67.5 Hz 附近的突出峰值,就是断齿或裂纹的强证据。
def extract_envelope_spectrum(x, fs): """Hilbert 包络谱,提取结构共振带内的故障冲击特征""" analytic = hilbert(x) envelope = np.abs(analytic) # 对包络信号做 FFT,使用中值去趋势避免直流偏置 envelope = envelope - np.median(envelope) spec = np.abs(np.fft.rfft(envelope)) freqs = np.fft.rfftfreq(len(envelope), d=1/fs) return freqs, spec def extract_statistics(x): """RMS、峭度、峰值因子等统计特征""" rms = np.sqrt(np.mean(x**2)) kurt = (np.mean((x - np.mean(x))**4) / (np.std(x)**4 + 1e-12)) - 3 peak_factor = np.max(np.abs(x)) / (rms + 1e-12) return rms, kurt, peak_factor峭度这里我要专门提一下:我采用的是“超额峭度”,减去了 3,所以健康高斯信号的理论峭度接近 0,而不是 3。很多初学者在代码里看着峭度值 3 觉得“怎么这么高”,其实是对定义理解偏了。后面判别阈值我按超额峭度写。
边带能量比也能反映调制强度。健康的行星齿轮箱也会有边带,但边带能量相对载波能量很低;一旦某个齿轮发生局部损伤,边带能量会显著抬升。边带因子定义为故障调制边带能量与啮合载波能量的比值,这个系数对故障很敏感,但对转速波动相对不敏感。
def compute_sideband_factor(x, fs): """边带因子:f_m ± f_sun_rel 边带能量 / 啮合主频能量""" f, spec = extract_envelope_spectrum(x, fs) def band_energy(freqs, spec, center, half_width=3.0): mask = (freqs > center - half_width) & (freqs < center + half_width) return np.sum(spec[mask] ** 2) e_carrier = band_energy(f, spec, f_m) e_side_low = band_energy(f, spec, f_m - f_sun_rel) e_side_high = band_energy(f, spec, f_m + f_sun_rel) # 防止分母超小 return (e_side_low + e_side_high) / (e_carrier + 1e-12)3.4 故障判别与后处理
判别逻辑我不建议一上来就上神经网络。先从工程角度定一组可解释的阈值规则,把那些特征值离群明显的样本筛出来,再决定要不要用机器学习。下面这段代码实现了一个简单的“投票式”判别器:四个特征指标里每个都能独自给出“健康”或“故障”的初步判断,然后统计票数,超过两票判为故障。
def fault_decision(x, fs): """基于阈值投票的故障判别,返回决策标签和特征明细""" freqs, env_spec = extract_envelope_spectrum(x, fs) rms, kurt, peak_factor = extract_statistics(x) sb_factor = compute_sideband_factor(x, fs) # 在包络谱中定位太阳轮故障特征频率附近峰值 peak_zone = (freqs > f_sun_def - 2) & (freqs < f_sun_def + 2) zone_peak = np.max(env_spec[peak_zone]) if np.any(peak_zone) else 0.0 base_level = np.median(env_spec) + 3 * np.std(env_spec) env_ratio = zone_peak / (base_level + 1e-12) votes = 0 votes += 1 if kurt > 4.0 else 0 # 冲击特征明显 votes += 1 if sb_factor > 0.30 else 0 # 边带能量显著抬升 votes += 1 if env_ratio > 3.0 else 0 # 故障频率峰值高于背景 3 倍 votes += 1 if peak_factor > 8.0 else 0 # 峰值因子异常 label = "故障" if votes >= 2 else "健康" features = { "RMS": rms, "峭度": kurt, "峰值因子": peak_factor, "边带因子": sb_factor, "包络谱峰值比": env_ratio, "票数": votes } return label, features判别阈值不是凭空拍的。峭度 4.0 对健康齿轮箱常见的准高斯振动基本到不了,一旦出现来自断齿或裂纹的周期冲击,峭度会快速跳升到 6 以上;边带因子 0.30 是我对照多组健康模拟数据和轻度磨损模拟数据后的分界点;包络谱峰值比 3.0 作为“故障频率显著高于噪声背景”的经验界限,在不同采样率下都比较稳定。这些阈值在真实数据上可能需要用健康样本重新标定,但作为初筛逻辑已经足够。
完整跑通后的结果可视化也很重要。把健康信号和故障信号的时频谱、包络谱、特征数值画在同一张画布里,能很直观地看到故障信号在 540 Hz 附近的时频能量带明显变粗、亮度周期性闪烁,包络谱在 67.5 Hz 处出现尖峰。这一组图就是故障诊断报告的“实锤”。
import matplotlib.pyplot as plt def plot_diagnosis(health, fault, fs): fig, axes = plt.subplots(2, 2, figsize=(12, 7)) # 健康信号STFT f, t_spec, spec_h, _, _ = extract_stft_features(health, fs) axes[0,0].pcolormesh(t_spec, f, spec_h, shading='auto', cmap='jet') axes[0,0].set_title("健康信号 STFT") axes[0,0].set_ylabel("频率 (Hz)") # 故障信号STFT _, _, spec_f, _, _ = extract_stft_features(fault, fs) axes[0,1].pcolormesh(t_spec, f, spec_f, shading='auto', cmap='jet') axes[0,1].set_title("太阳轮故障 STFT") # 包络谱 freq_h, env_h = extract_envelope_spectrum(health, fs) freq_f, env_f = extract_envelope_spectrum(fault, fs) axes[1,0].plot(freq_h, env_h, alpha=0.7) axes[1,0].axvline(f_sun_def, color='red', ls='--') axes[1,0].set_title("健康信号包络谱") axes[1,1].plot(freq_f, env_f, alpha=0.7) axes[1,1].axvline(f_sun_def, color='red', ls='--') axes[1,1].set_title("太阳轮故障包络谱") plt.tight_layout() plt.savefig("output/diagnosis_result.png", dpi=150)到这里,一套从信号到决策的闭环已经完整了。运行 run_demo.py,你会在 output 目录下看到诊断图像和控制台打印的特征表,健康信号被正确判为“健康”,太阳轮故障信号被正确判为“故障”。用这个框架替换掉仿真信号生成部分,接入现场采集的加速度数据文件,就是一套能直接上线的故障初筛工具。
4. 实操中遇到的那些坑与排查速查表
4.1 参数选择:窗长、小波尺度、阈值怎么拍板
先聊 STFT 窗长。窗长反映的是频率分辨率和时间分辨率的“矛盾”:窗越长,频率越细,但时间越模糊,瞬时冲击事件会被抹平;窗越短,时间定位越准,但频率间隔小于一个频率分辨率半宽的两根谱线会分不开。工程上我一般按“最低特征频率至少要占 2 个频率分辨率格”来估算。这里特征频率是 7.5 Hz,所以至少需要 2/7.5≈0.267 秒的窗,也就是 2187 点,但那样就太长了。实操折衷是先用 1024 点窗看全局,如果 7.5 Hz 附近看不清楚,再单独对低频段做一次 4096 点窗的局部 STFT。
小波分析里面,连续小波变换的“尺度”对应频率。用 PyWavelets 做连续小波时,很多人直接套用默认尺度参数,结果高频段一片混沌、低频段又光秃秃的。我会把尺度范围换算成实际频率范围再设置:希望分析的频率范围是 100 到 3000 Hz,则让尺度覆盖 fs/3000 到 fs/100 的范围,同时要保证采样点数足以容纳最长的小波尺度,否则低频处全是边缘效应。
阈值设置也不能一劳永逸。不同齿轮箱的负载水平、安装刚度不同,健康状态下的峭度和边带因子基线可能差两三倍。建议先在设备正常运行阶段采集一批健康样本,把特征值的均值和标准差算出来,再用“均值 + 3 倍标准差”作为动态阈值,比直接套我代码里的经验阈值靠谱得多。
4.2 我踩过的几个坑
第一个坑是假冲击。刚开始做行星齿轮箱诊断的时候,我用包络谱看到某个特征频率处有一个很大的峰,果断报了断齿,结果拆机发现齿面完好,只是润滑油里有金属碎屑在齿面上滚动。这类假冲击的包络谱特征和真实故障非常像,唯一的区别是它会随机漂移,不会严格钉在故障频率上。现在我的处理是:连续取三段不同时间的信号做包络谱,特征峰位置和幅值在三段里保持一致的才列为可信判据。
第二个坑是共振频率对幅值的干扰。现场传感器安装位置和结构共振发生了变化,同一故障程度,在某台设备上包络谱峰值比达到 5,换一台安装刚度稍差的设备,变成 2.5。应对方法是不要只看绝对峰值,用峰值与邻近频带中位数的比值,相当于做了归一化,抗共振干扰能力明显强得多。
第三个坑是计算长数据段时的内存爆炸。有人把一整天的数据截取 10 万点出来做 STFT,发现内存占用暴涨。实际上 STFT 计算时矩阵是复数存储,点数和时间帧数乘积非常大。直观的办法是分段处理,每段 8192 点或者 16384 点,最后汇总特征趋势图。特征趋势图比单段诊断图像更有临床意义,可以看到故障特征从无到有的渐变过程。
4.3 常见问题排查速查表
下面这个速查表,我从实际项目里整理出来的高频问题,对应的解决思路也一并列出:
| 问题现象 | 可能原因 | 处理建议 |
|---|---|---|
| 包络谱在特征频率处没有峰,但时频谱有异常能量 | 故障频率计算使用了错误的转频或齿数 | 重新核对输入转速换算,确认是输入轴转频还是输出轴转频 |
| 时频谱上能量带连续变粗,但看不出周期性 | 窗太长导致时间分辨率不足 | 减小 noverlap 或 nperseg,提高时间分辨率 |
| 峭度极高但边带因子不高 | 冲击来自瞬时脉冲干扰而非齿轮故障 | 对比多段数据,检查冲击间隔是否等于特征频率倒数 |
| 特征频率峰值出现但附近很宽 | 转速不稳定导致频率拖尾 | 采用阶次跟踪或先对转速信号作同步重采样 |
| 故障信号和健康信号特征值重叠严重 | 阈值设置未按本机健康基线标定 | 采集健康样本重新计算均值与标准差,动态设阈值 |
| STFT低频段全是大亮点 | 边缘效应和窗函数泄漏 | 适当增加窗长,避开低频区域或用 CWT 替代 |
如果你正准备把这套流程用在自己的设备上,我最后再补一句经验:不要迷信“越复杂的算法越准”。行星齿轮箱诊断里,STFT 加包络谱这套基本功覆盖了八成以上的故障场景,剩下的复杂非平稳工况再用小波和 HHT 去打补丁。先把特征频率算得明明白白,把健康基线建起来,比什么高深模型都管用。我自己也是这么走过来的,一开始总想用更花哨的深度学习方法,后来发现把时频特征和物理机理对齐了,简单的阈值规则就已经很能打。希望这篇文章能帮你少走几步弯路,也欢迎你在实际数据上踩出异常后回来一起交流。