欢迎光临
我们一直在努力

信号去偏置与去趋势:为什么必须做,以及如何做

在实际工程信号处理中,原始采集数据几乎从来不是理想的“零均值平稳振动”。 无论是振动信号还是声压信号,都会叠加:

  • 传感器零漂

  • 放大器失调

  • 温度漂移

  • 机械缓慢形变

这些缓慢变化成分如果不加处理,会直接污染频域分析结果。

本文回答两个问题:

  • 为什么必须去趋势?

  • 有哪些常见的去趋势方法?

  • 一、信号的真实组成模型

    工程采集信号通常可以表示为:

    x(n) = s(n) + t(n) + \\varepsilon(n)

    其中:

    • s(n):我们真正关心的动态信号

    • t(n):趋势项(慢变漂移)

    • ε(n):随机噪声

    趋势项通常可近似表示为低阶多项式:

    t(n) = a_0 + a_1 n + a_2 n^2 + \\cdots

    其中:

    • a0 是直流偏置

    • a1​ 是线性漂移

    • a2​ 是二次趋势

    在大多数振动与声学分析场景中,这些趋势并不代表真实物理振动,而是系统误差或环境缓变因素。

    二、为什么必须去趋势?

    2.1 直流分量对频谱的影响

    离散傅里叶变换定义为:

    X(k) = \\sum_{n=0}^{N-1} x(n)\\, e^{-j \\frac{2\\pi}{N}kn}

    信号均值为:

    \\mu = \\frac{1}{N} \\sum_{n=0}^{N-1} x(n)

    在 k=0处:

    X(0) = \\sum_{n=0}^{N-1} x(n) = N\\mu

    结论:

    • 均值会在 0 Hz 产生巨大能量

    • 动态范围被压缩

    • 低频泄漏加剧

    • PSD 图低频区域失真

    2.2 趋势项会污染低频区域

    考虑一个简单线性趋势:

    x(n) = a_1 n

    有限长度截断后,其频谱不会只集中在 0 Hz,而是会在低频形成展宽分布。

    这会导致:

    • 低频能量异常堆积

    • 频谱整体倾斜

    • 出现“伪低频峰”

    在包络分析、模态识别、轴承故障诊断中,这种污染会直接掩盖真实特征频率。

    2.3 对统计建模的影响

    许多算法隐含假设信号是零均值的,例如:

    协方差矩阵定义:

    R = E\\{ x(n)x^H(n) \\}

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

    R = E\\{ (s+t)(s+t)^H \\}

    其中包含额外偏置项:

    E\\{t(n)t^H(n)\\}

    这会导致:

    • 协方差矩阵秩结构改变

    • 子空间方法性能下降

    三、去偏置:最基本操作

    去偏置即去除均值:

    x_d(n) = x(n) - \\mu

    这是最基础、必须执行的步骤。

    物理意义: 去掉系统静态工作点,只保留动态变化。

    四、去趋势的方法

    方法一:线性去趋势

    假设趋势为:

    t(n) = a_0 + a_1(n)

    通过最小二乘拟合求解:

    \\min_{a_0,a_1} \\sum_{n=0}^{N-1} (x(n) - a_0 - a_1 n)^2

    优点:

    • 保留真实低频振动

    • 不引入滤波相位畸变

    • 工程最常用

    方法二:多项式拟合去趋势

    当存在非线性漂移时:

    t(n) = \\sum_{k=0}^{p} a_k n^k

    适用于:

    • 温漂明显

    • 长时间慢变信号

    方法三:高通滤波

    通过设计高通滤波器:

    y(n) = x(n) * h(n)

    缺点:

    • 相位畸变

    • 截止频率选择困难

    • 可能误删真实低频信息

    高通滤波本质上不是纯数学去趋势,而是频域抑制。

    方法四:差分法

    一阶差分:

    y(n) = x(n) - x(n-1)

    优点:

    • 强烈抑制低频

    缺点:

    • 同时放大高频噪声

    五、一个重要结论

    去趋势不是“格式化步骤”,而是建模假设。

    是否去趋势,取决于你认为:

    趋势项是否属于真实物理信号。

    在振动故障诊断中,趋势通常是无意义的。 在结构形变监测中,趋势可能正是你关心的对象。

    六、仿真

    下面用一段实际采集的振动信号来仿真:

    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 一阶差分

    时域表现

    • 趋势几乎完全消失

    • 高频成分明显增强

    频域表现

    • 低频被极强抑制

    • 高频明显增强

    差分本质上是一个高通操作:

    y(n)=x(n)-x(n-1)

    它会放大高频噪声,因此并不适合作为通用去趋势方法。

    6.7 核心对比总结

    从实验结果可以归纳出以下规律:

  • 去均值只解决 0 Hz 问题

  • 线性去趋势可有效抑制慢变斜坡

  • 多项式去趋势适合复杂漂移

  • 高通滤波属于频域抑制

  • 差分会放大高频噪声

  • 七、总结

    • 去偏置是基础操作

    • 趋势会严重污染低频频谱

    • 不同方法适用于不同场景

    真正严谨的信号处理,不是机械执行 detrend,而是理解信号组成,根据实际情况再做决策。

    后续我会在声纹与振动信号分析入门:常用时域与频域指标 + 常见图谱怎么看-CSDN博客继续更新声纹以及振动信号相关的知识。

    赞(0)
    未经允许不得转载:171主机测评 » 信号去偏置与去趋势:为什么必须做,以及如何做
    分享到: 更多 (0)

    评论 抢沙发

    • 昵称 (必填)
    • 邮箱 (必填)
    • 网址