在实际工程信号处理中,原始采集数据几乎从来不是理想的“零均值平稳振动”。 无论是振动信号还是声压信号,都会叠加:
-
传感器零漂
-
放大器失调
-
温度漂移
-
机械缓慢形变
这些缓慢变化成分如果不加处理,会直接污染频域分析结果。
本文回答两个问题:
为什么必须去趋势?
有哪些常见的去趋势方法?
一、信号的真实组成模型
工程采集信号通常可以表示为:

其中:
-
s(n):我们真正关心的动态信号
-
t(n):趋势项(慢变漂移)
-
ε(n):随机噪声
趋势项通常可近似表示为低阶多项式:

其中:
-
a0 是直流偏置
-
a1 是线性漂移
-
a2 是二次趋势
在大多数振动与声学分析场景中,这些趋势并不代表真实物理振动,而是系统误差或环境缓变因素。
二、为什么必须去趋势?
2.1 直流分量对频谱的影响
离散傅里叶变换定义为:

信号均值为:

在 k=0处:

结论:
-
均值会在 0 Hz 产生巨大能量
-
动态范围被压缩
-
低频泄漏加剧
-
PSD 图低频区域失真
2.2 趋势项会污染低频区域
考虑一个简单线性趋势:

有限长度截断后,其频谱不会只集中在 0 Hz,而是会在低频形成展宽分布。
这会导致:
-
低频能量异常堆积
-
频谱整体倾斜
-
出现“伪低频峰”
在包络分析、模态识别、轴承故障诊断中,这种污染会直接掩盖真实特征频率。
2.3 对统计建模的影响
许多算法隐含假设信号是零均值的,例如:
协方差矩阵定义:

若均值不为零,则实际计算的是:

其中包含额外偏置项:

这会导致:
-
协方差矩阵秩结构改变
-
子空间方法性能下降
三、去偏置:最基本操作
去偏置即去除均值:

这是最基础、必须执行的步骤。
物理意义: 去掉系统静态工作点,只保留动态变化。
四、去趋势的方法
方法一:线性去趋势
假设趋势为:

通过最小二乘拟合求解:

优点:
-
保留真实低频振动
-
不引入滤波相位畸变
-
工程最常用
方法二:多项式拟合去趋势
当存在非线性漂移时:

适用于:
-
温漂明显
-
长时间慢变信号
方法三:高通滤波
通过设计高通滤波器:

缺点:
-
相位畸变
-
截止频率选择困难
-
可能误删真实低频信息
高通滤波本质上不是纯数学去趋势,而是频域抑制。
方法四:差分法
一阶差分:

优点:
-
强烈抑制低频
缺点:
-
同时放大高频噪声
五、一个重要结论
去趋势不是“格式化步骤”,而是建模假设。
是否去趋势,取决于你认为:
趋势项是否属于真实物理信号。
在振动故障诊断中,趋势通常是无意义的。 在结构形变监测中,趋势可能正是你关心的对象。
六、仿真
下面用一段实际采集的振动信号来仿真:
clc;
clear;
close all;
%% ================== 1. 读取数据 ==================
data_ori = load("11.txt");
data_ori = data_ori(:); % 强制列向量
N = length(data_ori);
x = (0:N-1)';
fs = 625e6; % 采样率
%% ================== 2. 各种去趋势方法 ==================
% ———- 方法1:去均值 ———-
data_mean = data_ori – mean(data_ori);
% ———- 方法2:MATLAB 线性去趋势 ———-
data_linear = detrend(data_ori);
% ———- 方法3:多项式去趋势(二阶) ———-
p = polyfit(x, data_ori, 2);
trend_poly = polyval(p, x);
data_poly = data_ori – trend_poly;
% ———- 方法4:高通滤波 ———-
fc_actual = 1e6; % 截止频率
Wn = fc_actual / (fs/2); % 归一化频率
[b,a] = butter(3, Wn, 'high');
data_hp = filtfilt(b, a, data_ori);
% ———- 方法5:一阶差分 ———-
data_diff = [0; diff(data_ori)];
%% ================== 3. 时域对比 ==================
figure('Name','时域对比','Position',[200 200 1000 700]);
subplot(3,2,1);
plot(data_ori);
title('原始信号');
subplot(3,2,2);
plot(data_mean);
title('去均值');
subplot(3,2,3);
plot(data_linear);
title('线性去趋势');
subplot(3,2,4);
plot(data_poly);
title('二阶多项式去趋势');
subplot(3,2,5);
plot(data_hp);
title('高通滤波');
subplot(3,2,6);
plot(data_diff);
title('一阶差分');
%% ================== 4. 频域对比 ==================
% 频率轴
f = (0:N-1)*(fs/N);
% FFT
fft_ori = abs(fft(data_ori));
fft_mean = abs(fft(data_mean));
fft_linear = abs(fft(data_linear));
fft_poly = abs(fft(data_poly));
fft_hp = abs(fft(data_hp));
fft_diff = abs(fft(data_diff));
figure('Name','频域对比','Position',[300 200 1000 700]);
subplot(3,2,1);
plot(f, fft_ori);
xlim([0 fs/100]);
title('原始频谱');
subplot(3,2,2);
plot(f, fft_mean);
xlim([0 fs/100]);
title('去均值频谱');
subplot(3,2,3);
plot(f, fft_linear);
xlim([0 fs/100]);
title('线性去趋势频谱');
subplot(3,2,4);
plot(f, fft_poly);
xlim([0 fs/100]);
title('多项式去趋势频谱');
subplot(3,2,5);
plot(f, fft_hp);
xlim([0 fs/100]);
title('高通滤波频谱');
subplot(3,2,6);
plot(f, fft_diff);
xlim([0 fs/100]);
title('差分频谱');
实验结果对比与方法分析


从时域与频域两个角度对比不同去趋势方法,可以得到几个非常清晰的结论。
6.1 原始信号
时域上可以明显看到整体单调上升趋势,叠加局部波动。
频域上:
-
0 Hz 处能量极大
-
低频区域明显被抬高
-
有效动态信号被淹没
这验证了一个事实:
趋势项会严重压缩频谱动态范围。
6.2 仅去均值
时域表现
整体上移,但斜率仍然存在。 信号仍呈线性上升趋势。
频域表现
-
0 Hz 峰值消失
-
但低频区域仍然很高
说明:
去均值只消除了直流分量 并没有解决“慢变趋势”问题。
这也印证了理论结论:
去均值 ≠ 去趋势。
6.3 线性去趋势(detrend)
时域表现
-
整体斜坡被移除
-
信号围绕零轴波动
频域表现
-
低频能量显著下降
-
频谱结构开始清晰
这说明:
线性去趋势成功消除了线性漂移带来的低频扩散。
相比单纯去均值,效果明显更好。
6.4 二阶多项式去趋势
时域表现
-
整体曲率趋势被去除
-
信号更加平稳
频域表现
-
低频进一步下降
-
频谱更均衡
这表明:
当趋势不是纯线性时,多项式拟合能够更好建模慢变成分。
但需要注意:
阶数过高会开始“吞噬”真实低频信号。
6.5 高通滤波
时域表现
-
整体趋势被抑制
-
局部波形有所畸变
频域表现
-
低频强制压制
-
截止频率以下明显衰减
这说明:
高通滤波是频域强制抑制,而不是趋势建模。
优点是简单直接, 缺点是:
-
依赖截止频率选择
-
可能误删真实低频信息
6.6 一阶差分
时域表现
-
趋势几乎完全消失
-
高频成分明显增强
频域表现
-
低频被极强抑制
-
高频明显增强
差分本质上是一个高通操作:

它会放大高频噪声,因此并不适合作为通用去趋势方法。
6.7 核心对比总结
从实验结果可以归纳出以下规律:
去均值只解决 0 Hz 问题
线性去趋势可有效抑制慢变斜坡
多项式去趋势适合复杂漂移
高通滤波属于频域抑制
差分会放大高频噪声
七、总结
-
去偏置是基础操作
-
趋势会严重污染低频频谱
-
不同方法适用于不同场景
真正严谨的信号处理,不是机械执行 detrend,而是理解信号组成,根据实际情况再做决策。
后续我会在声纹与振动信号分析入门:常用时域与频域指标 + 常见图谱怎么看-CSDN博客继续更新声纹以及振动信号相关的知识。





