简介:本资源是一份面向机械工程、结构动力学及设备可靠性工程师的振动分析核心公式速查文档,聚焦故障诊断、试验设计与数据解读中的关键计算需求。全文系统梳理15个高频实用公式,覆盖激振力推导(F=(m₀+m₁+m₂)A)、加速度/速度/位移三参数换算(含ω=2πf角频率关联)、平滑交越点频率计算(加速度-速度/速度-位移/加速度-位移三类)、线性与对数扫频时长及速率控制(含倍频程n与扫描速率R关系),以及随机振动中PSD积分求均方根值(grms)、峰峰值位移估算(Xp-p=1067·√(wo/fo))等硬核内容。资源为单文件Word文档(.doc),体积精简仅103KB,便于嵌入报告、快速查阅或教学引用。目前已有236人学习下载,适合从事振动台试验、设备健康监测、NVH分析及可靠性验证的工程技术人员作为随身公式手册使用。
1. 振动分析中常用的计算公式:不是查表背诵,而是理解每个符号在真实传感器数据里怎么跳动
你手头有一台加速度传感器,采样率 25.6 kHz,测得一段轴承座振动信号,时域波形毛刺多、周期性弱,FFT 频谱上 320 Hz 附近有个鼓包但信噪比不到 6 dB——这时候翻《振动分析中常用的计算公式.doc》第 7 行的“位移-速度-加速度换算关系”,却卡在“ω 是角频率”这句上:ω 到底该取实测主频?还是理论转速对应频率?还是 FFT 峰值处插值结果?
这份文档真正价值,从来不是当字典查,而是帮工程师在原始时序数据、物理量纲、诊断逻辑三者之间快速建桥。它覆盖旋转机械故障初筛(如不平衡、不对中、滚动轴承缺陷)、结构模态粗估、隔振设计校核等高频场景,适合刚接手振动监测系统的现场工程师、做设备健康评估的算法支持人员,以及需要把仿真结果和实测对齐的结构动力学初学者。别被“公式”二字吓住——所有推导都可逆向验证,所有参数都有实测锚点,关键是你得知道哪个公式此刻正在你的 Python 脚本里悄悄决定报警阈值。
2. 从时域信号出发:位移、速度、加速度三者的微分/积分关系与工程化实现
振动传感器输出的原始数据,99% 是加速度(单位 m/s²),但故障特征可能藏在位移(μm)或速度(mm/s)频带里。直接套用理论微分/积分公式会因噪声放大而翻车,必须结合工程约束重写。
2.1 为什么不能直接对加速度信号求二重积分得位移?
理论公式:
$$ x(t) = \iint a(t),dt^2 $$
看似简单,但实测加速度信号含低频漂移(如温度致零点偏移)、工频干扰(50 Hz 及其谐波)、量化噪声。直接积分后,0.1 Hz 的漂移经两次积分会放大成 ~100× 的趋势项,完全淹没真实位移。某导师曾用某国产数采仪测电机振动,未去趋势直接积分,位移曲线像心电图一样缓慢爬升,误判为严重松动。
提示:所有积分运算前,必须先做高通滤波 + 趋势消除。截止频率选 2–5 Hz(取决于最低关注故障频率),非简单减均值——均值消除只对纯直流有效,对缓变漂移无效。
2.2 工程可用的加速度→速度→位移转换链
我们用scipy.signal构建抗噪链,以采样率fs=25600、加速度信号acc(numpy array)为例:
import numpy as np from scipy import signal def acc_to_vel(acc, fs, highpass_hz=3.0): """加速度转速度:带高通滤波的数值积分""" # 设计巴特沃斯高通滤波器(2阶,避免相位失真) sos = signal.butter(2, highpass_hz, 'hp', fs=fs, output='sos') acc_filtered = signal.sosfilt(sos, acc) # 梯形法积分:vel[i] = vel[i-1] + (acc_filtered[i] + acc_filtered[i-1]) * dt / 2 dt = 1.0 / fs vel = np.cumsum((acc_filtered[:-1] + acc_filtered[1:]) * dt / 2) vel = np.insert(vel, 0, 0.0) # 补零保证长度一致 return vel def vel_to_displ(vel, fs, highpass_hz=3.0): """速度转位移:同理高通+积分""" sos = signal.butter(2, highpass_hz, 'hp', fs=fs, output='sos') vel_filtered = signal.sosfilt(sos, vel) dt = 1.0 / fs displ = np.cumsum((vel_filtered[:-1] + vel_filtered[1:]) * dt / 2) displ = np.insert(displ, 0, 0.0) return displ # 使用示例 vel = acc_to_vel(acc, fs=25600, highpass_hz=3.0) displ = vel_to_displ(vel, fs=25600, highpass_hz=3.0)参数说明:
highpass_hz=3.0:这是经验值。若关注 10 Hz 以上故障(如滚动体缺陷),可设 5 Hz;若需保留 1–2 Hz 的轴向窜动,则必须 ≤2 Hz,此时需额外做基线校正。sos(second-order sections):比butter(..., output='ba')更稳定,避免高阶滤波器系数溢出。- 积分用梯形法而非矩形法:精度提升一阶,对高频成分更友好。
验证方法:对已知正弦加速度信号a(t)=A·cos(ωt),理论速度应为v(t)=A/ω·sin(ωt)。代入代码,检查np.max(np.abs(vel - A/omega*np.sin(omega*t))) < 1e-3*A是否成立。
3. 频域核心公式落地:FFT 幅值、功率谱密度、包络谱的物理量纲与缩放规则
时域转换只是起点,振动诊断真正发力在频域。但 FFT 输出的“幅值”到底代表什么?为什么同一段数据,用 MATLABpwelch和 Pythonscipy.signal.welch算出的 PSD 数值差 10 倍?根源全在公式背后的量纲缩放。
3.1 加速度信号 FFT 幅值的正确解读
对 N 点实信号acc,np.fft.rfft(acc)输出复数数组X,其幅值|X[k]|不是物理加速度幅值,需按以下步骤还原:
def acc_fft_physical(acc, fs): N = len(acc) X = np.fft.rfft(acc) freqs = np.fft.rfftfreq(N, 1/fs) # 1. 单边谱缩放:除以 N 得真实幅值(单位 m/s²) # 注意:rfft 默认输出单边谱(含 DC 和 Nyquist),需乘 2 除 N amp_physical = np.abs(X) * 2 / N amp_physical[0] /= 2 # DC 分量不乘 2 if N % 2 == 0: amp_physical[-1] /= 2 # Nyquist 分量不乘 2 return freqs, amp_physical freqs, amp = acc_fft_physical(acc, fs=25600)关键点:
*2/N是核心缩放因子。不除 N,幅值随采样点数线性增长;不乘 2,单边谱丢失一半能量。amp_physical[k]单位是 m/s²,表示该频率点对应正弦分量的峰值加速度(不是 RMS!)。若需 RMS,再除 √2。- 若传感器灵敏度为 100 mV/g,需先将电压信号转为 m/s²:
acc = voltage * 9.81 * 10(因 1 g = 9.81 m/s²,100 mV/g → 1 V 对应 10 g)。
3.2 功率谱密度(PSD)的工程计算:为什么welch参数不能乱设?
PSD 单位是 (m/s²)²/Hz,反映单位频带内的功率。scipy.signal.welch的nperseg(每段点数)和noverlap(重叠点数)直接影响分辨率与方差:
from scipy.signal import welch f_psd, psd = welch( acc, fs=fs, nperseg=4096, # 关键!决定频率分辨率 Δf = fs/nperseg = 6.25 Hz noverlap=2048, # 50% 重叠,提升统计稳定性 window='hann', # 汉宁窗抑制频谱泄漏 scaling='density' # 必须设为 'density' 才得 PSD,非 'spectrum' )参数选择逻辑:
nperseg=4096:平衡分辨率(Δf=6.25 Hz)与频谱平滑度。若关注 100 Hz 内故障(如轴承外圈缺陷),Δf < 5 Hz 更佳,可设nperseg=8192(Δf=3.125 Hz),但需保证信号时长 ≥0.3 s。scaling='density':这是 PSD 的定义要求。若误用'spectrum',输出单位变成 (m/s²)²,完全错误。window='hann':比矩形窗泄漏小 30 dB,对非整周期截断信号至关重要。
3.3 包络谱(Envelope Spectrum):解调轴承故障的钥匙公式
滚动轴承缺陷频率(BPFO/BPFI/BSF/FTF)常被载波淹没在高频噪声中。包络谱通过 Hilbert 变换提取幅值包络,再对其 FFT:
$$ \text{Envelope}(t) = \left| \mathcal{H}{a(t)} \right|, \quad \text{ES}(f) = \left| \text{FFT}{\text{Envelope}(t)} \right| $$
from scipy.signal import hilbert def bearing_envelope_spectrum(acc, fs, band_low=3000, band_high=8000, nperseg=4096): # 1. 带通滤波:聚焦缺陷敏感频带(如 3–8 kHz) sos_bp = signal.butter(4, [band_low, band_high], 'bandpass', fs=fs, output='sos') acc_bp = signal.sosfilt(sos_bp, acc) # 2. Hilbert 变换取包络 analytic = hilbert(acc_bp) envelope = np.abs(analytic) # 3. 包络信号的 FFT(注意:此处用物理幅值缩放) f_env, amp_env = acc_fft_physical(envelope, fs) return f_env, amp_env f_env, amp_env = bearing_envelope_spectrum(acc, fs=25600)为什么带通滤波中心频段必须人工设定?
因为轴承几何参数(节径、滚子数、接触角)决定理论缺陷频率,但实际安装间隙、润滑状态会使载波频带偏移。某模拟项目 X 中,理论 BPFO=245 Hz,但实测载波集中在 5.2 kHz,若滤波设 2–4 kHz 就漏掉全部特征。
4. 振动烈度与故障判据公式:ISO 10816 和 GB/T 2298 的工程折中
有了频谱,下一步是判断“是否超标”。ISO 10816-3(工业机器)和 GB/T 2298(机械振动术语)给出速度有效值(RMS)判据,但直接套用会误报——因为标准基于稳态、无冲击的理想工况。
4.1 速度有效值(RMS)的正确计算路径
不能对原始加速度直接 RMS!必须先转速度,再求 RMS:
def velocity_rms_from_acc(acc, fs): # 步骤1:加速度→速度(高通滤波+积分) vel = acc_to_vel(acc, fs, highpass_hz=1.0) # 低频截止放宽至 1 Hz # 步骤2:速度信号 RMS(注意:是速度的 RMS,不是加速度的) vel_rms = np.sqrt(np.mean(vel**2)) # 单位 mm/s(若 acc 单位 m/s²,则 vel 单位 m/s,需 *1000) return vel_rms * 1000 # 转为 mm/s,匹配 ISO 标准单位 vel_rms_mm_s = velocity_rms_from_acc(acc, fs=25600)ISO 10816-3 典型阈值(mm/s RMS):
| 机器类型 | 10–1000 Hz 速度 RMS(mm/s) |
|---|---|
| 小型刚性机器 | ≤2.8(良好) |
| 大型刚性机器 | ≤4.5(良好) |
| 有柔性基础机器 | ≤7.1(良好) |
注意:此 RMS 必须在机器额定转速下、稳定运行 30 秒以上采集。某公司产线电机在启停瞬间 RMS 达 12 mm/s,但稳态仅 3.2 mm/s,按瞬时值误停机。
4.2 冲击性故障的补充判据:峭度(Kurtosis)与脉冲因子(Impulse Factor)
对于早期轴承剥落、齿轮点蚀等冲击故障,RMS 不敏感。此时用无量纲指标:
峭度(Kurtosis):
$$ K = \frac{1}{N}\sum_{i=1}^{N} \left( \frac{x_i - \bar{x}}{\sigma_x} \right)^4 $$
正常轴承信号 K≈3;K>6 预示冲击;K>10 强烈冲击。但注意:传感器过载、电气干扰也会抬高 K 值。脉冲因子(Impulse Factor):
$$ IF = \frac{\max(|x_i|)}{\text{RMS}(x)} $$
正常值 1–2;>3.5 需警惕。
def vibration_impulse_metrics(acc): acc_abs = np.abs(acc) peak = np.max(acc_abs) rms = np.sqrt(np.mean(acc**2)) kurtosis = pd.Series(acc).kurtosis() # 或用 scipy.stats.kurtosis impulse_factor = peak / rms return kurtosis, impulse_factor k, ifac = vibration_impulse_metrics(acc)血泪经验:某次现场发现 K=8.2,但检查发现是传感器电缆接触不良导致周期性尖峰,非机械故障。因此,K 和 IF 必须与时域波形、包络谱联合看——若尖峰在时域随机分布且包络谱无周期性,大概率是电气问题。
5. 避坑指南:振动公式应用中 5 个高频翻车点与现场排查口诀
振动分析不是数学考试,公式套错一步,诊断结论全盘作废。以下是某跨平台系统部署中踩过的 5 个真实坑,按“现象→原因→解决”列明,每条都配可执行命令或检查点。
5.1 现象:FFT 频谱在 0 Hz 处出现巨大尖峰,掩盖所有低频特征
原因:加速度信号含显著直流偏置(传感器零点漂移或数采仪 offset),未做高通滤波直接 FFT。
解决:
- 用
scipy.signal.detrend(acc, type='linear')去线性趋势; - 更可靠:
acc_centered = acc - np.mean(acc[0:1000])(取前 1000 点基线); - 终极方案:硬件端启用传感器 IEPE 恒流源的 AC 耦合模式。
5.2 现象:包络谱上出现等间隔杂散峰,间隔恰为采样率的整数分之一(如 25.6 kHz / 100 = 256 Hz)
原因:Hilbert 变换对带通滤波后的信号要求严格——若滤波器相位非线性,解析信号产生虚假调制。
解决:
- 改用
scipy.signal.firwin设计线性相位 FIR 带通滤波器(非 butter); - 或直接用
scipy.signal.hilbert前,先signal.resample(acc, len(acc)*2)过采样,降低混叠风险。
5.3 现象:同一台电机,上午测 RMS=3.1 mm/s,下午测 RMS=5.8 mm/s,但轴承温度、电流均正常
原因:数采仪输入量程切换错误。上午用 10 V 量程(对应 ±100 g),下午误切为 1 V 量程(±10 g),导致信号削波,RMS 虚高。
解决:
- 检查数采仪配置:
cat /sys/devices/.../range(Linux 下)或读取设备寄存器; - 时域波形观察:削波时波形顶部/底部变平,
np.sum(acc > 0.9*np.max(acc)) > 10即告警。
5.4 现象:理论不平衡故障频率(1× RPM)在频谱上找不到,但 2×、3× RPM 明显
原因:转速测量不准。编码器信号受油污干扰,或磁性传感器安装间隙过大,导致 RPM 计算偏差 >5%。
解决:
- 不依赖编码器,用频谱峰值搜索:
f_peak = freqs[np.argmax(psd[10:200])](限 10–200 Hz); - 用
scipy.signal.find_peaks(psd, distance=50)找基频及谐波,验证是否满足f2/f1 ≈ 2.0。
5.5 现象:更换同型号传感器后,相同工况下速度 RMS 值相差 30%
原因:传感器灵敏度公差(典型 ±5%)叠加数采仪增益误差(±2%),累积误差达 ±7%,但用户未做标定。
解决:
- 每支传感器出厂标定证书必须录入系统;
- 现场用振动校准仪(如 B&K 4294)做单点标定:
acc_cal = voltage_measured * sensitivity_certified; - 在软件中设置通道增益补偿:
acc_corrected = acc_raw * (sensitivity_nominal / sensitivity_actual)。
6. 进阶技巧:用公式反推传感器选型与采样参数——让诊断逻辑驱动硬件配置
很多工程师把振动分析当成“软件事后处理”,其实公式本身就在告诉你硬件该怎么配。比如,要可靠捕获滚动体缺陷(BSF),先看它的理论频率范围,再倒推采样率与带宽。
6.1 从故障频率反推最低采样率:奈奎斯特不是终点,是起点
轴承 BSF 公式:
$$ \text{BSF} = \frac{N_b}{2} f_r \left(1 - \frac{d}{D}\cos\alpha \right) $$
其中 $N_b$ 为滚子数,$f_r$ 为转速(Hz),$d$ 为滚子直径,$D$ 为节径,$\alpha$ 为接触角。
某模拟项目 X 中,电机转速 2980 rpm($f_r=49.7$ Hz),$N_b=11$,$d/D=0.2$,$\alpha=0^\circ$,算得 BSF ≈ 273 Hz。
但BSF 不是载波频率!实际缺陷冲击激发的是 3–8 kHz 高频共振。要捕获其包络,需满足:
- 采样率 $f_s$:必须 ≥ 2 × 载波上限(如 8 kHz → $f_s≥16$ kHz),但为留余量,选 25.6 kHz(常见工业数采仪档位);
- 抗混叠滤波器截止频率:设为 $f_s/2.56 = 10$ kHz,确保 8 kHz 以上噪声被压制;
- FFT 分辨率:若需区分 BSF(273 Hz)与邻近的 2×BSF(546 Hz),要求 Δf < 100 Hz → $N > f_s / \Delta f = 25600/100 = 256$ 点,实际取 4096 点(Δf=6.25 Hz)。
6.2 用 RMS 公式预估传感器量程:避免削波与信噪比双输
假设目标检测最小故障对应速度 RMS=0.5 mm/s,载波频带 5 kHz,Q 值(品质因数)约 10,则加速度 RMS 为:
$$ a_{\text{rms}} = 2\pi f \cdot v_{\text{rms}} \cdot Q = 2\pi \times 5000 \times 0.0005 \times 10 \approx 157 , \text{m/s}^2 \approx 16 , g $$
因此传感器量程至少选 ±20 g(留 25% 余量),灵敏度选 100 mV/g(输出电压 2 V,适配多数数采仪 10 V 量程)。
6.3 一个硬核验证技巧:用白噪声注入测试整个链路的量纲保真度
生成已知 PSD 的白噪声(单位 (m/s²)²/Hz),走完整流程:
- 白噪声 → 加速度信号
acc_white; acc_white→ 速度 → 位移;- 对速度信号求 RMS,应严格等于理论值
sqrt(PSD * bandwidth)。
# 生成白噪声(PSD = 1e-6 (m/s²)²/Hz,带宽 10 kHz) np.random.seed(42) n_points = 2**16 fs = 25600 psd_target = 1e-6 acc_white = np.random.normal(0, np.sqrt(psd_target * fs), n_points) # 走完整流程 vel_white = acc_to_vel(acc_white, fs, highpass_hz=1.0) vel_rms_calc = np.sqrt(np.mean(vel_white**2)) * 1000 # mm/s # 理论值:sqrt(PSD * BW) * 1000 = sqrt(1e-6 * 10000) * 1000 ≈ 100 mm/s print(f"实测速度 RMS: {vel_rms_calc:.1f} mm/s") # 应在 95–105 mm/s 间若偏差 >10%,说明积分链或滤波器存在系统性增益误差,需校准。这个测试我坚持在每次新部署数采系统时做,它比任何说明书都可靠——毕竟,公式不会说谎,但人会忽略量纲。
希望帮到你。
本文还有配套的精品资源,点击获取