仅作笔记,转载自:
时域信号趋势项的消除办法及案例分析 - 知乎 (zhihu.com)
一、去趋势项
在做数据分析类工作的时候,采集的信号原始数据本身存在一定范围的震荡,在此之外,还可能遇到有一定的低频分量影响我们的计算或观察。由于放大器随温度变化产生的零点漂移(温飘)、传感器频率范围外低频性能的不稳定以及传感器周围的环境干扰等,往往会偏离基线,甚至偏离基线的大小还会随时间变化。偏离基线随时间变化的整个过程被称为信号的趋势项。趋势项直接影响信号的正确性,应该将其去除。常用的消除趋势项的方法是多项式最小二乘法。
原始数据时域波形:
最小二乘法拟合直线作BaseLine:
原始数据减去拟合的直线BaseLine(输出红色结果):
结果如下:
Matlab 过程实现如下。
%% 数据向量 FT
len = size(ft);
for i = 1:len
x(i,1) = i;
y(i,1) = ft(i,1);
end
%% Polyfit 单项式线性拟合 输出结果Y1
p = polyfit(x,y,1);
x1 = 1 : 1 :len;
y1 = polyval(p,x1);
%% 去趋势项
y1 = reshape(y1,1527,1);%(1527是我的数据长度)
y2 = y - y1;
plot(x,y,'B',x1,y2,'-r');
上述过程其实我在分解整个去趋势项的过程,方便大家能够更好的理解吸收。
Matlab 还可以直接使用 detrend 函数滤除时间趋势项
plot(detrend(ft));
二、去除趋势项的意义
去完时域信号的趋势项之后,我们进一步得到信号的提纯
(以下统计数据均来自我采集的数据,不需要刻意理解,结果供参考)
原始数据震荡范围
((560-498)/ 533.9)/ 2 = ±6%
去趋势项计算震荡范围
((13.14-(-13.0199))/533.9)/2 = ±2.45%
误差减少了接近三倍
趋势项本身是一个问题;如直流分量 、低频分量等,需要通过硬件滤波器,或软件算法进行滤除,噪声滤除必须对症下药,叠加在一起很难找到通解。