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 list1


def 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 / freq
            print(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 = 0
    for i,s in enumerate(IMFs):
        if i>len(IMFs-1)/2+1:
            lr +=s
    return 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 = list

    avg = 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.5

    plt.plot(x)
    plt.plot(peaks, x[peaks], "x")
    plt.plot(np.zeros_like(x), "--", color="gray")
    plt.show()

    return rate

if __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的振幅和频率特征,可以用于探测信号中的异常或突发事件,从而用于异常检测和故障诊断。

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

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

聚观早报 | 小米SU7正式发布;xAI推出Grok-1.5

聚观早报每日整理最值得关注的行业重点事件,帮助大家及时了解最新行业动态,每日读报,就读聚观365资讯简报。 整理丨Cutie 3月30日消息 小米SU7正式发布 xAI推出Grok-1.5 红魔9 Pro新品亮相 长城汽车2023年营收 快狗打车2023年度业绩 小…

C++心决之命名空间、重载函数和引用

目录 1. C关键字(C98) 2. 命名空间 2.1 命名空间定义 2.2 命名空间使用 3. C输入&输出 4. 缺省参数 4.1 缺省参数概念 4.2 缺省参数分类 5. 函数重载 5.1 函数重载概念 5.2 C支持函数重载的原理--名字修饰(name Mangling) 6. 引用 6.1 引用概念 6.2 引用特性…

二维码门楼牌管理应用平台:构建社区信息新生态

文章目录 前言一、二维码门楼牌管理应用平台的功能优势二、信息展示与居民互动三、提升社区治理效能四、展望未来的发展方向 前言 随着信息技术的迅猛发展,二维码门楼牌管理应用平台逐渐崭露头角,成为社区管理的新宠。通过这一平台,居民可以…

Spring Boot 使用 Redis

1&#xff0c;Spring 是如何集成Redis的&#xff1f; 首先我们要使用jar包 <dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-data-redis</artifactId></dependency><dependency><gro…

【docker】nexus 本地 maven配置

1、这篇文章中说明了如何搭建私服 【docker】搭建Nexus私服-CSDN博客文章浏览阅读2次。4、点击登陆&#xff08;账号&#xff1a;admin 秘密&#xff1a;在容器内 /nexus-data/admin.password 文件中)注意我的端口号是 10002&#xff0c;注意你的端口号。7、设置maven-central…

博客页面---前端

目录 主页 HTML CSS 文章详细页面 HTML CSS 登录页面 HTML CSS 文章编辑页 HTML CSS 这只是前端的页面组成&#xff0c;还没有接入后端&#xff0c;并不是完全体 主页 HTML <!DOCTYPE html> <!-- <html lang"en"> --> <head>&…

AcWing刷题-有序分数

有序分数 递归 # 求最大公约数 def gcd(a,b):return gcd(b,a%b) if b else a ans [] n int(input()) for i in range(1,n1):for j in range(0,i1):if gcd(i,j)1: # 最简形式ans.append([j,i]) ans.sort(keylambda x:x[0]/x[1]) # 按照从小到大的顺序排 for elem in ans:a,be…

逐步学习Go-Select多路复用

概述 这里又有多路复用&#xff0c;但是Go中的这个多路复用不同于网络中的多路复用。在Go里&#xff0c;select用于同时等待多个通信操作&#xff08;即多个channel的发送或接收操作&#xff09;。Go中的channel可以参考我的文章&#xff1a;逐步学习Go-并发通道chan(channel)…

PyCharm安装及Anaconda关联设置

PyCharm介绍 PyCharm 是一款专为 Python 设计的集成开发环境&#xff08;IDE&#xff09;&#xff0c;由 JetBrains 开发。它提供了一整套功能强大的工具&#xff0c;帮助开发者更高效地编写、测试和调试 Python 代码。PyCharm 有免费的社区版和付费的专业版。 PyCharm官网链接…

Linux 安装Mysql

安装源文件版本&#xff1a;mysql-5.7.25-linux-glibc2.12-x86_64.tar.gz 安装前&#xff0c;我们可以检测系统是否自带安装 MySQL: rpm -qa | grep mysql如有&#xff0c;类似 mysql-libs-5.1.52-1.el6_0.1.x86_64那可以选择进行卸载: rpm -e mysql-libs-5.1.52-1.el6_0.1…

Xinstall自动邀请代理功能,让App线上推广更高效

在移动互联网时代&#xff0c;App的推广成为了每个开发者都必须面对的问题。线上推广作为一种重要的手段&#xff0c;其效果直接关系到App的下载量、安装量以及用户活跃度。然而&#xff0c;线上推广并非易事&#xff0c;需要借助专业的工具和方法才能实现最佳效果。今天&#…

JAVAEE——多线程进阶,锁策略

文章目录 锁策略乐观锁和悲观锁乐观锁悲观锁两者的比较 读写锁重量级锁和轻量级锁重量级锁轻量级锁 自旋锁公平锁和非公平锁公平锁非公平锁 可重入锁和不可重入锁可重入锁不可重入锁 锁策略 乐观锁和悲观锁 乐观锁 什么是乐观锁呢&#xff1f;我们可以认为乐观锁比较自信&am…

树的重心——树的结构

树的重心是指对于某个点&#xff0c;将其删除后&#xff0c;可以使得剩余联通块的最大值最小。也就等价于一某个点为根的树&#xff0c;将根删除后&#xff0c;剩余的若干棵子树的大小最小。 例如下图的树的重心就是2。 性质&#xff1a; 性质一&#xff1a;重心的若干棵子树打…

代码第三十六天:需要添加的硬币的最小数量

需要添加的硬币的最小数量 题目要求&#xff1a; 解题思路 为方便描述&#xff0c;把 0 也算作可以得到的数。 假设现在得到了区间 [ 0 , s − 1 ] [0,s−1] [0,s−1] 中的所有整数&#xff0c;如果此时遍历到整数 x c o i n s [ i ] xcoins[i] xcoins[i]&#xff0c;那么…

百度云加速方法「Cheat Engine」

加速网盘下载 相信经常玩游戏的小伙伴都知道「Cheat Engine」这款游戏内存修改器&#xff0c;它除了能对游戏进行内存扫描、调试、反汇编 之外&#xff0c;还能像变速齿轮那样进行本地加速。 这款专注游戏的修改器&#xff0c;被大神发现竟然还能加速百度网盘资源下载&#xf…

Linux 学习之路 -- 进程篇 -- 背景介绍

目录 1、冯诺依曼体系架构 2.操作系统 1、冯诺依曼体系架构 再开始学习进程之前我们要先了解一下计算机的体系结构&#xff0c;这里我们以最经典的冯诺依曼体系结构为例&#xff0c;简单介绍一下一下计算机的体系结构&#xff0c;方便我们对进程的理解。 这里的中央处理器就是…

【C++】入门C++(上)

简单唠几句 从今天开始我们就要进入C的学习了 众所周知&#xff0c;C是在C语言的基础上应运而生的&#xff0c;其容纳进去了面向对象编程思想&#xff0c;并增加了许多有用的库&#xff0c;以及编程范式&#xff0c;为我们在编程上提供了很大的便捷 在接下来的这几篇C入门的博…

设计方案-定时任务接口数据存储及更新策略

前言 在没有使用ETL工具且不考虑多数据源的情况下&#xff0c;我们需要从别的系统获取数据时&#xff0c;一般会选择分页接口查询并存储。本文算是我对类似场景代码的提炼&#xff0c;旨在总结相关套路&#xff0c;提升自我对数据库和模块的设计能力。 ETL(英文 Extract-Trans…

微分方程数值解法_常微分方程篇

一阶常微分方程初值问题 问题的适定性 (well-posedness): (數學系的角度) • 存在性:问题有解 • 唯一性:解是唯一的 • 稳定性:这个唯一解连续地依赖于问题中所给的数据(即初值、边值等) 初值问题的求解 Euler 法 區別(極限) 入門 要點:極限、中值定理==>差分方程…

linux进程退出之exit与_exit

linux进程退出之exit与_exit _exitexit流程清理函数atexit()函数&#xff1a;on_exit()函数&#xff1a; _exit /* Terminate program execution with the low-order 8 bits of STATUS. */ /** status参数定义了进程的终止状态&#xff0c;父进程可以通过wait&#xff08;&am…