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

040-第三代软件开发-全新波形抓取算法

头图

第三代软件开发-全新波形抓取算法

文章目录

  • 第三代软件开发-全新波形抓取算法
    • 项目介绍
    • 全新波形抓取算法
      • 代码小解

关键字: QtQml抓波截获波形

项目介绍

欢迎来到我们的 QML & C++ 项目!这个项目结合了 QML(Qt Meta-Object Language)和 C++ 的强大功能,旨在开发出色的用户界面和高性能的后端逻辑。

在项目中,我们利用 QML 的声明式语法和可视化设计能力创建出现代化的用户界面。通过直观的编码和可重用的组件,我们能够迅速开发出丰富多样的界面效果和动画效果。同时,我们利用 QML 强大的集成能力,轻松将 C++ 的底层逻辑和数据模型集成到前端界面中。

在后端方面,我们使用 C++ 编写高性能的算法、数据处理和计算逻辑。C++ 是一种强大的编程语言,能够提供卓越的性能和可扩展性。我们的团队致力于优化代码,减少资源消耗,以确保我们的项目在各种平台和设备上都能够高效运行。

无论您是对 QML 和 C++ 开发感兴趣,还是需要我们为您构建复杂的用户界面和后端逻辑,我们都随时准备为您提供支持。请随时联系我们,让我们一同打造现代化、高性能的 QML & C++ 项目!

重要说明☝

☀该专栏在第三代软开发更新完将涨价

全新波形抓取算法

嘿嘿嘿,如果有碰巧看过我之前的抓波算法的话,那么可以在看看这里,这个版本是针对送检使用的演示版本,针对是信号发生器产出的纯净波形。在实际使用中发现不管怎么调节参数都不理想。所以诞生了新的抓博算法。

链接在这里:https://dreamlife.blog.csdn.net/article/details/128716820

image-20230807183545114

新的抓博算法简单除暴,直接判断峰峰值是否超过阈值,如果超过阈值了,那就行波形分析,入股没有继续抓博。核心算法如下:

/*** @brief XXXX::wavesCatch 提取波峰函数* @param iAisle*/
bool XXXX::wavesCatch(int iAisle)
{// @ldm_wavesStartIndex = 0;m_wavesEndIndex = 0;m_yData.resize(m_windowDataSize - m_stimeNumber);m_yData.at(0) = m_windowData[iAisle+1].at(0+m_stimeNumber);m_yData.at(1) = m_windowData[iAisle+1].at(1+m_stimeNumber);for(int i=2;i<m_windowDataSize-m_stimeNumber;i++){m_yData.at(i) = (m_windowData[iAisle+1].at(i+m_stimeNumber)+m_windowData[iAisle+1].at(i-1+m_stimeNumber)+m_windowData[iAisle+1].at(i-2+m_stimeNumber))/3;}m_wavesMaxIndex = m_wavesMaxIndex - m_stimeNumber;m_wavesMinIndex = m_wavesMinIndex - m_stimeNumber;//if(m_wavesMaxIndex<m_wavesMinIndex){// m_wavesStartIndexfor(int iStart=m_wavesMaxIndex-2;iStart>=2;iStart--){// 在平均值附近if(qAbs(m_yData.at(iStart) - m_wavesAvg) <= 0.15*qAbs(m_wavesMax - m_wavesAvg)){// B.极小值if((m_yData.at(iStart)<=m_yData.at(iStart+1) && m_yData.at(iStart) <= m_yData.at(iStart-1))// 找到快速增加点|| (m_yData.at(iStart+2) > m_yData.at(iStart+1) > m_yData.at(iStart)&& (m_yData.at(iStart+2) -m_yData.at(iStart+1)) > 5*(m_yData.at(iStart+1) -m_yData.at(iStart)))){m_wavesStartIndex = iStart;break;}}}for(int iEnd=m_wavesMinIndex+2;iEnd<int(m_yData.size())-2;iEnd++){// 在平均值附近if(qAbs(m_yData.at(iEnd) - m_wavesAvg) <= 0.15*qAbs(m_wavesAvg - m_wavesMin)){// B.极大值if((m_yData.at(iEnd)>=m_yData.at(iEnd+1) && m_yData.at(iEnd) >= m_yData.at(iEnd-1))// 找到平缓点|| (m_yData.at(iEnd-2) < m_yData.at(iEnd-1) < m_yData.at(iEnd)&& (m_yData.at(iEnd-1) -m_yData.at(iEnd-2)) > 5*(m_yData.at(iEnd) -m_yData.at(iEnd-1)))){m_wavesEndIndex = iEnd;break;}}}}else{for(int iStart=m_wavesMinIndex-2;iStart>=2;iStart--){// 在平均值附近if(qAbs(m_yData.at(iStart) - m_wavesAvg) <= 0.15*qAbs(m_wavesAvg - m_wavesMin)){// B.极大值if((m_yData.at(iStart)>=m_yData.at(iStart+1) && m_yData.at(iStart) >= m_yData.at(iStart-1))// 找到快速增加点|| (m_yData.at(iStart+2) < m_yData.at(iStart+1) < m_yData.at(iStart)&& (m_yData.at(iStart+1) -m_yData.at(iStart+2)) > 5*(m_yData.at(iStart) -m_yData.at(iStart-1)))){m_wavesStartIndex = iStart;break;}}}for(int iEnd=m_wavesMaxIndex+2;iEnd<int(m_yData.size())-1;iEnd++){// 在平均值附近if(qAbs(m_yData.at(iEnd) - m_wavesAvg) <= 0.15*qAbs(m_wavesMax - m_wavesAvg)){// B.极小值if((m_yData.at(iEnd)<=m_yData.at(iEnd+1) && m_yData.at(iEnd) <= m_yData.at(iEnd-1))// 找到平缓点|| (m_yData.at(iEnd-2) > m_yData.at(iEnd-1) > m_yData.at(iEnd)&& (m_yData.at(iEnd-2) -m_yData.at(iEnd-1)) > 5*(m_yData.at(iEnd-1) -m_yData.at(iEnd)))){m_wavesEndIndex = iEnd;break;}}}}if(m_wavesStartIndex == 0 || m_wavesEndIndex == 0)return false;emit signal_wavesCatched(iAisle,m_wavesStartIndex+m_stimeNumber,m_wavesMaxIndex+m_stimeNumber,m_wavesMinIndex+m_stimeNumber,m_wavesEndIndex+m_stimeNumber);return true;
}

大致流程图如下:

image-20230807223052252

代码小解

  1. 首先,我们对一些参数做了重置,这样保证我们开始的是一样的

        m_wavesStartIndex = 0;m_wavesEndIndex = 0;m_yData.resize(m_windowDataSize - m_stimeNumber);
    
  2. 紧接着,我们对我们的数据进行一个简单的平滑处理

        m_yData.at(0) = m_windowData[iAisle+1].at(0+m_stimeNumber);m_yData.at(1) = m_windowData[iAisle+1].at(1+m_stimeNumber);for(int i=2;i<m_windowDataSize-m_stimeNumber;i++){m_yData.at(i) = (m_windowData[iAisle+1].at(i+m_stimeNumber)+m_windowData[iAisle+1].at(i-1+m_stimeNumber)+m_windowData[iAisle+1].at(i-2+m_stimeNumber))/3;}
    
  3. 接下来,我们需要把我们之前算好的极大值和极小值做一个坐标转换

        m_wavesMaxIndex = m_wavesMaxIndex - m_stimeNumber;m_wavesMinIndex = m_wavesMinIndex - m_stimeNumber;
    
  4. 接下来,我们通过判断极大值和极小值对应的坐标就可以判断出波峰在前还是波谷在前了,

    if(m_wavesMaxIndex<m_wavesMinIndex)
    
  5. 分别再找起点和重点

            for(int iStart=m_wavesMaxIndex-2;iStart>=2;iStart--){// 在平均值附近if(qAbs(m_yData.at(iStart) - m_wavesAvg) <= 0.15*qAbs(m_wavesMax - m_wavesAvg)){// B.极小值if((m_yData.at(iStart)<=m_yData.at(iStart+1) && m_yData.at(iStart) <= m_yData.at(iStart-1))// 找到快速增加点|| (m_yData.at(iStart+2) > m_yData.at(iStart+1) > m_yData.at(iStart)&& (m_yData.at(iStart+2) -m_yData.at(iStart+1)) > 5*(m_yData.at(iStart+1) -m_yData.at(iStart)))){m_wavesStartIndex = iStart;break;}}}for(int iEnd=m_wavesMinIndex+2;iEnd<int(m_yData.size())-2;iEnd++){// 在平均值附近if(qAbs(m_yData.at(iEnd) - m_wavesAvg) <= 0.15*qAbs(m_wavesAvg - m_wavesMin)){// B.极大值if((m_yData.at(iEnd)>=m_yData.at(iEnd+1) && m_yData.at(iEnd) >= m_yData.at(iEnd-1))// 找到平缓点|| (m_yData.at(iEnd-2) < m_yData.at(iEnd-1) < m_yData.at(iEnd)&& (m_yData.at(iEnd-1) -m_yData.at(iEnd-2)) > 5*(m_yData.at(iEnd) -m_yData.at(iEnd-1)))){m_wavesEndIndex = iEnd;break;}}}
    
  6. 判定一下波形特征,符合波形特征,就发出信号,同时返回true;不符合波形特征就返回False

        if(m_wavesStartIndex == 0 || m_wavesEndIndex == 0)return false;emit signal_wavesCatched(iAisle,m_wavesStartIndex+m_stimeNumber,m_wavesMaxIndex+m_stimeNumber,m_wavesMinIndex+m_stimeNumber,m_wavesEndIndex+m_stimeNumber);return true;
    

博客签名2021

相关文章:

040-第三代软件开发-全新波形抓取算法

第三代软件开发-全新波形抓取算法 文章目录 第三代软件开发-全新波形抓取算法项目介绍全新波形抓取算法代码小解 关键字&#xff1a; Qt、 Qml、 抓波、 截获、 波形 项目介绍 欢迎来到我们的 QML & C 项目&#xff01;这个项目结合了 QML&#xff08;Qt Meta-Object …...

分享一个基于asp.net的供销社农产品商品销售系统的设计与实现(源码调试 lw开题报告ppt)

&#x1f495;&#x1f495;作者&#xff1a;计算机源码社 &#x1f495;&#x1f495;个人简介&#xff1a;本人七年开发经验&#xff0c;擅长Java、Python、PHP、.NET、微信小程序、爬虫、大数据等&#xff0c;大家有这一块的问题可以一起交流&#xff01; &#x1f495;&…...

Java基于SpringBoot的线上考试系统

1 摘 要 基于 SpringBoot 的在线考试系统网站&#xff0c;功能模块具有课程管理、成绩管理、教师管理、学生管理、考试管理以及基本信息的管理等&#xff0c;通过将系统分为管理员、授课教师以及学生&#xff0c;从不同的身份角度来对用户提供便利&#xff0c;将科技与教学模式…...

flask socketio 实时传值至html上【需补充实例】

目前版本如下 Flask-Cors 4.0.0 Flask-SocketIO 5.3.6from flask_socketio import SocketIO, emit 跨域问题网上的普通方法无法解决。 参考这篇文章解决 Flask教程(十九)SocketIO - 迷途小书童的Note迷途小书童的Note (xugaoxiang.com) app Flask(__name__) socketio Sock…...

C# Onnx P2PNet 人群检测和计数

效果 项目 代码 using Microsoft.ML.OnnxRuntime; using Microsoft.ML.OnnxRuntime.Tensors; using OpenCvSharp; using System; using System.Collections.Generic; using System.Drawing; using System.Linq; using System.Text; using System.Windows.Forms;namespace Onnx…...

idea提交代码一直提示 log into gitee

解决idea提交代码一直提示 log into gitee问题 文章目录 打开setting->Version control->gitee,删除旧账号&#xff0c;重新配置账号&#xff0c;删除重新登录就好 打开setting->Version control->gitee,删除旧账号&#xff0c;重新配置账号&#xff0c;删除重新登…...

ATECLOUD如何进行电源模块各项性能指标的测试?

ATECLOUD平台进行电源模块各项性能指标的测试是通过以下步骤实现的&#xff1a; 连接测试设备&#xff1a;将测试设备与云计算服务器连接&#xff0c;实现数据采集和远程控制。测试设备包括示波器、电子负载、电源、万用表等&#xff0c;这些设备通过纳米BOX连接到云测试平台上…...

Mysql查询训练——50道题

--1.学生表 Student(SId,Sname,Sage,Ssex) --SId 学生编号,Sname 学生姓名,Sage 出生年月,Ssex 学生性别 --2.课程表 Course(CId,Cname,TId) --CId 课程编号,Cname 课程名称,TId 教师编号 --3.教师表 Teacher(TId,Tname) --TId 教师编号,Tname 教师姓名 --4.成绩表 SC(SId…...

学习笔记|正态分布|图形法|偏度和峰度|非参数检验法|《小白爱上SPSS》课程:SPSS第三讲 | 正态分布怎么检验?看这篇文章就够了

目录 学习目的软件版本原始文档为什么要假设它服从正态分布呢?t检验一、图形法1、频数分布直方图解读 2、正态Q-Q图操作解读 3、正态P-P图SPSS实战操作解读 二、偏度和峰度解读&#xff1a; 三、非参数检验法注意事项 四、规范表达五、小结划重点 学习目的 SPSS第三讲 | 正态…...

Android NDK开发详解之ndk-build 脚本

Android NDK开发详解之ndk-build 脚本 内部原理从命令行调用选项可调试 build 与发布 build要求 ndk-build 脚本使用 NDK 的基于 Make 的构建系统构建项目。我们针对 ndk-build 使用的 Android.mk 和 Application.mk 配置提供了更具体的文档。 内部原理 运行 ndk-build 脚本相…...

应用于智慧矿山的皮带跑偏视频分析AI算法

一、引言 随着科技的发展&#xff0c;人工智能技术已经在各个领域得到广泛应用。而在智慧矿山领域&#xff0c;皮带跑偏视频分析是其中一个重要的应用方向。本文将详细介绍皮带跑偏视频分析AI算法的原理&#xff0c;以期为智慧矿山的发展提供有益的参考。 二、算法原理 1. 视…...

vue3 UI组件优化之element-plus按需导入

如果不在意项目打包体积大小&#xff0c;正常来讲element-plus 是这样用的 import ElementPlus from element-plus //引入样式 import "element-plus/dist/index.css";app.use(ElementPlus);但是呢要是项目就用了几个弹窗提示什么的&#xff0c;全局引入包体积很大 …...

如何创建 Spring Boot 项目

如果有pom.xml有插件异常&#xff0c;可以先删除。 maven配置要配置好 然后yaml&#xff0c;再启动就行 server:port: 9991 spring:application:name: demo3参考 如何创建 Spring Boot 项目_创建springboot项目_良月初十♧的博客-CSDN博客...

【经验分享】openGauss容灾集群搭建

gs_sdr命令代码解读 背景 openGauss推出了容灾架构&#xff0c;相比之前的一个集群主从架构&#xff0c;而容灾架构是两个集群间的数据同步。为了更深入了解其原理&#xff0c;本文试图通过阅读gs_sdr命令相关的代码来学习下相关的各种操作。 1.容灾搭建过程可以参考&#xf…...

互联网应用架构的演进(八大架构的演进过程)

文章目录 前言常见概念八大架构演进过程单机架构应用数据分离架构应用服务集群架构读写/主从分离架构冷热分离架构垂直分库架构微服务架构容器编排架构 前言 博主最近在学中间件&#xff0c;理解互联网应用架构的演进过程&#xff0c;对于理解中间件在整体结构中的定位是十分重…...

ROS自学笔记二十六:导航中激光雷达消息

在ROS导航中&#xff0c;激光雷达&#xff08;Laser Scanner&#xff09;通常被用于感知机器人周围的环境&#xff0c;进行障碍物检测和建图&#xff0c;以支持导航。下面是激光雷达的详细介绍以及一个示例&#xff1a; 激光雷达简介&#xff1a; 激光雷达是一种传感器&#…...

分类模型的评价指标

评价指标&#xff1a; 1、准确率 2、精准率 3、召回率 4、f1-Score 5、auc曲线 在了解评价指标在hi前&#xff0c;首先需要了解一种叫做混淆矩阵的东西 混淆矩阵&#xff1a; 真正例TP&#xff1a;本来正确的&#xff0c;分类到正确的类型 伪正例FP&#xff1a;本来是错误的&a…...

第五章 I/O管理 八、缓冲区管理

目录 一、定义 二、缓冲区的作用 三、单缓冲 1、定义&#xff1a; 2、例子1 3、例子2 四、双缓冲 1、定义&#xff1a; 2、例子1&#xff1a; 3、例子2&#xff1a; 五、单缓冲和双缓冲的区别 六、循环缓冲区 1、定义&#xff1a; 七、缓冲池 1、定义&#xff1a;…...

笔记软件推荐!亲测好用的8款笔记软件!

​在以往的生活中&#xff0c;我们都需要用纸和笔做笔记&#xff0c;但随着时代的发展&#xff0c;许多人已经不再选择用这种传统方式&#xff0c;来记录自己重要的笔记了&#xff0c;他们都选择将重要的笔记用软件记录下来&#xff0c;将笔记保存在电脑里&#xff0c;更不容易…...

MPJQueryWrapper 用法

// 创建QueryWrapper对象MPJQueryWrapper<WebEvaluation> queryWrapper new MPJQueryWrapper<>();// 设置要查询的字段queryWrapper.select("u.nick_name", "u.avatar_url").select("wu.nick_name as relayToUserName", "ta.c…...

在rocky linux 9.5上在线安装 docker

前面是指南&#xff0c;后面是日志 sudo dnf config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo sudo dnf install docker-ce docker-ce-cli containerd.io -y docker version sudo systemctl start docker sudo systemctl status docker …...

【机器视觉】单目测距——运动结构恢复

ps&#xff1a;图是随便找的&#xff0c;为了凑个封面 前言 在前面对光流法进行进一步改进&#xff0c;希望将2D光流推广至3D场景流时&#xff0c;发现2D转3D过程中存在尺度歧义问题&#xff0c;需要补全摄像头拍摄图像中缺失的深度信息&#xff0c;否则解空间不收敛&#xf…...

(二)原型模式

原型的功能是将一个已经存在的对象作为源目标,其余对象都是通过这个源目标创建。发挥复制的作用就是原型模式的核心思想。 一、源型模式的定义 原型模式是指第二次创建对象可以通过复制已经存在的原型对象来实现,忽略对象创建过程中的其它细节。 📌 核心特点: 避免重复初…...

OkHttp 中实现断点续传 demo

在 OkHttp 中实现断点续传主要通过以下步骤完成&#xff0c;核心是利用 HTTP 协议的 Range 请求头指定下载范围&#xff1a; 实现原理 Range 请求头&#xff1a;向服务器请求文件的特定字节范围&#xff08;如 Range: bytes1024-&#xff09; 本地文件记录&#xff1a;保存已…...

Cinnamon修改面板小工具图标

Cinnamon开始菜单-CSDN博客 设置模块都是做好的&#xff0c;比GNOME简单得多&#xff01; 在 applet.js 里增加 const Settings imports.ui.settings;this.settings new Settings.AppletSettings(this, HTYMenusonichy, instance_id); this.settings.bind(menu-icon, menu…...

VTK如何让部分单位不可见

最近遇到一个需求&#xff0c;需要让一个vtkDataSet中的部分单元不可见&#xff0c;查阅了一些资料大概有以下几种方式 1.通过颜色映射表来进行&#xff0c;是最正规的做法 vtkNew<vtkLookupTable> lut; //值为0不显示&#xff0c;主要是最后一个参数&#xff0c;透明度…...

【Oracle】分区表

个人主页&#xff1a;Guiat 归属专栏&#xff1a;Oracle 文章目录 1. 分区表基础概述1.1 分区表的概念与优势1.2 分区类型概览1.3 分区表的工作原理 2. 范围分区 (RANGE Partitioning)2.1 基础范围分区2.1.1 按日期范围分区2.1.2 按数值范围分区 2.2 间隔分区 (INTERVAL Partit…...

【数据分析】R版IntelliGenes用于生物标志物发现的可解释机器学习

禁止商业或二改转载&#xff0c;仅供自学使用&#xff0c;侵权必究&#xff0c;如需截取部分内容请后台联系作者! 文章目录 介绍流程步骤1. 输入数据2. 特征选择3. 模型训练4. I-Genes 评分计算5. 输出结果 IntelliGenesR 安装包1. 特征选择2. 模型训练和评估3. I-Genes 评分计…...

JVM虚拟机:内存结构、垃圾回收、性能优化

1、JVM虚拟机的简介 Java 虚拟机(Java Virtual Machine 简称:JVM)是运行所有 Java 程序的抽象计算机,是 Java 语言的运行环境,实现了 Java 程序的跨平台特性。JVM 屏蔽了与具体操作系统平台相关的信息,使得 Java 程序只需生成在 JVM 上运行的目标代码(字节码),就可以…...

排序算法总结(C++)

目录 一、稳定性二、排序算法选择、冒泡、插入排序归并排序随机快速排序堆排序基数排序计数排序 三、总结 一、稳定性 排序算法的稳定性是指&#xff1a;同样大小的样本 **&#xff08;同样大小的数据&#xff09;**在排序之后不会改变原始的相对次序。 稳定性对基础类型对象…...