EMD关于信号的重建,心率提取

2024-03-31 06:12
文章标签 提取 信号 emd 重建 心率

本文主要是介绍EMD关于信号的重建,心率提取,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

关于EMD的俩个假设:

IMF 有两个假设条件:

  • 在整个数据段内,极值点的个数和过零点的个数必须相等或相差最多不能超过一 个;
  • 在任意时刻,由局部极大值点形成的上包络线和由局部极小值点形成的下包络线 的平均值为零,即上、下包络线相对于时间轴局部对称。

先安装pyEMD库 

from pyEMD import EMD  (报错)
执行pip uninstall pyEMD
pip install EMD-signal==1.4.0 -i https://pypi.tuna.tsinghua.edu.cn/simple/

代码部分:

from PyEMD import EMD
import numpy as np
import matplotlib
matplotlib.use('TkAgg')
import matplotlib.pyplot as plt
from scipy.signal import find_peaks
from scipy import signal#读取信号数据
def readtxt(path):with open(path,'r') as f:str=f.readline()list = str.split(' ')list1=[];for i,x in enumerate(list):if ((i%5 == 0) or (i%5 == 1) or (i%5 == 2)) and x !='':list1.append(float(x))return list1def pyem(lis):emd = EMD()IMFs = emd.emd(np.array(lis))print(len(IMFs), len(IMFs[0]), type(IMFs))#计算周期和频率imfs = emd.imfs# 估计瞬时频率和周期freqs = []periods = []for imf in imfs:if len(imf) > 1:# 计算频率sample_rate = 1 / (imf.argmax() / len(imf))freq = sample_rate / len(imf)print(freq)freqs.append(freq)# 计算周期period = 1 / freqprint(period)periods.append(period)fig = plt.figure()ax = fig.add_subplot(len(IMFs) + 1, 1, 1)ax.plot(np.array(lis))for i in range(len(IMFs)):ax = fig.add_subplot(len(IMFs) + 1, 1, i + 2)ax.plot(IMFs[i])plt.show()lr = 0for i,s in enumerate(IMFs):if i>len(IMFs-1)/2+1:lr +=sreturn lr#获取心率
def findPeaks(list):# x = electrocardiogram()[2000:4000]# jus=[1,2,3,4,10,1,2,3,4,21,1,2,2,3]#获取列表最小值,然后减去最小值# list_N = list[20000:30000]list_N = listavg = sum(list_N)/len(list_N);list_D=[]for i in range(len(list_N)):list_D.append(list_N[i]-avg)#列表转换数组y=np.array(list_D)#消除趋势线z=signal.detrend(y)#结果抽取200点,降频,然后再获取数据的脉率pl=200;fs=len(list_N)#参照值比BP = fs/pl;#进行趋势拟合x=signal.resample(z,pl)#获取最小值作为条件限制hu=min(x)peaks, _ = find_peaks(x, height=hu)# print(peaks)# 实际的心率值# print(len(peaks))##获取相邻俩个峰值之间的点数,然后计算心率值for i,d in enumerate(peaks):  #打印查看脉搏波的数值print(peaks[i])a1 = peaks[0]a2 = peaks[1]a3= a2-a1#计算每个脉搏对应的点数R_point = a3*BP#以60为节点计算的数值rate=60*(500/R_point)# print("bass",bass)#总的点数除以每一个脉搏对应的点数,然后除以90秒对应的值# rate = (len(list)/R_point)/1.5plt.plot(x)plt.plot(peaks, x[peaks], "x")plt.plot(np.zeros_like(x), "--", color="gray")plt.show()return rateif __name__ == "__main__":path = "../362a7e1de4dd484a9b4a3274a0e5a633_1648249928320.txt" #正常# path = "../a7c9bff53f2e4a70af7a9f641552507a_1706541122_1706564288403_887_1.txt"  #异常ll = readtxt(path)imf = pyem(ll[2000:10000])plt.plot(imf)plt.show()print(findPeaks(imf))

运行结果:

这是IMFS的分解图9个,从低频一直到高频

 因为最后一个是趋势项,我们将IMF[5]、IMF[6]、IMF[7]进行叠加,这几本接近我们的目标信号

然后对目标信号进行峰值提取:

总结:

信号分量的处理

通过经验模态分解(EMD)得到了信号的分量,可以进行许多不同的分析和处理操作,以下是一些常见的对分量的利用方向:

(1)信号重构:将分解得到的各个本征模态函数(IMF)相加,可以重构原始信号。这可以用于验证分解的效果,或者用于信号的重建和恢复。

(2)去噪:对于复杂的信号,可能存在噪声或干扰成分。通过分析各个IMF的频率和振幅,可以识别和去除信号中的噪声成分。

(3)频率分析:分析每个IMF的频率成分,可以帮助理解信号在不同频率上的振荡特性,从而揭示信号的频域特征。

(4)特征提取:每个IMF代表了信号的局部特征和振荡模式,可以用于提取信号的特征,并进一步应用于机器学习或模式识别任务中。

(5)信号预测:通过对分解得到的各个IMF进行分析,可以探索信号的未来趋势和发展模式,从而用于信号的预测和预测建模。

(6)模式识别:分析每个IMF的时域和频域特征,可以帮助对信号进行模式识别和分类,用于识别信号中的不同模式和特征。

(7)异常检测:通过分析每个IMF的振幅和频率特征,可以用于探测信号中的异常或突发事件,从而用于异常检测和故障诊断。

在得到了信号的分量之后,可以根据具体的应用需求选择合适的分析和处理方法,以实现对信号的深入理解、特征提取和应用。

这篇关于EMD关于信号的重建,心率提取的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/863603

相关文章

无线路由器哪个品牌好用信号强? 口碑最好的三个路由器大比拼

《无线路由器哪个品牌好用信号强?口碑最好的三个路由器大比拼》不同品牌在信号覆盖、稳定性和易用性等方面各有特色,如何在众多选择中找到最适合自己的那款无线路由器呢?今天推荐三款路由器让你的网速起飞... 今天我们来聊聊那些让网速飞起来的路由器。在这个信息爆炸的时代,一个好路由器简直就是家庭网编程络的心脏。无论你

电脑显示hdmi无信号怎么办? 电脑显示器无信号的终极解决指南

《电脑显示hdmi无信号怎么办?电脑显示器无信号的终极解决指南》HDMI无信号的问题却让人头疼不已,遇到这种情况该怎么办?针对这种情况,我们可以采取一系列步骤来逐一排查并解决问题,以下是详细的方法... 无论你是试图为笔记本电脑设置多个显示器还是使用外部显示器,都可能会弹出“无HDMI信号”错误。此消息可能

python解析HTML并提取span标签中的文本

《python解析HTML并提取span标签中的文本》在网页开发和数据抓取过程中,我们经常需要从HTML页面中提取信息,尤其是span元素中的文本,span标签是一个行内元素,通常用于包装一小段文本或... 目录一、安装相关依赖二、html 页面结构三、使用 BeautifulSoup javascript

列举你能想到的UNIX信号,并说明信号用途

信号是一种软中断,是一种处理异步事件的方法。一般来说,操作系统都支持许多信号。尤其是UNIX,比较重要应用程序一般都会处理信号。 UNIX定义了许多信号,比如SIGINT表示中断字符信号,也就是Ctrl+C的信号,SIGBUS表示硬件故障的信号;SIGCHLD表示子进程状态改变信号;SIGKILL表示终止程序运行的信号,等等。信号量编程是UNIX下非常重要的一种技术。 Unix信号量也可以

ROS - C++实现RosBag包回放/提取

文章目录 1. 回放原理2. 回放/提取 多个话题3. 回放/提取数据包,并实时发布 1. 回放原理 #include <ros/ros.h>#include <rosbag/bag.h>#include <std_msgs/String.h>int main(int argc, char** argv){// 初始化ROS节点ros::init(argc, argv,

HalconDotNet中的图像特征与提取详解

文章目录 简介一、边缘特征提取二、角点特征提取三、区域特征提取四、纹理特征提取五、形状特征提取 简介   图像特征提取是图像处理中的一个重要步骤,用于从图像中提取有意义的特征,以便进行进一步的分析和处理。HalconDotNet提供了多种图像特征提取方法,每种方法都有其特定的应用场景和优缺点。 一、边缘特征提取   边缘特征提取是图像处理中最基本的特征提取方法之一,通过检

如何根据相同分隔符提取间隔数据?

最近遇到很多提问怎么提取字符的,而这些问题都有一个相同的特征,就是要提取的内容与内容之间,都有着相同的分隔符。当然,这种问题直接用“数据” →  “分列”功能就可以一步到位实现的,但有人喜欢折腾,而更多的人又非得指定函数公式的方法,或者更多的是要保持数据的同步性。   下面,我们就来讲讲用函数公式应该怎么实现这个提取,首先来个数据和要求,如下图,将 - 号间隔的内容依次提取到右边单元格内:

Java8特性:分组、提取字段、去重、过滤、差集、交集

总结下自己使用过的特性 将对象集合根据某个字段分组 //根据id分组Map<String, List<Bean>> newMap = successCf.stream().collect(Collectors.groupingBy(b -> b.getId().trim())); 获取对象集合里面的某个字段的集合 List<Bean> list = new ArrayList<>

Linux中如何屏蔽信号

本篇文章主要学习Linux的信号处理机制,着重学习屏蔽信号部分。屏蔽信号处理的两种方式类似于信号的捕获,一种方式是直接对其设置,另一种方式是先获得描述符的掩码,然后对其设置操作。 本文主要参考自《嵌入式linux系统使用开发》,作者何永琪,Thanks. 在linux系统中,如何处理某个进程发送的一个特定信号呢?一般来说有三种方式: 1) 忽略信号 2) 屏蔽信号 3) 为该信号添

OpenCV结构分析与形状描述符(10)检测并提取轮廓函数findContours()的使用

操作系统:ubuntu22.04 OpenCV版本:OpenCV4.9 IDE:Visual Studio Code 编程语言:C++11 算法描述 在二值图像中查找轮廓。 该函数使用算法 253从二值图像中检索轮廓。轮廓是有用的工具,可用于形状分析和对象检测与识别。参见 OpenCV 示例目录中的 squares.cpp。 findContours 是 OpenCV 库中的一个重要函数