当前位置: 首页 > news >正文

Python读取获取波形图波谷/波峰

        “小H,这里有份数据,你来做一下数据分析。”ld招招手就把正在刷知乎的小H拉回现实。

        “我做吗?可是我也没说过我过我会吧,其实我连python都没怎么写过。”那时候刚来公司没几天的小H这样想道,可能是ld以为本科生都会吧,不过我也不可能自己暴露了。

        “收到!”小H马上回复道。

        ······

        但是要分析什么呢?一时间还是没有什么头绪啊。。。

        得到ld的指导后,其中的一部分是,小H决定从波形图中提取出波谷,然后从波谷的左边界到极值和极值到右边界去做一个时间对比,这实际上说明了一个动作的来回,从中大概就可以看出一个合规的动作在时间上应该怎么分布的吧?(反正我是没怎么看出来)

        取极值简单,min或者什么max都可以简单从一段连续的数组中找到极值,但是什么才叫波谷的区间呢?

        因为展示出来的波形图如下:

       

        在正常的时候也是有波动的。经过和ai一番叽里咕噜的交流之后选定了以下的做法:

        首先是计算出比较稳健的一个正常波动曲线,也就是上图中的在虚线上半部分的这些,如果没有动作的话他们应该一直都是这样的。具体的方式就是去掉极端值之后计算平均值划定阈值,低于这个阈值以下的点我们都看成是波谷部分。

        之后就是找到所有低于低于阈值的点,那应该是一段段区间,再去掉长度不合适的就可以了,当然对于区间我们也只返回左右端点。

       

def find_all_valley_ranges(data, threshold_ratio=0.98, min_length=1):"""找到所有连续的波谷区间,返回[[左边界, 右边界], ...]形式的数组参数:data: 一维数组,波形数据threshold_ratio: 波谷阈值比例(低于正常波动均值的此比例视为波谷)min_length: 最小波谷长度(过滤过短的噪声区间)返回:valley_ranges: 波谷区间列表,每个元素为[start, end]"""# 1. 计算稳健的正常波动基线(排除极端值)plow = np.percentile(data, 10)ptop = np.percentile(data, 95)normal_data = data[(data >= plow) & (data <= ptop)]baseline = np.mean(normal_data)# print(f"baseline : {baseline}")valley_threshold = baseline * threshold_ratio# 2. 找到所有低于阈值的点valley_points = np.where(data < valley_threshold)[0]if len(valley_points) == 0:return []  # 无波谷区间# 3. 分割为连续区间(检测间隙)gaps = np.where(np.diff(valley_points) > 1)[0] + 1  # 间隙位置intervals = np.split(valley_points, gaps)  # 按间隙分割为连续区间# 4. 过滤过短区间并转换为[start, end]形式valley_ranges = []for interval in intervals:if len(interval) >= min_length:  # 只保留长度达标者valley_ranges.append([interval[0], interval[-1]])return valley_ranges

        代码就是这样了,其实也没有多少内容,对于不同的数据可以通过调节波谷阈值比例、最小波谷长度、排除极端值的范围来把控如何划出波谷。

        效果如上。

        之后就是对这L,R以及min进行分析,然后美美提交一份并没有什么用的说明上去。

        当然这个程序改一下就是查找波峰区间了(找到所有低于阈值->找到所有高于阈值)

http://www.xdnf.cn/news/1216063.html

相关文章:

  • 开发避坑短篇(9):解决升级Vue3后slot attributes废弃警告
  • Python Day19 时间模块 和 json模块 及例题分析
  • Baumer工业相机堡盟工业相机如何通过YoloV8深度学习模型实现裂缝的检测识别(C#代码UI界面版)
  • RNN、LSTM、Transformer推荐博文
  • USRP捕获手机/路由器数据传输信号波形(上)
  • HTML应用指南:利用POST请求获取全国公牛门店位置信息
  • Unity UI的未来之路:从UGUI到UI Toolkit的架构演进与特性剖析(5)
  • Python 使用pandas库实现Excel字典码表对照自动化处理
  • macOS安装配置Unbound DNS完整指南
  • 学习日志22 python
  • docker 安装elasticsearch
  • QT笔记--》QMenu
  • CSS 工作原理
  • Java 笔记 封装(Encapsulation)
  • [硬件电路-106]:模拟电路 - 电路为什么会出现不同的频率特性?元件频率依赖性、信号传输路径、电路拓扑结构、外部因素
  • 微信小程序中实现页面跳转的方法
  • MySQL的单行函数:
  • C++ 中 NULL 与 nullptr 有什么区别?
  • rsync+sersync实现文件实时同步
  • Spark的宽窄依赖
  • 第七章:进入Redis的SET核心
  • 重生之我在暑假学习微服务第五天《Docker部署项目篇》
  • 【人工智能99问】混合专家模型(MoE)是如何训练的?(18/99)
  • pytorch小记(三十三):PyTorch 使用 TensorBoard 可视化训练过程(含完整示例)
  • LLM—— 基于 MCP 协议(SSE 模式)的工具调用实践
  • 30道JS高频经典笔试题集合+详解(一)
  • 华为昇腾×绿算全闪存缓存释放澎湃潜能
  • 【LeetCode】链表反转实现与测试
  • 比特币挖矿的能源消耗和环保问题
  • 关于“LoggerFactory is not a Logback LoggerContext but Logback is on ......“的解决方案