去基线漂移

去除基线漂移有多种方法。

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

去基线漂移_第1张图片

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('去除基线漂移的信号')

去基线漂移_第2张图片

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('去除基线漂移的信号')

 

去基线漂移_第3张图片

 

你可能感兴趣的:(去基线漂移)