去除基线漂移有多种方法。
1.matlab内置函数detrend
不适合非线性的复杂信号
2.小波变换去除基线漂移wavelet
定义一个函数DeBaseline_Wavelet为去基漂函数
function y = DeBaseline_Wavelet(x)
s=x; %获取要处理的信号,x是在上面.mat里的一个参数
%整个信号的长度
N = numel(s);
%小波分解;
maxlev=7; %分解6尺度7层
wavename = 'db6'; %小波函数名称(需根据信号定)
[C,L] = wavedec(s,maxlev,wavename);
%提取分解后逼近系数和细节系数
A7=appcoef(C,L,wavename,7);
D1=detcoef(C,L,1);
D2=detcoef(C,L,2);
D3=detcoef(C,L,3);
D4=detcoef(C,L,4);
D5=detcoef(C,L,5);
D6=detcoef(C,L,6);
D7=detcoef(C,L,7);
D1= zeros(1,length(D1))'; %去掉高频噪声
D2= zeros(1,length(D2))';
A7=zeros(1,length(A7));
C2 = [A7,D7',D6',D5',D4',D3',D2',D1']; %新的系数
y = (waverec(C2,L,wavename))'; %重构去基线后信号
end
3.零相位低通滤波
先进行低通滤波,然后用原始信号减去得到的趋势信号,即为去趋势后的信号
sig_raw=lfp4;
NLen=length(sig_raw);
fs=1000;%采样频率,可从软件上设定
Ts=1/fs;%时间间隔为采样频率的倒数
fmaxd=5;%截止频率为3Hz
fmaxn=fmaxd/(fs/2);
[b,a]=butter(1,fmaxn,'low');
dd=filtfilt(b,a,lfp4);%通过5Hz低通滤波器的信号
Y1=lfp4-dd; %去除这一段信号,得到去基线漂移的信号
%绘图
subplot(3,1,1),plot(lfp4,'b');xlabel('原始信号');
subplot(3,1,2),plot(dd,'b');xlabel('趋势线');
subplot(3,1,3),plot(Y1,'b');xlabel('去除基线漂移的信号')
4.零相位高通滤波
直接设置一个高通滤波器将低于3Hz的信号除掉即可
%高通滤波去除基线漂移
clear
load(x);%load your raw sinal
sig_raw=x;
NLen=length(sig_raw);
fs=1000;%采样频率,可从软件上设定
Ts=1/fs;%时间间隔为采样频率的倒数
%高通滤波
[bbw,abw]=cheby1(4,0.5,1.5/180,'high');
Y1=filtfilt(bbw,abw,lfp4);
figure(1)
subplot(2,1,1),plot(sig_raw);xlabel('原始信号');
subplot(2,1,2),plot(Y1);xlabel('去除基线漂移的信号')