原文链接:点击打开链接
某些数字信号中会含有基线干扰信号(低频噪音),会对信号分析产生不利影响,如图1所示。需要通过预处理消除信号基线。
(智能心电手环https://shop137138656.taobao.com/?spm=2013.1.1000126.d21.c3995851hkvlEt)
图1 含有基线干扰的信号
我总结了有以下几种利用matlab消除基线漂移的方法。
1. detrend函数
这是MATLAB内置系统函数,只能用于消除线性趋势(基线),不适用于消除非线性趋势,语法规则为:
- y = detrend(x)
x:含有基线干扰的信号。
y:去除基线干扰后的信号。
- y = detrend(x,'constant')
减去信号的均值(修正零漂),等同于x-mean(x)。
- y = detrend(x,'linear',bp)
分段消除时间序列中的线性趋势项,bp为分段点向量,分段点的值由其两端的线段共享。分段点的位置如下图所示。
图2 分段点位置
Examples1
输入:
sig = [0 1 -2 1 0 1 -2 1 0]; % signal with no linear trend
trend = [0 1 2 3 4 3 2 1 0]; % two-segment linear trend
x = sig+trend; % signal with added trend
y = detrend(x,'linear',5) % breakpoint at 5th element
输出:
y = -0.0000 1.0000 -2.0000 1.0000 0.0000 1.0000 -2.0000 1.0000 -0.0000
Examples2
图3为两段含基线漂移的心电信号样本,第一段有向上的线性趋势,可直接去除:
dt_ecgl = detrend(ecgl);
第二段有上下波动,接近分段线性,但断点不明显,不适用detrend函数去除。可以用下面描述的第2种方法:多项式拟合法去除。
图3 去除基线前
2. 多项式拟合多项式拟合法是首先对含有线性趋势的信号进行多项式拟合,将基线拟合出来,然后把原始信号减去拟合信号,得到去除基线的信号。图4为用6阶多项式去除基线后的心电信号。
图4 去除基线后
示例程序(matlab):
opol = 6;
[p,s,mu] = polyfit(t,ecgnl,opol);
f_y = polyval(p,t,[],mu);
dt_ecgnl = ecgnl - f_y;
3. BEADS算法
这是一个MATLAB第三方工具箱,全称:Baseline Estimation And Denoising w/ Sparsity。
点击这里可以查看详细介绍,作者原来是用于处理色谱信号,但是该算法也可用于处理其他含有基线干扰的信号。该算法的主要作用在于基线修正、降噪、仪器零漂修正功能。有一个使用的限制条件是被处理信号必须是大多数峰值是正的稀疏信号。算法效果见图5所示。
图5 BEADS算法
4. 小波算法
通过小波变换的多尺度分解,在分解的低频系数中可观察到信号的基线趋势。再将原始信号减去基线即可。
5. 经验模态分解(EMD)
EMD方法认为任何信号都可以分解为若干个不同的本征模态函数,和一个残余量稳态量。其中各个本征模态函数反映了信号的局部特性,残余量反映了信号的趋势或均值。EMD法采用“筛”选的方法从原始信号中将残余量分离出来。
reference:
[1] http://cn.mathworks.com/matlabcentral/fileexchange/49974-beads--baseline-estimation-and-denoising-w--sparsity--chromatogram-signals-?s_tid=AO_FX_info