基于盲源分离和半盲源分离的心电信号伪影消除方法(MATLAB 2018)

心电信号是通过测量放置在人体皮肤上的电极之间的电位差来获取的,其本身具有信号微弱、频段低、不稳定等特性。因此ECG信号在实际采集时极易受到不同噪声的影响,这会造成心电图本身的波形形态特征的失真,从而导致错误诊断和对患者的不当治疗。由于信号采集的环境、方法和设备等因素的干扰,影响心电信号质量的噪声主要包括:基线漂移、工频干扰、肌电噪声以及电极运动伪影。

基线漂移是一种低频噪声,主要由人体呼吸、身体运动、电极接触不良和皮肤与电极之间阻抗变化引起。漂移的幅度和持续时间取决于电极特性、电解质特性、皮肤阻抗和身体运动,通常基线漂移会造成心电信号ST段的失真,从而导致对心肌梗塞、Brugada综合征等与ST段异常相关的错误诊断。

工频干扰是一种窄带干扰噪声,主要由心电信号采集过程中50/60Hz电源线的电感和电容耦合引起。工频干扰与ECG信号混合会扭曲信号的形态,导致P波失真,从而导致对心房扩大和房颤的错误诊断。

肌电噪声是由肌肉在收缩期间的电活动或由于突然的身体运动引起的,其带宽通常在5-2000Hz之间,平均幅度为心电信号峰-峰值10%的水平,持续时间约为50ms,因此会导致ECG信号的局部波形失真。

电极运动伪影是由电极与皮肤之间阻抗随着电极运动变化引起的瞬时基线变化,其幅度能达到ECG信号峰-峰值的500%,持续时间约为300-500ms。电极运动伪影会严重干扰可穿戴式心电设备的心电信号采集,其较大的波动性和随机性会严重影响可穿戴设备采集到的心电信号质量。

鉴于此,采用盲源分离和半盲源分离方法对心电信号伪影消除,运行环境为MATLAB 2018。

clc;clear all;close all;
X_load=load("Ex1.mat");
X_load=X_load.X;
%% part a
X =X_load';
for dim =1:3
    X(:,dim) = X(:,dim) - sum(X(:,dim))/(size(X,1)); 
end
figure()
subplot (3,3,[1:6])
scatter3(X(:,1),X(:,2),X(:,3))
title("Visualized Data in 3D domain")
xlabel('X'); ylabel("Y"); zlabel("Z");
subplot(3,3,7)
scatter(X(:,1),X(:,2))
title("Visualized Data in 2D x-y plane")
xlabel('X'); ylabel("Y");
grid on
subplot(3,3,8)
scatter(X(:,1),X(:,3))
title("Visualized Data in 2D x-z plane")
xlabel('X'); ylabel("Z");
grid on
subplot(3,3,9)
scatter(X(:,2),X(:,3))
title("Visualized Data in 2D y-z plane")
xlabel('Y'); ylabel("Z");
grid on
%% part B.1 
Covariance_mat = cov(X)
[V,D] = eig(Covariance_mat)
D_wh = D^(-1/2);
C_final = D_wh*V'*Covariance_mat*V*D_wh;
kernel=-1:0.001:1;
figure()
subplot (3,3,[1:6])
scatter3(X(:,1),X(:,2),X(:,3));
hold on
plot3(kernel*V(1,2),kernel*V(2,2),kernel*V(3,2),'linewidth',2.5)
hold on
plot3(kernel*V(1,1),kernel*V(2,1),kernel*V(3,1),'linewidth',2.5)
hold on
plot3(40*kernel*V(1,3),40*kernel*V(2,3),40*kernel*V(3,3),'linewidth',2.5)
title("Visualized Data with eigen vectors")
xlabel("X"); ylabel("Y"); zlabel("Z");
subplot(3,3,7)
scatter3(X(:,1),X(:,2),X(:,3));
hold on
plot3(kernel*V(1,2),kernel*V(2,2),kernel*V(3,2),'linewidth',2.5)
hold on
plot3(kernel*V(1,1),kernel*V(2,1),kernel*V(3,1),'linewidth',2.5)
hold on
plot3(40*kernel*V(1,3),40*kernel*V(2,3),40*kernel*V(3,3),'linewidth',2.5)
title("Visualized Data with eigen vectors")
xlabel("X"); ylabel("Y"); zlabel("Z");
subplot(3,3,8)
scatter3(X(:,1),X(:,2),X(:,3));
hold on
plot3(kernel*V(1,2),kernel*V(2,2),kernel*V(3,2),'linewidth',2.5)
hold on
plot3(kernel*V(1,1),kernel*V(2,1),kernel*V(3,1),'linewidth',2.5)
hold on
plot3(40*kernel*V(1,3),40*kernel*V(2,3),40*kernel*V(3,3),'linewidth',2.5)
title("Visualized Data with eigen vectors")
xlabel("X"); ylabel("Y"); zlabel("Z");
subplot(3,3,9)
scatter3(X(:,1),X(:,2),X(:,3));
hold on
plot3(kernel*V(1,2),kernel*V(2,2),kernel*V(3,2),'linewidth',2.5)
hold on
plot3(kernel*V(1,1),kernel*V(2,1),kernel*V(3,1),'linewidth',2.5)
hold on
plot3(40*kernel*V(1,3),40*kernel*V(2,3),40*kernel*V(3,3),'linewidth',2.5)
title("Visualized Data with eigen vectors")
xlabel("X"); ylabel("Y"); zlabel("Z");
%% part B.2
Y = transpose(D_wh*V'*X'); 
Covariance_matY =cov(Y)
figure();
scatter3(Y(:,1),Y(:,2),Y(:,3));
title('Visualization of whitened Data');
xlabel('X');ylabel('Y');zlabel('Z'); 
%% Part C.1
COEF_pca = pca(X);
figure()
scatter3(X(:,1),X(:,2),X(:,3));
hold on
plot3(4*kernel*COEF_pca(1,2),kernel*COEF_pca(2,2),kernel*COEF_pca(3,2),'linewidth',2)
hold on
plot3(4*kernel*COEF_pca(1,1),kernel*COEF_pca(2,1),kernel*COEF_pca(3,1),'linewidth',2)
hold on
plot3(40*kernel*COEF_pca(1,3),40*kernel*COEF_pca(2,3),40*kernel*COEF_pca(3,3),'linewidth',2)
title('Visualized Data with eigen vectors (matlab)');
xlabel('X');ylabel('Y');zlabel('Z');
%% Part C.2
figure()
Y_matlab = COEF_pca'*X';
scatter3(Y_matlab(1,:),Y_matlab(2,:),Y_matlab(3,:));
title('Visuallization of whitened Data (using matlab pca)');
xlabel('X');ylabel('Y');zlabel('Z');
covarianceY_matlab =cov(Y_matlab')
%%
%完整代码可通过知乎学术咨询获得:https://www.zhihu.com/consult/people/792359672131756032?isMe=1
[U_svd,S_svd,V_svd] = svd(X);

图片

图片

图片

图片

图片

图片

图片

图片

图片

图片

图片

图片

工学博士,担任《Mechanical System and Signal Processing》《中国电机工程学报》《控制与决策》等期刊审稿专家,擅长领域:现代信号处理,机器学习,深度学习,数字孪生,时间序列分析,设备缺陷检测、设备异常检测、设备智能故障诊断与健康管理PHM等。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Vue-Treeselect 树形下拉框的使用及常见问题记录

如果你想实现一个下拉树的组件,可以直接使用 element plus 中的 treeSelect 组件,但是如果你的项目正在用的是 element 2.X 版本,那么它是不包含 treeSelect 组件的,但是我们还是可以基于一些第三方的插件 比如:riopha…

2024吉林省电赛(达盛杯)

1. 电赛F4系统板3D图 提起自制STM32F407VET6系统板 2. 电赛原理图 3. 电赛PCB图 4. 智能车实物图 下图是电赛的实物图,结构采用3D打印 5. 软件设计 下图是程序设计图 6. 仿真视频 (1) 变化高度 2024吉林省电赛仿真1 (2) 变化轮距 2024电赛仿真2 7. APP控制小车 …

Vite + Vue3 + Electron 创建打包桌面程序

10 【Vite Vue3 Electron 创建打包桌面程序】 1.使用 Vite 构建 Electron 项目 1.1 创建 Vite 应用,安装 Electron 依赖 创建一个 Vite 项目 npm init vitelatest安装 Electron 相关依赖 npm install electron -D npm install vite-plugin-electron -D 1.2 在…

前端学习--React部分

文章目录 前端学习--React部分前言1.React简介1.1React的特点1.2引入文件1.3JSX🍉JSX简介与使用🍉JSX语法规则 1.4模块与组件🍉模块🍉组件 1.5安装开发者工具 2.React面向组件编程2.1创建组件🍉函数式组件&#x1f349…

sql注入利用group_concat函数

1.group_concat函数的作用: 首先根据group by指定的列进行分组,将同一组的列显示出来,并且用分隔符分隔。 2.group_concat运用 这里我使用的是sqllab-less1,通过对数据库的查询,我们发现数据库表名,列名&a…

机器之心 | 清华接手,YOLOv10问世:性能大幅提升,登上GitHub热榜

本文来源公众号“机器之心”,仅用于学术分享,侵权删,干货满满。 原文链接:清华接手,YOLOv10问世:性能大幅提升,登上GitHub热榜 相同性能情况下,延迟减少 46%,参数减少 2…

微软Copilot+ PC:Phi-Silica

大模型技术论文不断,每个月总会新增上千篇。本专栏精选论文重点解读,主题还是围绕着行业实践和工程量产。若在某个环节出现卡点,可以回到大模型必备腔调重新阅读。而最新科技(Mamba,xLSTM,KAN)则提供了大模…

美股重大变化,结算周期将从T+2变成T+1

KlipC报道:当地时间5月28日,美国证券交易结算时间将从“T2”改为“T1”。美股迎来历史性时刻。 目前,美股实行的是T0交易制度,T2结算交割制度。即投资者买入一只股票,当天可以卖出,但是交易的结算并不是立…

QT学习(20):QStyle和自定义样式

QStyle 样式(继承自QStyle类)代表控件的绘制并封装GUI的外观。QStyle是一个封装了GUI外观的抽象基类。Qt使用QStyle去执行几乎所有的内置控件的绘制,确保控件外观和原生控件风格风格相同。 class Q_WIDGETS_EXPORT QStyle : public QObject{…

Docker 基础使用 (1)

文章目录 Docker 软件安装Docker 镜像仓库Docker 仓库指令Docker 镜像指令Docker 容器指令Docker 使用实例 —— 搭建 nginx 服务nginx 概念nginx 使用用 docker 启动 nginx 侧重对docker基本使用的概览。 Docker 软件安装 Linux Ubuntu 依次执行以下指令即可 # 更新软件包列…

Spring:事务(tx)

1. 简介 spring对jdbc进行封装&#xff0c;简化对数据库的操作 2. HelloWorld 1. 搭建模块 2.加入依赖 <dependencies><!--spring jdbc Spring 持久化层支持jar包--><dependency><groupId>org.springframework</groupId><artifactId>s…

Unity Dotween 定位点的制作

目录 前言 一、动画预览 二、动画拆分 三、素材准备 四、曲线 OutCirc详解 五、速度分类详解 六、代码 七、组件和设置 八、作者的话 前言 我答应我的粉丝接下来更新Dotween系列&#xff0c;但是我一直没想好&#xff0c;从哪里开始讲。 Dotween的安装我就跳过了&…

一款220V降12V恒压芯片电路原理图WT5114

一款220V降12V恒压芯片电路原理图WT5114&#xff0c;电路图简示如下&#xff1a; 一款220V降12V恒压芯片线路图WT5114 WT5114是一款高性能、高精度、低成本的PWM电源开关&#xff0c;适用于非隔离降压和反激式应用。它集成了专用电流模式PWM控制器&#xff08;采用SOP8封装的高…

埃及媒体分发投放-新闻媒体通稿发布

埃及商业新闻 大舍传媒近日宣布将在埃及商业新闻领域展开新的媒体分发投放。作为埃及最具影响力的商业新闻平台之一&#xff0c;埃及商业新闻将为大舍传媒提供广阔的市场和受众群体。这一合作意味着大舍传媒将有机会通过埃及商业新闻的平台向埃及的商业精英和投资者传递最新的…

ACM Proceedings Template 使用方法

模板导入 打开ACM Primary Article Template官网&#xff0c;可以看到自带overleaf模板&#xff0c;接下来我们使用overleaf来自动导入模板。 选择你需要的ACM Conference or Journals模板&#xff0c;然后Open as Template 栏目说明 接下来依次解释一下左边栏目的作用 …

mail发送调用接口如何与三方服务无缝对接?

mail发送调用接口的性能怎么样&#xff1f;调用邮件接口的技巧&#xff1f; 为了提高效率和自动化水平&#xff0c;企业通常会选择使用mail发送调用接口。然而&#xff0c;仅仅使用这些接口还不够&#xff0c;如何与各种第三方服务无缝对接同样至关重要。AokSend将探讨如何有效…

再创佳绩丨达梦数据库一体机荣获2024数字中国创新大赛·信创赛道总决赛一等奖

5月24日&#xff0c;第七届数字中国建设峰会在福州盛大开幕&#xff0c;峰会内容安排包含开幕式、主论坛、分论坛、数字中国创新大赛、现场体验区及成果发布和专业工作会议等。武汉达梦数据库股份有限公司(以下简称达梦数据)受邀参加并在展、会、赛等多个环节深度参与。达梦全栈…

mac M3芯片 goland 2022.1 断点调试失败(frames are not available)问题,亲测有效

遇到如上问题&#xff0c;解法 步骤1&#xff1a;下载dlv文件 执行 go install github.com/go-delve/delve/cmd/dlvlatest 然后在 $GOPATH/bin里发现多了一个dlv文件 (找不到gopath? 执行 go env 可以看到) 步骤2&#xff1a;配置dlv 将这个dlv文件移到 /Applications/G…

vue中在mounted使用$refs获取不到DOM元素

vue中在mounted使用$refs获取不到DOM元素 前言解决方案1、通过使用$nextTick来获取2、updated中获取 前言 在使用ref的时候&#xff0c;在mounted中通过$ref获取节点是获取不到报undefined this.$refs.xx 为 undefined 解决方案 在mounted钩子中加载回来的数据不会在这个阶段更…

webpack5_相关知识点

webpack是一个现代JavaScript应用程序的静态模块打包器(module bundler) &#xff0c;是前端资源模块化管理和打包工具&#xff0c; 它可以将许多松散耦合的模块按照依赖和规则打包成符合生产环境部署的前端资源。还可以将按需加载的模块进行代码分离&#xff0c;等到实际需要时…