心电信号的PQRST模拟matlab代码(转载+自己调研汇总)
目前PQRST网上现成的代码有两份[1][2]
我们采用[2],原因是[1]中采用了lowpass这个函数,
[3]中提到:"注意,只有2018年之后的matlab才有lowpass, bandpass 函数。"
只想说[1]的代码略坑,难不成为了lowpass重装matlab吗?划不来。
所以还是用[2]吧
------------------------------------------------------------------------------------------------------------------------------------------------------
说下PQRST啥意思?
其实就是给一堆数据,进行离散点拟合。
但是不能乱拟合,需要体现一些医学特征
所以可以把PQRST理解为一种"满足医学需要的曲线拟合"。
------------------------------------------------------------------------------------------------------------------------------------------------------
数据集来自[4]
完整代码如下(下面其实包含了三种滤波器,最后一部分才是PQRST模拟):
close all;clear;clc;
sig=load('ecg_60hz_200.dat');
% sig=load('100.dat');% data=importdata('/home/appleyuchi/桌面/心电信号处理算法设计/data4.txt');
% sig=data';
%
% TIME=linspace(0,18.68,1868);%时间N=length(sig);
fs=100;
t=[0:N-1]/fs;
figure(1);subplot(4,2,1);plot(sig)
title('Original Signal')
%%% Low Pass Filter
b=1/32*[1 0 0 0 0 0 -2 0 0 0 0 0 1];
a=[1 -2 1];
sigL=filter(b,a,sig);
subplot(4,2,3);plot(sigL)
title('Low Pass Filter')
subplot(4,2,4);zplane(b,a)
%%% High Pass Filter
b=[-1/32 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 -1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1/32];
a=[1 -1];
sigH=filter(b,a,sigL);
subplot(4,2,5);plot(sigH)
title('High Pass Filter')
subplot(4,2,6);zplane(b,a)
%%% Derivative Base Filter
b=[1/4 1/8 0 -1/8 -1/4];
a=[1];
sigD=filter(b,a,sigH);
subplot(4,2,7);plot(sigD)
title('Derivative Base Filter')
subplot(4,2,8);zplane(b,a)
%%% be tavane 2 miresanim
sigD2=sigD.^2;
%%% normalization
signorm=sigD2/max(abs(sigD2));
%%h=ones(1,31)/31;
sigAV=conv(signorm,h);
sigAV=sigAV(15+[1:N]);
sigAV=sigAV/max(abs(sigAV));
figure(2);plot(sigAV)
title('Moving Average filter')
%%
treshold=mean(sigAV);
P_G= (sigAV>0.01);
figure(3);plot(P_G)
title('treshold Signal')
figure;plot(sigL)
%%
difsig=diff(P_G);
left=find(difsig==1);
raight=find(difsig==-1);
%%% run cancel delay% 6 sample delay because of LowPass filtering% 16 sample delay because of HighPass filtering
left=left-(6+16);
raight=raight-(6+16);
%%size(left)
size(raight)% P-QRS-t
for i=1:length(left);[R_A(i) R_t(i)]=max(sigL(left(i):raight(i)));R_t(i)=R_t(i)-1+left(i) %add offset[Q_A(i) Q_t(i)]=min(sigL(left(i):R_t(i)));Q_t(i)=Q_t(i)-1+left(i)[S_A(i) S_t(i)]=min(sigL(left(i):raight(i)));S_t(i)=S_t(i)-1+left(i)[P_A(i) P_t(i)]=max(sigL(left(i):Q_t(i)));P_t(i)=P_t(i)-1+left(i)[T_A(i) T_t(i)]=max(sigL(S_t(i):raight(i)));T_t(i)=T_t(i)-1+left(i)+47end
%%
figure;plot(t,sigL,t(Q_t),Q_A,'*g',t(S_t),S_A,'^k',t(R_t),R_A,'ob',t(P_t),P_A,'+b',t(T_t),T_A,'+r');
for i=1:((length(P_t))-1)HRV=P_t(i+1)-P_t(i)
end
------------------------------------------------------------------------------------------------------------------------------------------------------
运行结果如下:
注意,上述的PQRST代码适用信号有一个局限性,就是输入的数据"比较光滑比较密集",如下图中的Original Signal
-------------------------------------------------不适合情形--------------------------------------------------------------------------------------------
因为这种信号噪声没有滤除,所以不适合直接套用
-------------------------------------------------------故障分析-----------------------------------------------------------------------------------------------
另外注意,如果更换成自己的数据集报错的话。
原始信号不要有接入噪声,否则会导致[2]中程序报错:
Subscripted assignment dimension mismatch.
Error in PQRSTdetection (line 131)
[R_A(i) R_t(i)]=max(sigL(left(i):right(i)));
这个原因是代码中有对离散序列进行微分的操作.
最终要求left中的每个数值小于right
下面是故障现场:
P_G =
Columns 1 through 20
1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1
Columns 21 through 40
1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1
Columns 41 through 60
1 1 1 1 1 1 1 1 1 1 1 1 1 0 0 0 0 0 0 0(看到没?这里离散波形微分是-1)
....
也就是说P_G序列中必须上升沿先出现,上面的故障场景是下降沿先出现,
就会导致后面的left和right变量不存在left<right 的关系(故障时会有left>right),从而最终导致PQRST图形窗口无法绘制。
------------------------------------------------------------------------------------------------------------------------------------------------------
Reference:
[1]ECG SIGNAL PQRST PEAK DETECTION
[2]ECG P QRS T wave detecting matlab code
[3]MATLAB 低通滤波器 low pass filter
[4]http://people.ucalgary.ca/~ranga/enel563/SIGNAL_DATA_FILES/
心电信号的PQRST模拟matlab代码(转载+自己调研汇总)相关推荐
- Matlab心电信号的PQRST模拟-实验报告
心电信号处理算法设计-实验要求 data4 是一段实际采样得到的心电数据, 采样频率为 100Hz, 波形如下图所示.设计相应的算法, 计算心率, 单位为: 次/分钟.可能会用到的知识为数字滤波器的设 ...
- 基于指数平滑对心电信号进行PQRST模拟(第二种方案)
基于指数平滑对心电信号进行PQRST模拟,对下面的流程中的橙色部分进行实现. 第一种方案流程请见[1] 最终结果如下: 上述圆圈处是异常信号(幅度异常,以及与其他心拍距离异常),删除. 局部放大效果如 ...
- 根据心电信号计算心率的matlab代码
先说说现有的资料: [1][2]弄了FIR1还有hamming窗,搞得老麻烦了,扔一边先. --------------------------------------------------自己另外 ...
- 信号相角位移量的计算与信号位移计算-附Matlab代码
一.初始相角的位移量 在信号处理中正弦信号经常表示为 x ( n ) = A cos ( 2 π f 0 n / f s + θ ) x\left( n \right)=A\cos (2\pi { ...
- V2G汽车的蒙特卡洛模拟matlab代码,可以从电网充电也可以向电网放电
V2G汽车的蒙特卡洛模拟matlab代码,可以从电网充电也可以向电网放电. 充电开始时刻.放电时刻.日行驶里程等参数可以自己设置,易于修改. _:3120644246447334浪迹天涯
- V2G汽车的蒙特卡洛模拟matlab代码,可以从电网充电也可以向电网放电。 充电开始时刻、放电时刻、日行驶里程等参数可以自己设置,易于修改。
V2G汽车的蒙特卡洛模拟matlab代码,可以从电网充电也可以向电网放电. 充电开始时刻.放电时刻.日行驶里程等参数可以自己设置,易于修改. :4720644246447334浪迹天涯
- 心电图数据读取matlab程序,心电信号的提取及matlab编程.doc
MIT-BIH ECG 信号的数据读取方法和Matlab程序 收藏 ? ? 最近在写一篇基于小波变换的ECG信号压缩算法的论文,遇到了怎样获取ECG信号测试数据的问题,在百度和专业论坛里搜索了一番,发 ...
- Hilbert变换求信号的包络线及MATLAB代码
一.Hilbert变换表达式 Hilbert变换是信号与的卷积,表达式如下: 由于本质是卷积,因此可以从"线性系统","调幅-调频"等角度思考.进一步可参考如下 ...
- 【雷达】基于核聚类实现雷达信号在线分选附matlab代码
1 内容介绍 雷达信号分选是现代雷达侦察设备必须具备的功能‚它是利用测得的雷达信号参数‚将随机交迭的雷达信号分离成独立的雷达信号列‚为最终的雷达信号识别打下牢固的基础.在现代战争中‚雷达侦察接收机所处 ...
最新文章
- mysql重置auto_increment字段
- android jni 返回java类
- Spring 提供几种配置方式来设置元数据?
- Angular getOrCreateInjectable的实现原理调试
- MAC下搭建java的开发环境
- java创建类的三个步骤_3个简单步骤即可测试Java 8
- mysql如何优化性能优化_如何优化性能?MySQL实现批量插入以优化性能的实例详解...
- MS SQLSERVER中如何快速获取表的记录总数
- Myeclipse修改jdk版本流程
- 【Remoting-4】
- WORD打印时显示错误,未定义标签?
- Java实现搭积木_Java搭积木游戏
- Halo博客 -- ③ 本地运行
- 黑客帝国神级影评,转至豆瓣。 — — 哲思。
- 什么是时延?(延迟)
- 从零开始搭建ROS小车(绪论)
- python 逆序_python中逆序
- 工作一年了,小贺和大家说说心里话
- Marshmallow 快速文档
- 类似QQ管家会员页面的jquery轮换效果