ECG处理程序


#data_process = (X_train[5,:,11] - np.roll(data_process,10))/10 #差分
#print(data_process)
import matplotlib.pyplot as plt
from scipy.signal import medfilt
def Slope_condition(data_process, location, Scope, Threshold):for i in range(Scope,0,-1):# 逐渐缩小范围找斜率满足要求的点if location-i>=0 and location+i<=999 :Slope_left = (data_process[location]-data_process[location-i])*100 # 100Hz, 计算左斜率Slope_right = (data_process[location+i]-data_process[location])*100  # 100Hz, 计算右斜率if Slope_left*Slope_right<(Threshold/(Scope-i+1)):return 1else :continuereturn 0 #这样都找不到,那就没有def R_location(data_process, P_N, threshold, baseline):Xlim = []Ylim = []# print(data_process.shape)if P_N == "+":candidate = np.where((data_process-baseline)>=threshold)if P_N == "-":candidate = np.where((data_process-baseline)<=threshold)candidate = candidate[0]# print(candidate)# print(len(candidate))if len(candidate)==0:return Xlim, YlimData_max = data_process[candidate[0]]#print(Data_max)max_index = candidate[0]#print(max_index)for i in candidate:# print(i)if max_index != i-1 and max_index != i :  # 有间断再输出,并且进行下一段比较S_C = Slope_condition(data_process, max_index, 5, -500) #斜率状态if len(Xlim)==0:if S_C :Xlim.append(max_index)Ylim.append(Data_max)else :if S_C and max_index-Xlim[-1]>40: # 一般心率不会超过250/minXlim.append(max_index)Ylim.append(Data_max)# print(Data_max, max_index)max_index = iData_max = data_process[i]else :if Data_max < data_process[i] and P_N == "+" :  # 比较Data_max = data_process[i]max_index = iif Data_max > data_process[i] and P_N == "-" :  # 比较Data_max = data_process[i]max_index = i#print(data_process[i])#print(i)if len(Xlim)==0:return Xlim, Ylimif max_index != 999 and max_index-Xlim[-1]>40 and Slope_condition(data_process, max_index, 5, -500):Xlim.append(max_index)Ylim.append(Data_max)return Xlim, Ylimdef R_location_supplement(data_process,  P_N, Xlim_S, Scope):Xlim = []Ylim = []for i in Xlim_S:Data_max = data_process[i-Scope]max_index = i-Scopefor j in range(i-Scope+1, i+Scope):if j>=1000 :breakif j<=0 :continueif Data_max < data_process[j] and P_N == "+" : # 在一个范围内找最大值 Data_max = data_process[j]max_index = jif Data_max > data_process[j] and P_N == "-" :Data_max = data_process[j]max_index = jXlim.append(max_index)Ylim.append(Data_max)#Xlim.append(i)#Ylim.append(data_process[i])return Xlim, Ylimdef R_location_Sup(data_person, threshold, high):for i in [11,10,9,5,2,1,0]:data_process = data_person[:, i]Baseline = medfilt(data_person[:, i],51)Xlim, Ylim = R_location(data_process, P_N="+", threshold = high, baseline = Baseline)if len(Xlim) >= threshold : #默认心跳频率高于48次/minbreakif len(Xlim) < threshold :Xlim, Ylim = R_location_Sup(data_person=data_person, threshold=threshold, high = high/2)return Xlim, Ylimdef Q_location(data_process,location, Scope):Q_min = data_process[location]Q_l = locationfor i in range(location, location-Scope, -1):if i>=0 :if data_process[i] < Q_min :  #向左在一定范围内找最小(判定条件)Q_min = data_process[i]Q_l = ielse :breakreturn Q_l, Q_mindef S_location(data_process,location, Scope):S_min = data_process[location]S_l = locationfor i in range(location, location+Scope, 1):if i<=999 :if data_process[i] < S_min :  #向右在一定范围内找最小(判定条件)S_min = data_process[i]S_l = ielse :breakreturn S_l, S_mindef Q_S_location(data_process, Xlim_S, Scope):Q_Xlim = []Q_Ylim = []S_Xlim = []S_Ylim = []for i in Xlim_S:Q_X,Q_Y = Q_location(data_process, i, Scope)S_X,S_Y = S_location(data_process, i, Scope)Q_Xlim.append(Q_X)Q_Ylim.append(Q_Y)S_Xlim.append(S_X)S_Ylim.append(S_Y)return Q_Xlim, Q_Ylim, S_Xlim, S_Ylimdef base_leave(data_process, location, Scope, PT, baseline):T_max = abs(data_process[location]-baseline[location])T_l = locationif PT == 'P':range_start = locationrange_end = location+Scopeif PT == 'T':range_start = location-Scoperange_end = location# print(distance)for i in range(range_start, range_end):if i>=1000 :breakif i<0 :continueif abs(data_process[i]-baseline[i]) > T_max :  #  找到离基线最远的点T_max = abs(data_process[i]-baseline[i])T_l = i#if Slope_condition(data_process, T_l, 1, -0) == 0 and (range_end-range_start) > 4:#T_l, data_process[T_l] = base_leave(data_process=data_process, location=location, Scope = Scope, PT=PT, baseline=baseline, distance = distance+1)return T_l, data_process[T_l]def mm_where(data_process, range_start, range_end, P_N = 'max'):T_MM = data_process[range_start]T_l = range_startif P_N == 'max':for i in range(range_start, range_end):if i>=1000 :breakif i<0 :continueif data_process[i] > T_MM :T_MM = data_process[i]T_l = iif P_N == 'min':for i in range(range_start, range_end):if i>=1000 :breakif i<0 :continueif data_process[i] < T_MM :T_MM = data_process[i]T_l = ireturn T_l, T_MMdef PT_location_supplement(data_process, T_Xlim, Scope, PT, baseline):Xlim = []Ylim = []count = 0for i in T_Xlim:count = count+1T_l, T_MM = base_leave(data_process, i, int(Scope[count-1]), PT = PT, baseline = baseline)  # 以在一定范围内离基线最远为判定条件Xlim.append(T_l)Ylim.append(T_MM)return Xlim, Ylimdef Space(Xlim):# 循环左移Xlim_start = np.delete(Xlim, len(Xlim)-1)Xlim_end = np.roll(Xlim, -1)Xlim_end = np.delete(Xlim_end, len(Xlim_end)-1)space = Xlim_end-Xlim_startspace = np.r_[Xlim[0], space, 1000-Xlim[-1]]space.astype(int)return spacedef Space_P(Q_Xlim, TFR_Xlim):Xlim_start = np.r_[0, TFR_Xlim]Xlim_end = np.r_[Q_Xlim, 999]space = Xlim_start - Xlim_endspace.astype(int)return spacedef foot_find(data_process, location, Scope, direction, Baseline):if direction == 'right':S = locationE = location+ScopeD = 1if direction == 'left':S = locationE = location-ScopeD = -1for i in range(S,E,D):if (i+1)>=999:breakif i<0 :continuehigh_R = data_process[i+1]-Baseline[i+1]high = data_process[i]-Baseline[i]if (high*high_R)<0:if(abs(high)<abs(high_R)):return i, data_process[i]if(abs(high)>abs(high_R)):return i+1, data_process[i+1]return i, data_process[i]def TF_location(data_process, Xlim, Scope, direction, Baseline):TFXlim = []TFYlim = []for i in Xlim:TFX, TFY = foot_find(data_process=data_process, location=i, Scope=Scope, direction=direction, Baseline=Baseline)TFXlim.append(TFX)TFYlim.append(TFY)return TFXlim, TFYlimdef PT_location(data_process, Xlim_S, Scope, PT, baseline):space = Space(Xlim_S)#print(space)space.astype(int)if PT == 'P':space = np.delete(space, len(space)-1) #需要左边的间距middle = Xlim_S - space//2  # 获得左边中间位置if PT == 'T':space = np.delete(space, 0)  #需要右边的间距middle = Xlim_S + space//2  # 获得右边中间位置middle[middle > 999] = 999  # 去掉索引超出范围的点middle[middle < 0] = 0middle = middle.astype(int)#print(middle,"middle")#print(Scope)PT_Xlim, PT_Ylim = PT_location_supplement(data_process, middle, Scope=space//2-Scope, PT = PT, baseline = baseline)return PT_Xlim, PT_Ylimdef P_location(data_process, Q_Xlim, TFR_Xlim, Scope, Baseline):P_Xlim = []P_Ylim = []space = Space_P(Q_Xlim, TFR_Xlim)-Scopefor i in range(len(TFR_Xlim)):P_X, P_Y = base_leave(data_process=data_process, location=TFR_Xlim[i], Scope=space[i], PT='P', baseline=Baseline)P_Xlim.append(P_X)P_Ylim.append(P_Y)return P_Xlim, P_Ylim
count = 0
for k in range(0,1):count = count+1if y_train.values[k] ==['NORM']:print(y_train.values[k],k)"""data_person = X_train[k, :, :]# data_process = data_person[:, 0]Xlim, Ylim = R_location_Sup(data_person, threshold=8, high=0.05)# print(Xlim)#T_Xlim, T_Ylim = T_location(data_person[:, index], Xlim, 3)for i in range(1, 12):if i in [9, 10, 11]:Xlim_S, Ylim_S = R_location_supplement(data_person[:, i], P_N="+", Xlim_S=Xlim, Scope=10)else:Xlim_S, Ylim_S = R_location_supplement(data_person[:, i], P_N="+", Xlim_S=Xlim, Scope=5)# print(Xlim_S)Q_Xlim, Q_Ylim, S_Xlim, S_Ylim = Q_S_location(data_person[:, i], Xlim_S, Scope=10)Baseline = medfilt(data_person[:, i], 11)T_Xlim, T_Ylim = PT_location(data_person[:, i], S_Xlim, 5, 'T', Baseline)TFR_Xlim, TFR_Ylim = TF_location(data_person[:, i], T_Xlim, 50, 'right', Baseline)TFL_Xlim, TFL_Ylim = TF_location(data_person[:, i], T_Xlim, 50, 'left', Baseline)P_Xlim, P_Ylim = PT_location(data_person[:, i], Q_Xlim, 5, 'P', Baseline)# print(type(y_train))# print(y_train.index)plt.figure(figsize=(15, 24))plt.subplot(12, 1, i+1)plt.plot(P_Xlim, P_Ylim, 'ko')plt.plot(T_Xlim, T_Ylim, 'bo')plt.plot(Q_Xlim, Q_Ylim, 'go')plt.plot(S_Xlim, S_Ylim, 'yo')plt.plot(Xlim_S, Ylim_S, 'ro')plt.plot(data_person[:, i])plt.plot(Baseline)plt.grid()plt.show()"""
print(count)
# plt.savefig("1.jpg")

PTB-XL处理程序相关推荐

  1. 图像算法:数字图像处理程序大全

    图像算法:数字图像处理程序大全 SkySeraph Apr 22nd 2011  HQU Email:zgzhaobo@gmail.com    QQ:452728574 Latest Modifie ...

  2. Spring MVC-处理程序映射(Handler Mapping)-简单的Url处理程序映射(Simple Url Handler Mapping)示例(转载实践)...

    以下内容翻译自:https://www.tutorialspoint.com/springmvc/springmvc_simpleurlhandlermapping.htm 说明:示例基于Spring ...

  3. mysql定义条件和处理_MySQL定义条件和处理程序

    在程序的运行过程中可能会遇到问题,此时我们可以通过定义条件和处理程序来事先定义这些问题. 定义条件是指事先定义程序执行过程中遇到的问题,处理程序定义了在遇到这些问题时应当采取的处理方式和解决办法,保证 ...

  4. 现在无法开始异步操作。异步操作只能在异步处理程序或模块中开始,或在页生存期中的特定事件过程中开始...

    异常处理汇总-后端系列 http://www.cnblogs.com/dunitian/p/4523006.html 这篇没啥技术含量,用来小记一番 错误信息 "System.Invalid ...

  5. 这就是为什么我们需要在React的类组件中绑定事件处理程序

    by Saurabh Misra 索拉·米斯拉(Saurabh Misra) 这就是为什么我们需要在React的类组件中绑定事件处理程序 (This is why we need to bind ev ...

  6. 基于qml创建最简单的图像处理程序(1)-基于qml创建界面

    <基于qml创建最简单的图像处理程序>系列课程及配套代码 基于qml创建最简单的图像处理程序(1)-基于qml创建界面 http://www.cnblogs.com/jsxyhelu/p/ ...

  7. Linux内核之内存管理(4)--缺页处理程序

    本文主要解说缺页处理程序,凝视足够具体,不再解释. //以下函数将一页内存页面映射到指定线性地址处,它返回页面的物理地址 //把一物理内存页面映射到线性地址空间指定处或者说把线性地址空间指定地址add ...

  8. 使用 SAX 解析器简化文档处理程序的编写

    http://www-900.ibm.com/developerWorks/cn/xml/x-dochan.shtml 有时候 SAX 文档处理程序的代码可能变得非常麻烦.结构性差而且难以维护,尤其是 ...

  9. MySQL定义条件和处理程序_MySQL教程111-MySQL定义条件和处理程序

    在程序的运行过程中可能会遇到问题,此时我们可以通过定义条件和处理程序来事先定义这些问题. 定义条件是指事先定义程序执行过程中遇到的问题,处理程序定义了在遇到这些问题时应当采取的处理方式和解决办法,保证 ...

  10. 后处理程序文件大小的变量_【每日一题】(17题)面试官问:JS中事件流,事件处理程序,事件对象的理解?...

    关注「松宝写代码」,精选好文,每日一题 作者:saucxs | songEagle 2020,实「鼠」不易 2021,「牛」转乾坤 风劲潮涌当扬帆,任重道远须奋蹄! 一.前言 2020.12.23 立 ...

最新文章

  1. 第十七届全国大学生智能车竞赛开始啦
  2. Java常用类之String类练习
  3. link time code generation
  4. 在Linux系统里安装Virtual Box的详细步骤 1
  5. SNF开发平台WinForm之五-高级查询使用说明-SNF快速开发平台3.3-Spring.Net.Framework
  6. 8-4 Fabled Rooks uva11134
  7. Cannot resolve symbol 'R',Failed to resolve: constraint-layout
  8. 步步为营 .NET 代码重构学习笔记 十四
  9. Dojo学习2 dojo快速安装
  10. c++11中using的使用
  11. HTML的Demo实例
  12. C#操作Word书签
  13. ios 合并图片显示
  14. 求最小公倍数_Java
  15. 用个人微信小号代替【Server酱】推送消息通知
  16. 三星Galaxy之父×××网秦,网秦安全能否脱胎换骨?
  17. 数字化转型 — 新能源汽车 — 生产制造流程 — 总装车间
  18. “2.17亿中国电信”拿下国家税务局云平台项目,H3C却是最大赢家
  19. 【Robomaster】电控入门手册
  20. python axes3d函数_Python绘制3D图形:Axes3D

热门文章

  1. 如何基于磁盘 KV 实现 Bitmap
  2. torch.cat()函数 ,关于四维tensor维度合并。
  3. pwnalbe.kr --collision
  4. 防止工具(八门神器)进行内存修改的方法
  5. [转] 看看清华的同学在四年的大学中干什么吧,非常值得我们去学习。『天行键,君子以自强不息;地势坤,君...
  6. 工具软件价值分化,Adobe、万兴科技、猎豹移动们为何不同命?
  7. java 生鲜在线购买网站 ssm生鲜商城
  8. 如何用python点亮一盏灯
  9. 虚拟机增加磁盘空间(VMware虚拟机)
  10. JavaStream流处理数据的几种方式