基线漂移简介
基线漂移指的是信号的基线(即信号的平均值或零点)随时间变化。这种变化可能会影响信号分析的准确性和可靠性。基线漂移通常包括以下几种类型:直流分量、线性趋势和非线性趋势。
直流分量指信号中的恒定偏移量,是不随时间变化的常数:
线性趋势是信号中随着时间增加或减少的线性变化:
非线性趋势是信号的基线随时间以非线性方式变化,可能更难检测和去除:
(参考:【20220114】【信号处理】什么是基线漂移/趋势项?如何消除?)
基线漂移的影响
-
影响信号的准确性:
信号失真:基线漂移会导致原始信号失真,使得信号的特征和实际内容无法准确识别。
特征提取困难:对于生物医学信号,特征点(如心电图的P波)的位置和幅值会因基线漂移而变化,影响特征提取的准确性。 -
干扰信号分析:
频谱分析误差:基线漂移会在频谱分析中引入低频成分,使得实际信号的频谱成分被掩盖或失真。
时域分析干扰:基线漂移会导致信号整体上移或下移,影响信号的峰值检测和时序分析。 -
影响信号处理算法:
滤波器设计复杂度增加:在去除基线漂移时,可能需要设计复杂的滤波器,以保证信号的有效成分不被滤除。
误差引入:在去除基线漂移时,可能会引入额外的误差或噪声,影响后续信号处理的效果。频谱分析误差举例说明:
去除基线漂移的常见方法
- 去除直流分量:
平均值移除法:直接减去信号的平均值。
detrend函数:去除恒定偏移,即均值。
%% 1. 消除直流分量
fs = 100; % 采样频率
L = 10;
t = 1 : 1/fs : L;
f = 10; % 信号频率
consValLis = 2 * ones(1, length(t)); % 直流分量
raw = sin(2 * pi * f * t); % 原始信号
x1 = consValLis + raw; % 叠加有直流分量的信号
figure(1);
subplot(3, 1, 1); plot(x1, 'linewidth', 1.5); ylim([-2, 4]);title('叠加直流分量的原始信号');
subplot(3, 1, 2); plot(x1-mean(x1), 'linewidth', 1.5); ylim([-2, 4]); title('去除直流分量的原始信号(x-mean(s))');
subplot(3, 1, 3); plot(detrend(x1, 'constant'), 'linewidth', 1.5); ylim([-2, 4]); title('去除直流分量的原始信号(detrend去除均值)');
- 去除线性趋势:
线性回归:通过线性拟合移除线性趋势。
差分法:计算信号的一阶差分来去除线性趋势。
detrend函数:去除一阶线性趋势。
%% 2. 去除线性趋势项
fs = 100; % 采样频率
L = 10;
t = 1 : 1/fs : L;
f = 10; % 信号频率
linearValLis = t .* ones(1, length(t)); % 线性趋势项
raw = sin(2 * pi * f * t); % 原始信号
x2 = linearValLis + raw; % 叠加有线性趋势项的原始信号
% 方法1:线性回归去除线性趋势
p = polyfit(t, x2, 1); % 拟合线性趋势
linear_trend = polyval(p, t);
polyed_signal = x2 - linear_trend;
% 方法2:差分法去除线性趋势
differenced_signal = diff(x2);
% 方法3:detrend去除线性趋势
detrended_signal = detrend(x2, 'linear');
figure(2);
subplot(4, 1, 1); plot(x2, 'linewidth', 1.5); title('叠加有线性趋势项的原始信号');
subplot(4, 1, 2); plot(polyed_signal, 'linewidth', 1.5); title('去除线性趋势项的原始信号(线性回归去除线性趋势项)');
subplot(4, 1, 3); plot(differenced_signal, 'linewidth', 1.5); xlim([0, 1000]);title('去除线性趋势项的原始信号(差分法去除线性趋势项)');
subplot(4, 1, 4); plot(detrended_signal, 'linewidth', 1.5); title('去除线性趋势项的原始信号(detrend去除线性趋势项)');
- 去除非线性趋势:
多项式拟合:通过高阶多项式拟合去除非线性趋势。
平滑滤波:应用平滑滤波器(如滑动平均滤波器)去除非线性趋势。
经验模态分解 (EMD):分解信号为本征模态函数(IMF),去除低频成分。
%% 3. 去除多项式趋势(非线性趋势)
fs = 100; % 采样频率
L = 10;
t = 1 : 1/fs : L;
f = 10; % 信号频率
nonLinearValLis = 10 * t .* sin(2 * pi * 0.2 * t); % 非线性趋势项
raw = sin(2 * pi * f * t); % 原始信号
x3 = nonLinearValLis + raw; % 叠加有非线性趋势项的信号
% 方法1:多项式拟合去除非线性趋势
p = polyfit(t, x3, 20); % 拟合二次多项式趋势,第三参数为拟合阶数,阶数高可以拟合更复杂的多项式趋势
nonlinear_trend = polyval(p, t);
detrended_signal_poly = x3 - nonlinear_trend;
% 方法2:平滑滤波去除非线性趋势
windowSize = 13; % 设置滑动窗口大小,优化滤波效果,窗口小滤波效果更好
smooth_trend = smooth(x3, windowSize);
detrended_signal_smooth = x3 - smooth_trend';
% 方法3:经验模态分解 (EMD) 去除非线性趋势
imf = emd(x3); % EMD 分解
detrended_signal_emd = sum(imf(:, 1:1), 2)'; % EMD分解多个IMFs,选择包含主要信号信息的IMFs
figure(3);
subplot(4, 1, 1); plot(x3, 'linewidth', 1.5); title('原始信号');
subplot(4, 1, 2); plot(detrended_signal_poly, 'linewidth', 1.5); title('去除非线性趋势项的原始信号(多项式拟合)');
subplot(4, 1, 3); plot(detrended_signal_smooth, 'linewidth', 1.5); title('去除非线性趋势项的原始信号(平滑滤波)');
subplot(4, 1, 4); plot(detrended_signal_emd, 'linewidth', 1.5); title('去除非线性趋势项的原始信号(经验模态分解 (EMD) )');