论文阅读和复现:去除PPG运动伪影的IEEE论文

news2024/12/25 9:58:30

论文阅读和代码复现:
《Combining Nonlinear Adaptive Filtering and Signal Decomposition for Motion Artifact Removal in Wearable Photoplethysmography》

基本介绍:

由于手腕运动造成的噪声:运动伪影,使得PPG方法的心率监测不准,去除运动伪影噪声在智能手表中是一个难点。

论文中使用的开源数据:PPG database used in 2015 IEEE Signal Processing Cup[1]

[1]Pace and Bricout, “Low Heart Rate Response of Children with Autism Spectrum Disorders in Comparison to Controls during Physical Exercise,” Physiology & Behavior, vol.141, pp.63-68, 2015.

目前已经有的研究:

  • 使用独立成分分析ICA

ICA有一个关键的统计独立或不相关假设[11]。因此,在许多实际场景中,将MA与PPG信号分离的结果并不令人满意。

[11]J. Yao and S. Warren, “A short study to assess the potential of independent component analysis for motion artifact separation in wearable pulse oximeter signals,” in Proc. 27th Annual Conf IEEE Engg. Medicine and Biology, pp. 3585-3588, 2005.

  • 使用自适应滤波

通过适当设计参考信号,在某些情况下可以达到令人满意的效果。然而,一个设计不好的参考信号会导致较差的MA去除性能。此外,原始PPG信号中的MA与参考信号之间的关系可能不是线性相关的,而是非线性相关的,当选择同步加速度信号作为参考信号时。

[12] Comtois Gary, Yitzhak Mendelson, and Piyush Ramuka, “A Comparative Evaluation of Adaptive Noise Cancellation Algorithms for Minimizing Motion Artifacts in a Forehead-Mounted Wearable Pulse Oximeter,” 29th Annual International Conference of the IEEE Engineering in Medicine and Biology Society, pp.1528-1531, 2007.
[13] A. B. Barreto, L. M. Vicente, and I. K. Persad, “Adaptive Cancellation of Motion Artifact in Photoplethysmographic Blood Volume Pulse Measurements for Exercise Evaluation,” Engineering in Medicine and Biology Society, IEEE 17th Annual Conference, vol.2, pp.983-984. 1995.
[14] Ram, M. Raghu, et al. “A novel approach for motion artifact reduction in PPG signals based on AS-LMS adaptive filter.” IEEE Transactions on Instrumentation and Measurement, pp. 1445-1457, 2012.
[15] Hyonyoung Han and Jung Kim, “Artifacts in wearable photoplethysmographs during daily life motions and their reduction with least meansquare based active noise cancellation method,” Computers in Biology and Medicine 42, pp. 387-393, 2012.
[16] Asada, H. Harry, Hong-Hui Jiang, and Peter Gibbs, “Active noise cancellation using MEMS accelerometers for motion-tolerant wearable bio-sensors,” Engineering in Medicine and Biology Society, 2004. IEMBS’04. 26th Annual International Conference of the IEEE. vol. 1, 2004.

  • 使用信号分解

信号分解[17],[18]最近被证明是一种有效的去除MA的方法。例如,在[17]中,作者使用奇异谱分析(SSA)将原始PPG分解为多个分量,然后使用同步加速度信号的信息来识别与MA相关的分量。去除这些分量后,利用剩余分量重构PPG信号,得到更清晰的PPG信号。同样,在[18]中,使用经验模态分解(EMD)将一个原始PPG信号分解为许多分量,并使用同步加速度信号的频谱进行频谱减法去除与MA相关的分量。然而,信号分解通常具有较大的计算量,这可能会阻碍其在低功耗可穿戴设备中的应用。

[17] Z. Zhang, Z. Pi, and B. Liu, “TROIKA: A general framework for heart rate monitoring using wrist-type photoplethysmographic signals during intensive physical exercise,” IEEE Transactions on Biomedical Engineering, vol. 62, no. 2, pp. 522-531, 2015.

[18] Y. Zhang, B. Liu, Z. Zhang, “Combining Ensemble Empirical Mode Decomposition with Spectrum Subtraction Technique for Heart Rate Monitoring Using Wrist-Type Photoplethysmography,” Biomedical Signal Processing and Control, vol. 21, pp. 119-125, 2015.

论文的算法方案

在这里插入图片描述

基本步骤:

1、PPG传感器和加速度传感器同时采集原始数据;并且对数据进行带通滤波处理,PPG数据的通带选择0.4-5.0 HZ;

2、A:Volterra RLS 非线性滤波算法处理PPG数据,其中的加速度数据作为Volterra RLS的参考信号;

3、判断Volterra RLS滤波结果是否满足要求,根据相关性的阈值进行判断;

4、第3步的判断满足要求YES,则进入到步骤6,谱峰追踪算法;No则进入步骤5;

5、SSA进行进一步处理PPG数据,去除运动伪影;

6、谱峰追踪,原因是即使进行运动伪影的处理,在FFT算法处理PPG信号后,得到的频谱的最大幅值对应的频率不一定是心率值,运动伪影太强会导致出现多个谱峰,而且运动伪影造成的谱峰比心率峰值还要大的现象。这里需要使用机器学习算法或专家经验(例如两个时间窗之间的心率不会突变)进行谱峰选取;

7、最终计算得到心率值;

Volterra-RLS去除运动伪影算法原理

在这里插入图片描述

如图所示。基于RLS volterra的非线性自适应滤波系统框图。它有两个输入。一个是原始PPG信号s(k),包含感兴趣的信号s1(k)和加上干扰n(k)。另一个输入是加速度数据xk。对噪声进行过滤,以产生与n(k)尽可能接近的副本的输出n(k)。这个输出从主要输入s(k)中减去,得到系统输出ε(k)。

代码基本实现Volterra-RLS算法去除运动伪影:

算法流程参考:
Paulo S. R. Diniz (auth.) - 《Adaptive Filtering_ Algorithms and Practical Implementation》-Springer US (2013)

在这里插入图片描述

根据作者介绍可知,Volterra RLS算法和传统的RLS算法的区别就是输入 x ( k ) \pmb{x}(k) x(k)。其中 x ( k ) \pmb{x}(k) x(k)如下所示:其中N是指滤波器的阶数。

在这里插入图片描述

# -*- coding: utf-8 -*-
#
# Copyright (C) 2022 Emperor_Yang, Inc. All Rights Reserved 
#
# @CreateTime    : 2022/12/31 8:00
# @Author        : Emperor_Yang 
# @File          : volterra_rls.py
# @Software      : PyCharm

import numpy as np
import queue


class PPGAccData(object):
    def __init__(self):
        self._ppg = []
        self._acc = []

    def push_data(self, ppg_data, acc_data):
        assert (len(ppg_data) == len(acc_data))  # 保证ppg和acc数据是长度一致的
        self._ppg.append(ppg_data)
        self._acc.append(acc_data)

    def get_data(self, data_len):
        ppg_data = []
        acc_data = []
        current_ppg_data_len = len(self._ppg)
        if len(self._ppg) > data_len:
            ppg_data = self._ppg[-data_len: -1]
            acc_data = self._acc[-data_len: -1]
        else:
            for i in range(data_len - current_ppg_data_len):
                ppg_data.append(0)
                acc_data.append(0)
            ppg_data.append(self._ppg)
            acc_data.append(self._acc)
        return np.array(ppg_data), np.array(acc_data)


N = 10  # 滤波算法的阶数
delta = 10  # signal power
matrix_size = (N + 1) * (N + 1) + (N + 1)
S_D_init = delta * np.ones((matrix_size, matrix_size))
x_init = np.zeros((matrix_size, 1))
w_init = np.zeros((matrix_size, 1))
lambda_value = 0.1  # (0, 1)

ppg_acc_data = PPGAccData()
ppg_data, acc_data = ppg_acc_data.get_data(N)
x = x_init
S_D = S_D_init
w = w_init

stop_flag = True

while stop_flag:
    e = acc_data - np.transpose(x) @ w
    pha_matrix = S_D @ x
    S_D = 1 / lambda_value * (
                S_D - (pha_matrix @ np.transpose(pha_matrix) / lambda_value + np.transpose(pha_matrix) @ x))
    w = w + e @ S_D @ x
    y = np.transpose(w) @ x
    delta_vector = acc_data - y
    ppg_data, acc_data = ppg_acc_data.get_data(N)
    x = ppg_data
    d = acc_data

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/135219.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

shell-流程控制之条件判断

1、判断当前磁盘剩余空间是否有20G,如果小于20G,则将报警邮件发送给管理员,每天检查一次磁盘剩余空间。 补充:20G20971520kb [rootcotenos day06]# pwd /root/shell/day06 [rootcotenos day06]# vim free_men.sh #!/bin/bash f…

spring boot启动环境的配置与更改(dev,local,pro)包含单元测试环境

文件类型介绍 properties 该文件是一种key-value的格式&#xff0c;配置文件的特点是&#xff0c;它的Key-Value一般都是String-String类型的&#xff0c;因此我们完全可以用Map<String, String>来表示它。 用Properties读取配置文件非常简单。Java默认配置文件以.pro…

elasticsearch 7.9.3知识归纳整理(二)之es基本原理及使用kibana操作es的常见命令

es基本原理及使用kibana操作es的常见命令 一、es的基本原理与基础概念 1.1 倒排索引 倒排索引源于实际应用中需要根据属性的值来查找记录。这种索引表中的每一项都包括一个属性值和具有该属性值的各记录的地址。由于不是由记录来确定属性值&#xff0c;而是由属性值来确定记录…

【机器学习】机器学习中常用的损失函数一览

问题 机器学习中常用的损失函数总结 前言 我们经常听到损失函数、代价函数和目标函数这三种说法&#xff0c;这三种说法有什么联系和区别呢&#xff1f;这里明确下&#xff1a; 损失函数 Loss Function 通常是针对单个训练样本而言的&#xff0c;给定一个模型输出 y^\hat{y…

设计模式 - UML类图

1. 什么是 UML 统一建模语言(Unified Modeling Language,UML)是用来设计软件的可视化建模语言。它的特点是简单、统图形化、能表达软件设计中的动态与静态信息。L从目标系统的不同角度出发&#xff0c;定义了用例图、类图、对象图、状态图、活动图、时序图、协作图、构件图部署…

8种数据结构

快速介绍8种常用数据结构 数据结构是一种特殊的组织和存储数据的方式&#xff0c;可以使我们可以更高效地对存储的数据执行操作。数据结构在计算机科学和软件工程领域具有广泛而多样的用途。 几乎所有已开发的程序或软件系统都使用数据结构。此外&#xff0c;数据结构属于计算…

【回答问题】ChatGPT上线了!有哪些3D点云算法模型?3D点云算法模型实现代码?

有哪些3D点云算法模型&#xff1f; 3D点云算法的模型有很多种&#xff0c;以下是一些常见的算法模型&#xff1a; 归一化重心法&#xff08;Normalized point-to-point ICP&#xff09;&#xff1a;是一种常用的模型配准方法&#xff0c;用于将两个模型中的点匹配起来。 基于…

跨年晚会前夕,曹云金和前妻复合了

每到跨年晚会的时候&#xff0c;总会有大的新闻事件发生&#xff0c;比如说在今年跨年晚会前夕&#xff0c;主持人何炅的老父亲&#xff0c;就非常不幸地驾鹤西去了。话说主持人何炅&#xff0c;在父亲离开后坚强地主持节目&#xff0c;他泪眼婆娑的表情&#xff0c;也登上了各…

电子游戏销售之回归模型与数据可视化

电子游戏销售之回归模型与数据可视化 文章目录电子游戏销售之回归模型与数据可视化0、写在前面1、回归模型1.1 模型建立准备1.2 建立模型1.3 模型分析2、数据可视化3、参考资料0、写在前面 该篇文章的任务包括以下3个方面 检测与处理缺失值建立回归模型数据可视化 实验环境 Pyt…

我的2022年总结

我的2022年总结 行走于世&#xff0c;风大时要表现逆的风骨&#xff0c;风小时要表现顺的悠然。 我们可以转身&#xff0c;但是不必回头&#xff0c;即使有一天你发现自己走错了&#xff0c;你也应该转身大步朝着对的方向去&#xff0c;而不是回头埋怨自己错了。 一、旧事 …

INT201-Decision, Computation and Language(2)

文章目录5. Turing Machine5.1 TM Configuration5.2 TM Transitions5.3 TM Computation5.4 Language accepted by TM5.5 Decider5.6 Multi-tape TM5.6.1 Multi-tape TM equivalent to 1-tape TM5.7 Nondeterministic TM5.7.1 Address5.7.2 NTM equivalent to TM5.8 Enumerable …

【Linux操作系统】yum三板斧和yum源的配置

文章目录一.Linux下软件的生态二.yum三板斧1.yum简介2.list搜索软件包3.install下载并安装4.remove卸载软件三.windows/Linux下文件互传1.lrzsz的查看和下载安装2.rz上传3.sz下载四.Linux软件生态的本土化1.镜像简介2.Linux软件生态的本土化五.yum源的配置1.找到yum源配置文件并…

Jedis: Java连接redis服务

文章目录一、编程语言与 Redis二、Jedis 连接三、JedisPool 连接池四、可视化客户端提示&#xff1a;以下是本篇文章正文内容&#xff0c;Redis系列学习将会持续更新 一、编程语言与 Redis ● Java 语言连接 redis 服务   Jedis   SpringData Redis   Lettuce ● C 、C …

ArcGIS基础实验操作100例--实验40构建点对连线

本实验专栏参考自汤国安教授《地理信息系统基础实验操作100例》一书 实验平台&#xff1a;ArcGIS 10.6 实验数据&#xff1a;请访问实验1&#xff08;传送门&#xff09; 高级编辑篇--实验40 构建点对连线 目录 一、实验背景 二、实验数据 三、实验步骤 &#xff08;1&…

可视化系列讲解:canvas的动画实现

文章目录一、Canvas动画1.1 Canvas绘图都是通过JavaScript 去操控的&#xff0c;如要实现一些交互性动画是相当容易的。那Canvas是如何做一些基本动画的&#xff1f;1.2 Canvas 画出一帧动画的基本步骤&#xff08;如要画出流畅动画&#xff0c;1s 需绘60帧&#xff09;&#x…

【回答问题】ChatGPT上线了!推荐30个以上比较好的自然语言处理模型

【回答问题】ChatGPT上线了&#xff01;推荐40个以上比较好的自然语言处理模型以及github源码&#xff1f; BERT (Bidirectional Encoder Representations from Transformers): https://github.com/google-research/bert GPT (Generative Pre-training Transformer): https:/…

Taro笔记

Taro官网:https://nervjs.github.io/taro-docs/docs/ Taro简介 可使用React、Vue等框架开发跨端开发框架,一套代码编译到多端,使用Taro,只书写一套代码,再通过Taro的编译工具,将源代码分别编译出可以在不同端(微信小程序、H5、RN等)运行的代码。Taro 核心转化图 Taro使…

数据链路层重点总结

文章目录前言一、MAC地址二、一跳一跳的网络传输三、以太网四、ARP协议4.1 ARP协议的作用4.2 ARP协议的工作流程五、MTU5.1 什么是MTU5.2 MTU对IP协议的影响5.3 MTU对UDP协议的影响5.4 MTU对于TCP协议的影响总结前言 又是新的一年&#xff0c;展望2023年&#xff0c;博主给大家…

可视化系列讲解:canvas的进阶使用(颜色和样式设置,绘制文本,绘制图片)

文章目录一、Canvas的颜色和样式设置1.1 颜色&#xff08;不设置默认黑色&#xff09;1.2 透明度 Transparent1.3 线型 Line styles二、Canvas绘制文本2.1 文本的样式&#xff08;需在绘制文本前调用&#xff09;2.2 fillText(text, x, y [, maxWidth])2.3 strokeText(text, x,…

回首2022,展望2023

&#x1f44f;作者简介&#xff1a;大家好&#xff0c;我是爱敲代码的小黄&#xff0c;独角兽企业的Java开发工程师&#xff0c;CSDN博客专家&#xff0c;Java领域新星创作者&#x1f4d5;系列专栏&#xff1a;Java设计模式、数据结构和算法、Kafka从入门到成神、Kafka从成神到…