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

相关文章

Python从Word文档中提取图片并生成PPT的操作代码

《Python从Word文档中提取图片并生成PPT的操作代码》在日常办公场景中,我们经常需要从Word文档中提取图片,并将这些图片整理到PowerPoint幻灯片中,手动完成这一任务既耗时又容易出错,... 目录引言背景与需求解决方案概述代码解析代码核心逻辑说明总结引言在日常办公场景中,我们经常需要从 W

Java+AI驱动实现PDF文件数据提取与解析

《Java+AI驱动实现PDF文件数据提取与解析》本文将和大家分享一套基于AI的体检报告智能评估方案,详细介绍从PDF上传、内容提取到AI分析、数据存储的全流程自动化实现方法,感兴趣的可以了解下... 目录一、核心流程:从上传到评估的完整链路二、第一步:解析 PDF,提取体检报告内容1. 引入依赖2. 封装

Java使用正则提取字符串中的内容的详细步骤

《Java使用正则提取字符串中的内容的详细步骤》:本文主要介绍Java中使用正则表达式提取字符串内容的方法,通过Pattern和Matcher类实现,涵盖编译正则、查找匹配、分组捕获、数字与邮箱提... 目录1. 基础流程2. 关键方法说明3. 常见场景示例场景1:提取所有数字场景2:提取邮箱地址4. 高级

Python 字符串裁切与提取全面且实用的解决方案

《Python字符串裁切与提取全面且实用的解决方案》本文梳理了Python字符串处理方法,涵盖基础切片、split/partition分割、正则匹配及结构化数据解析(如BeautifulSoup、j... 目录python 字符串裁切与提取的完整指南 基础切片方法1. 使用切片操作符[start:end]2

使用Python提取PDF大纲(书签)的完整指南

《使用Python提取PDF大纲(书签)的完整指南》PDF大纲(Outline)​​是PDF文档中的导航结构,通常显示在阅读器的侧边栏中,方便用户快速跳转到文档的不同部分,大纲通常以层级结构组织,包含... 目录一、PDF大纲简介二、准备工作所需工具常见安装问题三、代码实现完整代码核心功能解析四、使用效果控

Linux从文件中提取特定内容的实用技巧分享

《Linux从文件中提取特定内容的实用技巧分享》在日常数据处理和配置文件管理中,我们经常需要从大型文件中提取特定内容,本文介绍的提取特定行技术正是这些高级操作的基础,以提取含有1的简单需求为例,我们可... 目录引言1、方法一:使用 grep 命令1.1 grep 命令基础1.2 命令详解1.3 高级用法2

Python实现批量提取BLF文件时间戳

《Python实现批量提取BLF文件时间戳》BLF(BinaryLoggingFormat)作为Vector公司推出的CAN总线数据记录格式,被广泛用于存储车辆通信数据,本文将使用Python轻松提取... 目录一、为什么需要批量处理 BLF 文件二、核心代码解析:从文件遍历到数据导出1. 环境准备与依赖库

Python中提取文件名扩展名的多种方法实现

《Python中提取文件名扩展名的多种方法实现》在Python编程中,经常会遇到需要从文件名中提取扩展名的场景,Python提供了多种方法来实现这一功能,不同方法适用于不同的场景和需求,包括os.pa... 目录技术背景实现步骤方法一:使用os.path.splitext方法二:使用pathlib模块方法三

Python实现精准提取 PDF中的文本,表格与图片

《Python实现精准提取PDF中的文本,表格与图片》在实际的系统开发中,处理PDF文件不仅限于读取整页文本,还有提取文档中的表格数据,图片或特定区域的内容,下面我们来看看如何使用Python实... 目录安装 python 库提取 PDF 文本内容:获取整页文本与指定区域内容获取页面上的所有文本内容获取

全屋WiFi 7无死角! 华硕 RP-BE58无线信号放大器体验测评

《全屋WiFi7无死角!华硕RP-BE58无线信号放大器体验测评》家里网络总是有很多死角没有网,我决定入手一台支持Mesh组网的WiFi7路由系统以彻底解决网络覆盖问题,最终选择了一款功能非常... 自2023年WiFi 7技术标准(IEEE 802.11be)正式落地以来,这项第七代无线网络技术就以超高速