可用于实时嵌入式设备的心电信号基线漂移滤除方法——基于延迟的近似零相位IIR滤波器

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/hnxyxiaomeng/article/details/81434582

      考虑到ECG信号去基漂算法需要在嵌入式设备中运行,并且尽可能降低延迟,选择IIR低通滤波器求得信号的基线漂移。将信号减去基漂后得到最终信号。
      参考论文《基于零相位的心电信号基线漂移滤波方法的实时性改进》。该论文提出了一种(近似)零相位的心电信号基线漂移滤波方法。零相位IIR滤波在很多书中都有提到,主要原理是:先将输入信号按顺序滤波,然后将结果逆转后再次通过滤波器,将结果逆转后即可得到精确零相位的输出结果。但是这个完美的算法需要拿到全部的测量数据后才能执行,没法实时实现啊。
论文提出了一种有一定延迟的近似零相位的方法:
      ①    设计IIR滤波器,并将输入信号按顺序滤波。这一步可以用直接结构IIR滤波器实现,有少量的延迟。这里我用的2阶巴特沃斯低通。
      ②    IIR滤波器的单位冲激响应为无限长,正是由于这个原因导致零相位滤波器无法实时实现。取出这个无限长冲激响应的前N项作为第二步的滤波器,系数记为Hn。
      ③    将第①步得到的结果与Hn点乘后再累加。这个步骤相当于零相位滤波器的反转→滤波→反转的过程。这样即可得到最终结果。
      上述步骤的技术细节见论文。
      我们的信号采样率为250Hz。在MATLAB中设计IIR滤波器,参考论文中的参数,阶数为2,截止频率为0.67Hz。先直接给出结果:
 
      上图蓝色是原始心电信号(请忽略高频噪声,尴尬 ̄□ ̄||)。黑色是只经过第①步即只通过IIR滤波器得到的基线,由于IIR不是线性相位,群延迟不固定,这里通过作图取<0.67Hz频段的大概平均延迟100,然后进行对齐。红色是经过(近似)零相位滤波的结果,这里大概有400点的延迟,也进行了对齐,关于延迟后面再讲。得到的基线明显红色更好!
再来看看滤除基线的最终信号:
 
      上图蓝色是原始心电信号,黑色是只经过第1步IIR滤波得到的信号,红色是经过两步滤波得到的信号。其实肉眼看不太出来优势,但是红色保持R波峰值方面有优势。由于作图时给定的offset不同,红色TP段略低于黑色,但二者R波高度相当。若把TP段放在相同纵坐标,红色的R波保持的优势就明显了。从第1张图也可以看出来,如果只通过简单的IIR滤波,计算出来的基线在R波峰值附近会有个小波峰。
      再说几个刚才提到和没提到的问题:
      1、    截断滤波器N的选取问题
      论文中建议是采样率/截止频率,这个数据基本没问题。实践中最好根据实际情况调整下。而且,如果不是低通滤波器呢?这个建议数值没法用,所以还是得实际情况具体分析。我是把滤波器的群延迟作图,大概选了个合适的数值:400。见下图:
 
      其中黑线是第1个IIR滤波器的延迟,蓝线是截断反转滤波器的延迟,红线是二者之和,横坐标是频率(Hz),纵坐标是采样点。可以看出,在0~0.67Hz内总的延迟基本为一条直线。至于阻带的延迟,我们就不关心了,毕竟基线都在低频。正是由于截断反转滤波器的存在,修正了IIR延迟不恒定的问题。
附上全频带的延迟曲线供参考吧:
 
      2、    截断反转滤波器的理解
      将IIR截断并反转后的滤波器,本质上就是一个因果的FIR滤波器!但是由于它就是IIR的粗鲁的截断,所以是牺牲了一定性能,来换取能用延迟实现的近似零相位。FIR滤波器的延迟较大,所以这个方法还导致整个滤波器的延迟增大了。从上面的图可以看出。这其实也是用全通滤波器校正IIR相位存在的问题。

猜你喜欢

转载自blog.csdn.net/hnxyxiaomeng/article/details/81434582