基线漂移相关处理

基线漂移简介

基线漂移指的是信号的基线(即信号的平均值或零点)随时间变化。这种变化可能会影响信号分析的准确性和可靠性。基线漂移通常包括以下几种类型:直流分量线性趋势非线性趋势

直流分量指信号中的恒定偏移量,是不随时间变化的常数:
在这里插入图片描述

线性趋势是信号中随着时间增加或减少的线性变化:
在这里插入图片描述

非线性趋势是信号的基线随时间以非线性方式变化,可能更难检测和去除:
在这里插入图片描述
(参考:【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) )');

在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值