
1. 轴承故障信号仿真概述在工业设备维护领域轴承故障诊断一直是关键课题。据统计约40%的旋转机械故障与轴承相关。传统诊断方法依赖现场采集的真实故障信号但这种方式存在成本高、周期长且难以获取特定故障样本的局限。通过Python仿真轴承故障信号我们可以快速生成各类典型故障的模拟数据为算法验证和诊断方法研究提供高效工具。这个仿真系统实现了三大核心功能支持内圈、外圈和滚动体三种典型故障类型的信号生成可调节信噪比模拟不同工况环境自动计算并展示故障特征频率及其谐波2. 故障机理与频率计算原理2.1 轴承结构参数定义典型滚动轴承由内圈、外圈、滚动体和保持架组成。仿真需要以下关键参数轴转速n转/秒滚动体直径d米节圆直径D米接触角α弧度注意接触角指滚动体与滚道接触点的法线与轴承径向平面的夹角常见值为0°深沟球轴承或15-25°角接触轴承2.2 故障频率计算公式推导不同部位的缺陷会产生特定频率的周期性冲击其计算公式如下2.2.1 内圈故障频率(FTF)[ f_i \frac{n}{2}\left(1 \frac{d}{D}\cos\alpha\right) ]当内圈存在缺陷时每个滚动体经过缺陷点都会产生冲击。由于内圈随轴旋转缺陷位置会周期性接近和远离载荷区导致振幅调制现象。2.2.2 外圈故障频率(BPF)[ f_o \frac{n}{2}\left(1 - \frac{d}{D}\cos\alpha\right) ]外圈固定时缺陷产生的冲击频率相对稳定。实际诊断中外圈故障信号通常包含丰富的谐波成分。2.2.3 滚动体故障频率(BSF)[ f_b \frac{D}{d}\left[1 - \left(\frac{d}{D}\cos\alpha\right)^2\right]\frac{n}{2} ]滚动体缺陷会产生双重调制效应既随保持架公转又存在自转运动。其故障特征频率通常较低。3. Python仿真实现详解3.1 核心代码架构import numpy as np import matplotlib.pyplot as plt from scipy.signal import hilbert3.1.1 参数初始化模块# 轴承几何参数 n 10 # 转速 (Hz) d 0.01 # 滚动体直径 (m) D 0.1 # 节圆直径 (m) alpha np.pi/4 # 接触角 (rad) # 信号参数 fs 10000 # 采样率 (推荐≥10倍最高故障频率) duration 1 # 信号时长 (s)工程经验采样率应满足Nyquist定理通常取故障频率的10倍以上。对于高速轴承可能需要50kHz以上的采样率。3.1.2 故障频率计算函数def calc_fault_freq(fault_type): if fault_type inner: return (n/2) * (1 (d/D)*np.cos(alpha)) elif fault_type outer: return (n/2) * (1 - (d/D)*np.cos(alpha)) elif fault_type ball: return (D/d) * (1 - ((d/D)*np.cos(alpha))**2) * (n/2) else: raise ValueError(故障类型必须是 inner, outer 或 ball)3.2 信号生成与噪声控制3.2.1 基带信号生成def generate_base_signal(fault_freq, fs, duration): t np.linspace(0, duration, int(fs*duration), endpointFalse) # 冲击信号模型 impact np.exp(-50*t) * np.sin(2*np.pi*5000*t) impact impact[:100] # 截取单个冲击 # 周期性冲击序列 period int(fs/fault_freq) signal np.zeros_like(t) for i in range(0, len(signal), period): signal[i:ilen(impact)] impact return t, signal3.2.2 噪声添加与SNR控制def add_noise(signal, target_snr): # 计算信号功率 sig_power np.mean(signal**2) # 根据SNR计算噪声功率 noise_power sig_power / (10**(target_snr/10)) # 生成高斯白噪声 noise np.random.normal(0, np.sqrt(noise_power), len(signal)) return signal noise3.3 包络分析实现def compute_envelope(signal): analytic_signal hilbert(signal) envelope np.abs(analytic_signal) return envelope def compute_spectrum(signal, fs): n len(signal) freq np.fft.fftfreq(n, 1/fs)[:n//2] spectrum np.abs(np.fft.fft(signal))[:n//2] * 2/n return freq, spectrum4. 完整仿真流程与可视化4.1 主程序流程# 用户输入 fault_type input(输入故障类型 (inner/outer/ball): ) snr float(input(输入目标SNR (dB): )) # 计算故障频率 fault_freq calc_fault_freq(fault_type) # 生成信号 t, clean_signal generate_base_signal(fault_freq, fs, duration) noisy_signal add_noise(clean_signal, snr) # 包络分析 envelope compute_envelope(noisy_signal) freq_env, spec_env compute_spectrum(envelope, fs) freq_raw, spec_raw compute_spectrum(noisy_signal, fs)4.2 结果可视化plt.figure(figsize(12, 8)) # 时域信号 plt.subplot(3, 1, 1) plt.plot(t, noisy_signal) plt.title(f{fault_type} Fault Time Domain (SNR{snr}dB)) plt.xlabel(Time (s)) plt.ylabel(Amplitude) # 频谱 plt.subplot(3, 1, 2) plt.plot(freq_raw, spec_raw) plt.xlim(0, 1000) plt.title(Raw Spectrum) plt.xlabel(Frequency (Hz)) plt.ylabel(Magnitude) # 包络谱 plt.subplot(3, 1, 3) plt.plot(freq_env, spec_env) plt.xlim(0, 500) plt.title(Envelope Spectrum) plt.xlabel(Frequency (Hz)) plt.ylabel(Magnitude) plt.tight_layout() plt.show()5. 工程实践要点与问题排查5.1 参数选择经验采样率设置最低要求fs 2×最高感兴趣频率推荐值fs ≥ 10×fault_freq过高的采样率会导致计算量剧增SNR选择指南实验室环境30-50dB工业现场10-20dB极端工况10dB信号时长建议至少包含10个故障周期推荐duration ≥ 10/fault_freq5.2 常见问题排查现象可能原因解决方案包络谱无峰值SNR过低提高SNR或增加平均次数频谱出现混叠采样率不足提高采样率或加抗混叠滤波器频率偏移参数计算错误检查几何参数单位一致性谐波不明显冲击模型太简单改用更复杂的冲击响应模型5.3 高级改进方向更真实的冲击模型def advanced_impact_model(t): return np.exp(-100*t) * (np.sin(2*np.pi*8000*t) 0.5*np.sin(2*np.pi*12000*t))转速波动模拟def add_speed_variation(t, base_freq): freq_mod base_freq * (1 0.1*np.sin(2*np.pi*0.5*t)) return np.sin(2*np.pi*np.cumsum(freq_mod)/fs)共振频带选择def bandpass_filter(signal, fs, lowcut, highcut): nyq 0.5 * fs b, a butter(4, [lowcut/nyq, highcut/nyq], btypeband) return filtfilt(b, a, signal)在实际轴承诊断项目中我们通常会结合多个频带的分析结果。比如某风电轴承案例中通过比较1-3kHz和5-8kHz两个共振频带的包络谱发现外圈故障特征在5-8kHz频带更加明显。这种多频段分析的方法可以有效提高诊断准确率。