振动信号处理:加速度、速度与位移互转的工程实践指南

振动信号处理:加速度、速度与位移互转的工程实践指南 简介这是一份面向信号处理、数据分析与工程测试学习者的 Matlab 实用代码包围绕位移、速度、加速度三种物理量之间的微分与积分转换提供了可直接运行的脚本与配套示例数据。包内含 3 个 m 文件和 1 个 mat 数据文件涵盖角位移与角速度互转、正弦信号模拟、加速度与速度转换等典型场景整体压缩包约 23KB结构精简轻量。目前已有 6115 人学习下载。借助 iomega、test_sin、a_v 等脚本读者可以动手实践 diff 求导、cumsum 累积积分、filter 数字滤波等核心操作了解从信号生成、数据读取、预处理、转换到结果绘图验证的完整流程配套的 mat 数据文件便于直接加载样本数据用于验证转换结果或替换为自己的实测信号。如果你是刚接触 Matlab 信号处理、想弄清位移/速度/加速度换算关系的学习者这套小代码包能提供直观的入门参照。 做振动测试、结构健康监测或者设备状态检测的朋友八成都会遇到一个尴尬场景手里明明只有加速度计的数据可现场甲方想看的却是速度有效值或位移峰峰值。反过来也常见——只装了位移传感器却要评估振动烈度。这种位移、速度、加速度信号互转的需求在工程里太普遍了。我在做桥梁模态测试、旋转机械振动分析和车辆零部件耐久验证时几乎每个项目都要处理一轮这个转换。先说结论信号互转本身并不高深高深的是怎么转得准、转得稳。理论上看加速度积分一次得到速度积分两次得到位移位移微分一次得到速度微分两次得到加速度。但实测数据不是教科书里的理想波形——噪声、直流偏置、趋势项、零点漂移哪个处理不当都会让结果面目全非。这篇文章把我这些年实际用过的互转方法、踩过的坑、选型思路一次讲清楚适合正在做振动信号处理、传感器数据回放、仿真与实测结果对比的朋友参考。1. 物理基础从单位换算到信号本质1.1 三种信号之间的数学关系位移x(t)、速度v(t)、加速度a(t)三者之间是严格的时间导数与积分关系v(t) dx/dta(t) dv/dt d²x/dt²反过来v(t) ∫a(t)dtx(t) ∫v(t)dt ∫∫a(t)dtdt这个式子大学物理就学过但工程上容易被忽略的是它在频域里的含义。对于一个简谐振动 x(t) X·sin(2πft)速度幅值等于 X·(2πf)加速度幅值等于 X·(2πf)²。也就是说同一段振动里高频成分在加速度信号中占比非常大在位移信号中占比非常小。这个特点直接决定了互转方向的选择从加速度积分到位移时高频噪声会被大幅抑制积分两次相当于把高频做了两次低通衰减反过来从位移微分到加速度时高频噪声会被急剧放大。理解了这一点你就明白为什么微分的处理难度远大于积分也就能预判噪声最可能在哪个环节冒出来。还有一个基础问题单位换算。加速度传感器常见输出单位是 g 或 m/s²振动速度常用 mm/s位移常用 mm 或 μm。做互转前先把单位统一成同一套量纲体系否则结果很容易差出几个数量级。我习惯统一用 m、m/s、m/s² 做计算最后输出时再按展示需要转成 mm 或 mm/s。1.2 时域变换还是频域变换两条路线的选择信号互转有两条技术路线时域法和频域法。时域法最直观。积分就是累加v[n] v[n-1] a[n]·Δt微分就是差分v[n] (x[n1] - x[n-1]) / (2Δt)。这种方法的优势是实时性好、计算量小适合单片机、PLC这种嵌入式环境或在线监测系统。缺点是积分漂移严重、微分噪声大需要配合滤波器小心使用。频域法的思路完全不同。先把整段信号做FFT变换到频域在频域里完成积分或微分运算——积分就是除以 j2πf微分就是乘以 j2πf——然后再IFFT变换回时域。这个方法的优势是可以在频域里精准地切除无效频带比如把直流分量和超低频趋势项直接置零从根本上避免积分漂移。代价是需要整段数据参与运算实时性差只能做离线分析。怎么选我的经验是三条判断标准第一有没有实时性要求在线监测系统被迫用修正时域法离线分析一律用频域法第二信号的频带是否明确、噪声底是否可控频带越清晰越适合频域法第三现场数据里有没有明显的趋势项和直流偏置只要有频域法大概率更省事。2. 核心算法实现数值微分的坑与数值积分的漂移2.1 数值微分简单但放大噪声数值微分是三种互转里最容易出问题的操作。很多新手拿过位移数据直接 diff(y)/diff(t)结果得到的速度信号全是毛刺根本没法用。原因是微分在频域等效为乘以 jω相当于每倍频程 6dB 的高频提升。实测位移信号里只要有一丁点高频噪声微分一次就会被放大成主导成分。改进措施有几个层次。第一用中心差分代替前向差分误差从 O(Δt) 降到 O(Δt²)。第二微分前先做低通滤波截止频率根据信号频带确定比如分析 0~100Hz 的设备振动就设 120Hz 左右的低通。第三用 Savitzky-Golay 滤波器直接求导它相当于在滑动窗口内做多项式拟合再求解析导数同时完成平滑和微分工程上非常实用。import numpy as np from scipy.signal import savgol_filter # x: 位移信号, fs: 采样率 dt 1.0 / fs # 方法1中心差分 v np.zeros_like(x) v[1:-1] (x[2:] - x[:-2]) / (2 * dt) # 方法2Savitzky-Golay 直接求导窗口长度取奇数 v_sg savgol_filter(x, window_length15, polyorder3, deriv1, deltadt)实际项目里我默认用 SG 滤波加微分窗口长度根据采样率调节。采样率 1kHz 时窗口取 11~21 比较合适窗口太短平滑效果差窗口太长会削平真实的峰值。这个需要现场试几组参数对比一下。2.2 数值积分消除趋势项与积分漂移积分在频域等效为除以 jω低频成分被极度放大。这个特性导致两个典型问题直流偏置积一次变成线性趋势再积一次变成二次趋势随机低频漂移也会随着积分次数快速膨胀。解决积分漂移的手段按重要程度排序积分前先去均值把直流分量清零这一步不做后面全白搭积分前做高通滤波把不需要的低频成分直接滤掉截止频率通常设为 0.5~1Hz积分完成后做去趋势detrend处理用一次或二次多项式拟合趋势项并减掉如果只关心稳态振动可以积分后再做带通滤波from scipy.integrate import cumtrapz # a: 加速度信号, t: 时间向量, fs: 采样率 # 第一步去均值 a_detrended a - np.mean(a) # 第二步时域积分 v cumtrapz(a_detrended, t, initial0) # 第三步去线性趋势 from numpy.polynomial import polynomial as P coeffs np.polyfit(t, v, 1) v_corrected v - np.polyval(coeffs, t) # 若继续积分到位移对 v_corrected 重复以上步骤时域积分计算量小、实时性好但确实每一步都要手动处理趋势。对于实时性和精度要求不太高的场合——比如车载控制器里算个粗略速度——这个方案足够。2.3 频域积分工程上的更优解频域积分的思路很清晰整段信号 FFT 后在频域对每个频率分量除以 j2πf再把 f0 的分量单独处理然后 IFFT 还原。这种方法天然规避了时域积分的漂移问题因为可以在频域直接设一个低频截止把低于某个频率的成分全部置零。这等效于同时完成了高速滤波和积分一举两得。实现时有几个关键细节必须注意第一频率分辨率 Δf fs/N。频域里能分辨的最低频率就是 Δf如果想保留 0.1Hz 的振动成分采集时长至少要 10 秒否则 0.1Hz 和直流根本分不开。第二f0 处必须单独置零否则除法会得到无穷大。这个操作同时也去掉了直流分量。第三加窗问题。FFT 之前建议加 Hanning 窗抑制频谱泄漏但加了窗之后IFFT 得到的时域波形幅值会比真实值小需要按窗函数的相干增益做幅值修正。Hanning 窗的幅值修正系数约为 2。如果直接用原始数据做整段 FFT不加窗则要注意首尾的端点效应。import numpy as np def freq_integrate(signal, fs, low_cutNone, windowhann): n len(signal) if window hann: w np.hanning(n) signal_w signal * w else: w np.ones(n) signal_w signal f np.fft.rfftfreq(n, 1/fs) X np.fft.rfft(signal_w) if low_cut is not None: X[f low_cut] 0 with np.errstate(divideignore, invalidignore): Y X / (2j * np.pi * f) Y[f 0] 0 y np.fft.irfft(Y, n) # 窗函数幅值修正除以窗的均值 y y / np.mean(w) return y需要注意代码里的窗函数修正方式是对整段信号做统一缩放。由于窗函数在两端衰减到接近零IFFT 后的首尾段数据本身会偏离真实值工程上常用的方法是保留中间 70% 的数据丢弃两端。如果数据很长也可以分段重叠处理每段只取中间部分拼接。3. 实操过程从加速度到速度再到位移的完整流程3.1 采样参数设置与预处理做信号互转之前先确认采样参数是不是合理。采样率至少要覆盖目标频带的 5 到 10 倍。比如要做 0.1Hz 到 100Hz 的桥梁振动分析采样率至少要 500Hz稳妥起见取 1kHz。采集时长直接决定频率分辨率想看 0.1Hz 的成分单次采集至少要 10 秒我一般习惯采到目标最低频率的 10 倍周期以上也就是至少 100 秒保证频谱足够平滑。传感器标定参数也要提前检查。加速度计灵敏度常见为 100mV/g 或 10mV/(m/s²)对应关系是 1g 9.80665 m/s²。采集系统最终输出的物理量如果是 m/s²就直接用如果是 mV需要先除以灵敏度换算出物理单位。我之前遇到过同事直接把传感器原始电压当成加速度值做频域积分结果位移幅值差了整整一个数量级。预处理的标准流程是去直流、去趋势、抗混叠滤波、按需带通滤波。去直流是必须的不然直流分量在频域积分时会产生一条斜率很大的时域趋势线。带通滤波的上下限根据目标频带设置比如只关心 1~50Hz 的振动就设 0.5Hz 高通和 55Hz 低通。3.2 频域积分法的逐步实现下面给出一个从加速度到位移的完整频域积分流程可以直接作为模板使用读入加速度数据 a(t)确认采样率 fs 和物理单位m/s²去均值a a - mean(a)去趋势对 a 做一次线性拟合并减掉消除传感器零漂加 Hanning 窗做 FFT频域积分一次得到速度谱再积分一次得到位移谱对低于低频截止频率的分量置零我常用 0.5Hz 或 1Hz具体根据目标信号最低频率定IFFT 还原做窗函数幅值修正丢弃首尾各 15% 的数据用参考传感器或手工计算验证峰值和有效值低频截止的选择没有统一标准本质上要平衡两个风险截止设得高会把真实的超低频成分切掉导致波形失真截止设得低残留的低频漂移又会污染结果。我的经验是先看原始加速度信号的频谱图找到噪声底开始抬升的频率点把截止设在噪声底之上、目标频带最低频率之下。如果这个区间不存在说明这个工况根本不适合做互转得换传感器方案。3.3 案例用加速度计数据还原位移波形说一个实际案例。某次做电机基座振动测试现场只有 IEPE 加速度计采样率 1024Hz采集时长 20 秒但客户要求出位移峰峰值报告。原始加速度信号主频是 10Hz 的旋转激励及其谐波峰值约 0.2g换算下来约 1.96 m/s²。按照上面的流程处理先去均值去趋势加 Hanning 窗做 FFT频域积分两次得到位移谱低频截止设 1HzIFFT 还原。得到的位移波形主频仍是 10Hz峰峰值约 0.98mm。这个结果能不能信可以用简谐振动公式交叉验证单频 10Hz 正弦振动的位移幅值 X a_peak / (2πf)² 1.96 / (2π×10)² ≈ 0.497mm峰峰值就是约 0.99mm和频域积分结果基本一致。这个对照验证方法在现场非常实用不需要额外设备就能大致判断转换结果是否合理。还有一次是桥梁拉索振动测试关注频率低到 0.3Hz 左右加速度传感器数据做频域积分还原位移低频截止只能设到 0.15Hz。这时采集时长就变得很关键我用了 60 秒数据保证 0.15Hz 对应的频率分辨率足够。最终还原的位移波形和现场的激光位移计对比误差在 3% 以内说明频域积分法在低频场景下也能用。4. 工程应用中的常见问题与排查技巧4.1 常见问题速查表把这些年遇到的典型问题整理成一张速查表方便现场排查现象可能原因解决办法积分后波形直线上升直流偏置或零漂未被清除积分前先去均值积分后去趋势频域法直接置零直流分量微分后噪声巨大高频噪声被微分放大先低通滤波再做微分或改用 SG 滤波求导波形两端严重上翘端点效应或频谱泄漏加窗丢弃两端 10%~15% 数据或分段重叠处理幅值系统性偏小窗函数幅值修正未做按窗函数相干增益修正Hanning 窗约乘 2积分结果有相位偏移数值积分或滤波器引入相位滞后检查滤波器的相位响应需要时用零相位滤波 filtfilt傅里叶变换后低频有异常突起趋势项未完全去除积分前先做 detrend再做 FFT4.2 工具链选择与场景落地不同工具做信号互转思路一样操作细节不同按场景选型可以少走弯路。Python 生态最灵活。核心是 numpy 和 scipyFFT 用 scipy.fft 或 numpy.fft滤波用 scipy.signal.butter filtfiltSG 滤波用 scipy.signal.savgol_filter。前面代码示例都是 Python 写的离线分析我基本都用它。MATLAB/Octave 的优势是信号处理工具箱成熟。直接用 fft、ifft、filter、sgolayfilt 函数就行但正版授权成本高平时做一次性数据分析用 Octave 替代完全够。LabVIEW 适合搭建在线监测原型系统。它自带的积分和微分函数也建立在数值差分/累加基础上建议在 LabVIEW 里手动加高速滤波和去趋势模块不要直接裸用积分函数。我看到很多 LabVIEW 项目就是因为在前面板直接拖了个积分函数结果漂移到无法收敛。结合其他场景几个常见需求的处理建议车身加速度传感器信号处理车辆行驶中低频晃动和路面激励混在一起做积分前高通滤波建议设在 0.5~1Hz避免车身低频漂移主导位移结果。同时注意车辆振动方向性垂直方向传感器尤其要固定牢靠。multisim 仿真里积分器模块修改速度仿真中模拟速度/位移可以用积分器模块改参数主要是调整积分器的时间常数和初始条件可以快速验证积分漂移原理。有限元仿真中的远程位移约束仿真输出一般是位移实测数据往往只有加速度对比验证时需要把仿真位移微分两次得到加速度再用实测加速度做交叉验证。这个过程同样要注意微分噪声问题仿真位移虽然是理想数据但网格离散仍会引入微小锯齿。4.3 实操心得最后分享几个反复踩坑后的个人经验。第一不要指望一次积分就完美。我见过太多人把数据丢进函数就直接看结果发现漂移了才回头补预处理。正确做法是把预处理、积分、验证三步拆开每步都看中间波形确认没有异常再进行下一步。第二任何积分方法都必须设置合理的频带。积分在数学上是全域运算但工程上没有人关心从 0Hz 到无穷大的完整积分。把频带限制在信号的有效带宽内漂移问题基本就解决了一大半。第三验证环节必不可少尤其当你只有一路传感器时。用简谐振动公式估算幅值、和相邻通道比对波形、检查频谱峰值是否和理论一致这些都是成本很低的验证手段。有条件的话加一路激光位移计做实测对照校准互转流程后后面再遇到同类项目就闭眼放心用了。第四这些方法不限于振动信号。伺服电机编码器位移换算速度、视觉测量数据求速度、仿真脚本里加速度积分估位移原理完全一致。掌握了频域积分这套流程换个数据源照样能用。本文还有配套的精品资源点击获取