【心电信号】Simulink胎儿心电信号提取【含Matlab源码 1550期】

news2024/11/29 20:37:42

⛄一、心电信号简介

0 引言
心电信号是人类最早研究的生物信号之一, 相比其他生物信号更易于检测, 且具有直观的规律。心电图的准确分析对心脏病的及早治疗有重大的意义。人体是一个复杂精密的系统, 有许多不可抗的外界因素, 得到纯净的心电信号非常困难。可以采用神经网络算法去除心电信号的噪声, 但这种方法存在训练难度大、耗时长的缺点。小波变换在处理非线性、非平稳且奇异点较多的信号时具有一定的优越性, 近年来许多学者使用其对心电信号进行研究。

1 心电信号简介
心电信号由以下几个波段组成, 一个典型的心电图如图1所示。
在这里插入图片描述
图1 典型心电图
(1) P波:反映心房肌在除极过程中的电位变化过程;
(2) P-R间期:反映的是激动从窦房结通过房室交界区到心室肌开始除极的时限;
(3) QRS波群:反映心室肌除极过程的电位变化;
(4) T波:代表心室肌复极过程中所引起的电位变化;
(5) S-T段:从QRS波群终点到达T波起点间的一段水平线[2];
(6) Q-T间期:心室从除极到复极的时间[3];
(7) U波:代表动作电位的后电位。
由于心电信号十分微弱, 且低频, 极易受到干扰, 不同的干扰源的噪声虽是随机的, 但来自同一个干扰源的噪声往往具有同一类特征。分析干扰的来源, 针对不同的来源使用合适的处理方法, 是数据采集重点考虑的一个问题。常见干扰有3种: (1) 工频干扰; (2) 基线漂移; (3) 肌电干扰。其中已经证明小波变换在抑制心电信号的工频干扰方面具有较大优势。具体噪声频带如表1所示。
表1 心电信号以及主要噪声频带
在这里插入图片描述

⛄二、部分源代码

%% Init
% clear all; close all;
Fs = 4e3;
Time = 40;
NumSamp = Time * Fs;
load Hd;

%% Mom’s Heartbeat
% In this example, we shall simulate the shapes of the electrocardiogram
% for both the mother and fetus. The following commands create an
% electrocardiogram signal that a mother’s heart might produce assuming
% a 4000 Hz sampling rate. The heart rate for this signal is approximately
% 89 beats per minute, and the peak voltage of the signal is 3.5 millivolts.
x1 = 3.5ecg(2700).'; % gen synth ECG signal
y1 = sgolayfilt(kron(ones(1,ceil(NumSamp/2700)+1),x1),0,21); % repeat for NumSamp length and smooth
n = 1:Time
Fs’;
del = round(2700*rand(1)); % pick a random offset
mhb = y1(n + del)'; %construct the ecg signal from some offset

axis([0 2 -4 4]);
grid;
xlabel(‘Time [sec]’);
ylabel(‘Voltage [mV]’);
title(‘Maternal Heartbeat Signal’);

%% Fetus Heartbeat
% The heart of a fetus beats noticeably faster than that of its mother,
% with rates ranging from 120 to 160 beats per minute. The amplitude of the
% fetal electrocardiogram is also much weaker than that of the maternal
% electrocardiogram. The following series of commands creates an electrocardiogram
% signal corresponding to a heart rate of 139 beats per minute and a peak voltage
% of 0.25 millivolts.
x2 = 0.25ecg(1725);
y2 = sgolayfilt(kron(ones(1,ceil(NumSamp/1725)+1),x2),0,17);
del = round(1725
rand(1));
fhb = y2(n + del)';
subplot(3,3,2); plot(t,fhb,‘m’);
axis([0 2 -0.5 0.5]);
grid;
xlabel(‘Time [sec]’);
ylabel(‘Voltage [mV]’);
title(‘Fetal Heartbeat Signal’);

%% The measured signal
% The measured fetal electrocardiogram signal from the abdomen of the mother is
% usually dominated by the maternal heartbeat signal that propagates from the
% chest cavity to the abdomen. We shall describe this propagation path as a linear
% FIR filter with 10 randomized coefficients. In addition, we shall add a small
% amount of uncorrelated Gaussian noise to simulate any broadband noise sources
% within the measurement. Can you determine the fetal heartbeat rate by looking
% at this measured signal?

%axis tight;
grid;
xlabel(‘Time [sec]’);

%% Measured Mom’s heartbeat
% The maternal electrocardiogram signal is obtained from the chest of the mother.
% The goal of the adaptive noise canceller in this task is to adaptively remove the
% maternal heartbeat signal from the fetal electrocardiogram signal. The canceller
% needs a reference signal generated from a maternal electrocardiogram to perform this
% task. Just like the fetal electrocardiogram signal, the maternal electrocardiogram
% signal will contain some additive broadband noise.
x = mhb + 0.02*randn(size(mhb));
subplot(3,3,4); plot(t,x);
axis([0 2 -4 4]);
grid;
xlabel(‘Time [sec]’);
ylabel(‘Voltage [mV]’);
title(‘Reference Signal’);

%% Applying the adaptive filter
% The adaptive noise canceller can use almost any adaptive procedure to perform its task.
% For simplicity, we shall use the least-mean-square (LMS) adaptive filter with 15
% coefficients and a step size of 0.00007. With these settings, the adaptive noise canceller
% converges reasonably well after a few seconds of adaptation–certainly a reasonable
% period to wait given this particular diagnostic application.

h = adaptfilt.lms(15, 0.001);
[y,e] = filter(h,x,d);

% [y,e] = FECG_detector(x,d);

%axis([0 7.0 -4 4]);
grid;
xlabel(‘Time [sec]’);
ylabel(‘Voltage [mV]’);
title(‘Convergence of Adaptive Noise Canceller’);
legend(‘Measured Signal’,‘Error Signal’);

%% Recovering the fetus’ hearbeat
% The output signal y(n) of the adaptive filter contains the estimated maternal
% heartbeat signal, which is not the ultimate signal of interest. What remains in the
% error signal e(n) after the system has converged is an estimate of the fetal heartbeat
% signal along with residual measurement noise.
subplot(3,3,6); plot(t,e,‘r’); hold on; plot(t,fhb,‘b’);
axis([Time-4 Time -0.5 0.5]);
grid on;
xlabel(‘Time [sec]’);
ylabel(‘Voltage [mV]’);
title(‘Steady-State Error Signal’);
legend(‘Calc Fetus’,‘Ref Fetus ECG’);

%% Counting the peaks to detect the heart rate
% The idea is to clean up the signal, and then set some dynamic threshold, so that any signal
% crossing the threshold is considered a peak. The peaks can be counted per time window.
%[num,den] = fir1(100,100/2000);
filt_e = filter(Hd,e);
subplot(3,3,7); plot(t,fhb,‘r’); hold on; plot(t,filt_e,‘b’);

xlabel(‘Time [sec]’);
ylabel(‘Voltage [mV]’);
title(‘Filtered signal’);
legend(‘Ref Fetus’,‘Filtered Fetus’);
thresh = 4*mean(abs(filt_e))*ones(size(filt_e));
peak_e = (filt_e >= thresh);
edge_e = (diff([0; peak_e]) >0);
subplot(3,3,8); plot(t,filt_e,‘c’); hold on; plot(t,thresh,‘r’); plot(t,peak_e,‘b’);
xlabel(‘Time [sec]’);
ylabel(‘Voltage [mV]’);
title(‘Peak detection’);
legend(‘Filtered fetus’,‘Dyna thresh’,‘Peak marker’, ‘Location’,‘SouthEast’);
axis([Time-4 Time -0.5 0.5]);
subplot(3,3,9); plot(t,filt_e,‘r’); hold on; plot(t,edge_e,‘b’); plot(0,0,‘w’);
fetus_calc = round((60/length(edge_e(16001:end))Fs) sum(edge_e(16001:end)));
fetus_bpm = [‘Fetus Heart Rate =’ mat2str(fetus_calc)];
xlabel(‘Time [sec]’);
ylabel(‘Voltage [mV]’);
title(‘Reconstructed fetus signal’);
legend(‘Fetus Sig’,‘Edge marker’,fetus_bpm, ‘Location’,‘SouthEast’);
axis([Time-4 Time -0.5 0.5]);


## ⛄三、运行结果
![在这里插入图片描述](https://img-blog.csdnimg.cn/afb1a9786ced450aa14e022fbc16fc65.jpg?x-oss-process=image/watermark,type_ZHJvaWRzYW5zZmFsbGJhY2s,shadow_50,text_Q1NETiBA57Sr5p6B56We5YWJ,size_20,color_FFFFFF,t_70,g_se,x_16#pic_center)

## ⛄四、matlab版本及参考文献
**1 matlab版本**
2014a

**2 参考文献**
[1]焦运良,邢计元,靳尧凯.基于小波变换的心电信号阈值去噪算法研究[J].信息技术与网络安全. 2019,38(05)

**3 备注**
简介此部分摘自互联网,仅供参考,若侵权,联系删除

 

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

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

相关文章

MongoDB 分片集群

之前说到了主从集群,关于主从集群的搭建以及细节后面会再次分享,这次我们先初步来看看 分片集群 举个例子 例如我们有几百G甚至更多的数据,可是我们只有单个副本集,数据量这么大,网络 IO ,CPU &#xff0c…

《深度学习的数学》chap1 神经网络的思想

《深度学习的数学》chap1 神经网络的思想 文章目录1-1 神经网络和深度学习神经网络用神经网络实现的人工智能“人教导机器”类型的人工智能的问题1-2 神经元工作的数学表示整理神经元的工作神经元工作的数学表示点火条件的图形表示1-3 激活函数:将神经元的工作一般化…

开源项目-排班管理系统,考勤管理系统

哈喽,大家好,今天给大家带来一个开源系统-排版管理系统 ​​​​​​​git上搜索可以FinalScheduler-master可以了解详情 也可以通过csdn下载​​​​​​​ 该系统主要用于人员的排班使用,主要用人员管理,排班管理&#xff0c…

Java-ForkJoinPool(线程池-工作窃取算法)

文章目录概述工作窃取算法工作窃取算法的优缺点使用 ForkJoinPool 进行分叉和合并ForkJoinPool使用RecursiveActionRecursiveTaskFork/Join 案例Demo概述 Fork 就是把一个大任务切分为若干个子任务并行地执行,Join 就是合并这些子任务的执行结果,最后得到…

《精神与爱欲》爱源于母性,且超越性别

《精神与爱欲》爱源于母性,且超越性别 赫尔曼黑塞(1877-1962),作家,诗人,画家。1877年生于德国,1924年入籍瑞士。1946年获诺贝尔文学奖。被誉为“德国浪漫派的最后一位骑士”。 文章目录《精神与…

扩展函数和运算符重载

扩展函数和运算符重载 扩展函数 扩展函数表示在不改变某个类的源代码的情况下,仍然可以打开这个类,向该类中添加新的函数为了能够更好的理解扩展函数的功能,先来思考一个问题:给定一个字符串,这个字符串由字母,数字,特殊符号组成,我们想要统计这个字符串当中字母的个数可以这…

第十章 开源许可证

软件是一种著作,天然是拥有版权的。很多人会认为放在 Github 上的就是开源软件,既然放了源代码,我就可以随便使用了。其实版权法规定著作是禁止共享的,也就是说没有许可证的软件等于保留版权。虽然源代码公开了,但并不…

GUI编程--PyQt5--QLabel

文章目录QLabel 文本展示QLabel 图片展示QLCDNumberQProgressBarQErrorMessageQProgressDialogQLabel 文本展示 展示文本、富文本、图片、动画。 # 实例化 label QLabel(self) # 设置文本 label.setText("666") # 设置图片 label.setPixmap(QPixmap) label.resize…

[BUG] runtime network not ready: NetworkReady=false reason:NetworkPluginNotRead

1 背景 执行kubectl get node是发现节点是NotReady状态,接着执行kubectl describe node 节点名 详细查看NotReady状态原因如下: runtime network not ready: NetworkReadyfalse reason:NetworkPluginNotReady message:docker: network plugin is not r…

数据结构之线性表中的双向循环链表【详解】

前言: 嗯!昨天我们的无头单向非循环链表咱已经是可以顺利完成出来了的,今天我们就来看一下什么是有头双向循环链表,不要看着这个链表又双向又循环的就比单向不循环链表难,其实这个更加的简单哦!前提是你有…

SpringBoot SpringBoot 原理篇 1 自动配置 1.17 自动配置原理【3】

SpringBoot 【黑马程序员SpringBoot2全套视频教程,springboot零基础到项目实战(spring boot2完整版)】 SpringBoot 原理篇 文章目录SpringBootSpringBoot 原理篇1 自动配置1.17 自动配置原理【3】1.17.1 看源码了1.17.2 小结1 自动配置 1.…

【STA】(1)引言

目录 1. 纳米级设计 2. 什么是STA 3. 为什么要进行STA 4. 设计流程 5. 不同阶段的STA 6. STA的局限性 1. 纳米级设计 在半导体器件中,金属互连线通常被用来连接电路中的各个部分,进而实现整个芯片。随着制造工艺的进一步缩小,这些互连线…

【电源专题】案例:不导这颗MOS管的原因是在电路上不通用?

本案例发生在MOS管替代料导入时。正常情况下在替代料导入、部品导入的时候,我们需要查看规格书。怎么查找规格书可以看文章【电子通识】芯片资料查询方法 对于一些关键的信息我们要做对比,一般来说要通过列表进行对比。但因为不同的供应商的测试标准不同,有很多是很难对比的…

信号与系统2——LTI

信号与系统2——LTI一、Introduction1. Representation of LTI systems2. Significance of unit impulse二、DT-LTI:Convolution Sum1. Output2. Impulse response of LTI system H3. Convolution sum4. Convolution Sum Evaluation Procedure5. Sequence Convoluti…

Python 数据容器(1) - list(列表)

文章目录什么是数据容器?Python中的数据容器数据容器:list(列表)基本语法案例演示列表的下标(索引)列表常用操作list容器操作总结什么是数据容器? 一种可以容纳多份数据的数据类型,容…

算法学习 | 回溯算法之深度优先搜索常见题型练习

目录 岛屿的最大面积 电话号码的字母组合 二进制手表 组合总数 活字印刷 岛屿的最大面积 题目链接:leetcode-695.岛屿的最大面积 示例 输入:grid [[0,0,1,0,0,0,0,1,0,0,0,0,0],[0,0,0,0,0,0,0,1,1,1,0,0,0],[0,1,1,0,1,0,0,0,0,0,0,0,0],[0,…

线程“八锁“ synchronized到底是对哪个对象加锁?

线程"八锁" synchronized到底是对哪个对象加锁? 习题一 class Number{public synchronized void a(){System.out.println("1");}public synchronized void b(){System.out.println("2");} } public class TestBlock {public static void main(…

从Zemax OpticStudio导入光学系统

摘要 ZemaxOpticStudio是一款广泛使用的光线追迹软件。VirtualLab Fusion可以从Zemax OpticStudio导入光学系统,包括完整3D位置信息和镜片玻璃。导入后,光学系统的结构数据将显示为单独的表面或可以组合成VirtualLab Fusion中的组件。VirtualLab Fusion可…

docker入门(一):在centOS虚拟机上安装docker

索引CentOS虚拟机安装1.下载CentOS镜像问题1-报错“您已输入用户名,客户机操作系统将保留此用户名”2.根据docker官方指导进行安装1.卸载旧版本(初次安装可以忽略)2.确保能联网后下载前置软件包3.设置镜像库(阿里版)4.…

CLIP后续--LSeg,GroupViT,ViLD

这个博客开了有两个月,一直没写成,最近封寝给它完成~躺平第三天 CLIP应用领域概览: 1. LSeg 原论文地址:https://arxiv.org/abs/2201.03546 代码:https://github.com/isl-org/lang-seg 这个图就很清楚的说明了zero…