人体心电信号是非常微弱的生理低频电信号,通常最大的幅值不超过5mV,信号频率在0.05~100Hz之间。由于电极和皮肤组织之间会发生极化现象,会对心电信号产生严重的干扰,加上人体是一个复杂的生命系统,存在其它的生理电信号对心电信号产生干扰。同时由于我们处在一个电磁包围的环境中,人体就好比是一根会移动的天线,从而会对心电信号产生工频干扰。心电信号具有微弱、低频、高阻抗等特性,极容易受到干扰,所以分析干扰的来源,针对不同干扰采取相应的滤除措施,是数据采集重点考虑的一个问题。常见干扰有如下几种:

a、工频干扰

b、基线漂移

c、肌电干扰

其噪声可能来自工频干扰、电极接触噪点、运动伪迹、肌电噪声、呼吸引起的基线漂移和心电幅度变化以及其他电子设备的机器噪声等诸多方面。

心电信号具有以下几个特点:

a、信号极其微弱,一般只有0.05~5mV,典型值为1mV;

b、频率范围较低,频率范围为0.1~35Hz,主要集中在5~20Hz;

c、存在不稳定性。人体内部各器官问的相互影响以及各人的心脏位置、呼吸、年龄、是否经常锻炼等因素,都会使心电信号发生相应变化;

d、干扰噪声很强。对心电信号进行测量时,必然要与外界联系,但由于其自身的信号非常微弱,因此,各种干扰噪声非常容易影响测量。

本文介绍两种去基线的算法,用于学习参考。

1、IIR零相移数字滤波器纠正基线漂移

该方法存在数据计算量大,波形失真等问题;

代码如下:

Wp=0.12*2/fs;     %通带截止频率

Ws=0.05*2/fs;     %阻带截止频率

devel=0.005;    %通带纹波

Rp=20*log10((1+devel)/(1-devel));   %通带纹波系数

Rs=20;                          %阻带衰减

[N Wn]=ellipord(Wp,Ws,Rp,Rs,'s');   %求椭圆滤波器的阶次

[b a]=ellip(N,Rp,Rs,Wn,'high');       %求椭圆滤波器的系数

[hw,w]=freqz(b,a,512);

y =filter(b,a,y_h);

效果图:

2、中位数值法进行去基线处理(该方法来自于周进同学)

该方法存在1s的延时,和最后1s数据失真的问题;优势是可以计算量小,可以用于线上处理。

代码如下:

function [ output_args ] = DC_restore( dat,RES_N )

%   中位数值法进行去基线处理

%   n1受采样率和本身信号的幅值调控

L=length(dat);

L2=zeros(1,L);

n1=RES_N;%取2*n1+1=fs=125进行中值,n1=62

for i = 1:L

if i<=n1

med=median(dat(i:i+n1));

elseif i+n1>=L

med=median(dat(i:end));

med=median(dat(i-n1:i+n1));

output_args=L3;

效果图: