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

这篇具有很好参考价值的文章主要介绍了040-第三代软件开发-全新波形抓取算法。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

040-第三代软件开发-全新波形抓取算法,# 一个真实的QML&C++项目,算法,qt,qml,波形识别

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


关键字: 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

040-第三代软件开发-全新波形抓取算法,# 一个真实的QML&C++项目,算法,qt,qml,波形识别

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

/**
 * @brief XXXX::wavesCatch 提取波峰函数
 * @param iAisle
 */
bool XXXX::wavesCatch(int iAisle)
{
    // @ld
    m_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_wavesStartIndex
        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;
                }
            }
        }
    }
    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;
}

大致流程图如下:

040-第三代软件开发-全新波形抓取算法,# 一个真实的QML&amp;C++项目,算法,qt,qml,波形识别

代码小解

  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文章来源地址https://www.toymoban.com/news/detail-736025.html

        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;
    

040-第三代软件开发-全新波形抓取算法,# 一个真实的QML&amp;C++项目,算法,qt,qml,波形识别

到了这里,关于040-第三代软件开发-全新波形抓取算法的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 汽车零部件软件开发常用搜索算法

    一、线性搜索(Linear Search) 线性搜索是最基础的查找算法,适用于对未排序或无特定结构的数据集合进行搜索。在C语言中实现时,线性搜索通过遍历数组或链表中的每一个元素,并与目标值进行比较,直至找到匹配项或者遍历完所有元素。其时间复杂度为O(n),其中n代表数

    2024年02月19日
    浏览(28)
  • 汽车零部件软件开发中常用滤波算法

    滑动窗口滤波是数字信号处理中的基本技术,通过在数据序列上移动一个固定大小的窗口并计算窗口内数据点的统计量(如均值或中值)来平滑信号。本文将探讨滑动窗口均值滤波和中值滤波的基本实现、工作原理及其局限性,并引入卡尔曼滤波作为一种更高级别的滤波方法

    2024年02月21日
    浏览(30)
  • [七]【开源】基于PyQt的图像算法开发软件——手动图像配准[通过可交互的四个点构建仿射矩阵]

    [一] 【开源】基于PyQt的图像算法开发软件——如何让你开发效率翻倍 [二] 【开源】基于PyQt的图像算法开发软件——输入来源[如何导入视频进行目标检测] [三] 【开源】基于PyQt的图像算法开发软件——步骤列表[低代码实现图像算法开发] [四] 【开源】基于PyQt的图像算法开发

    2024年02月22日
    浏览(39)
  • 测试软件开发---软件缺陷章

    软件缺陷 软件出现缺陷一般是因为开发的流程规划不准确,需求不明确,或需求变更/在开发者开发的时候无法清晰的理解需求出现不同程度的偏差/客户方频繁的更改、更新需求也会影响到软件的质量 软件结构复杂、编码误差/错误、项目期限过短、项目中插入新的技术 处理

    2024年02月02日
    浏览(56)
  • 易语言软件定制软件开发脚本开发协议软件电脑网站APP应用视频制作工程制作

    随着信息技术的不断发展,易语言软件定制开发已成为许多公司的一项重要业务。本文将探讨如何利用易语言承接软件定制软件开发脚本开发协议软件电脑网站APP应用视频制作工程制作。 一、易语言概述 易语言是一种简单易学的编程语言,它采用中文编程,让不会英文的初

    2024年02月08日
    浏览(57)
  • 用python开发软件的步骤,如何用python做软件开发

    大家好,小编来为大家解答以下问题,如何用python做软件开发,用python开发软件的步骤,今天让我们一起来看看吧!   参与文末每日话题讨论,赠送异步新书 异步图书君 学习目标 知道有序的软件开发过程的步骤。 了解遵循输入、处理、输出(IPO)模式的程序,并能够以简单

    2024年02月06日
    浏览(50)
  • 数据驱动开发模式将软件开发过程改造成一个公式化的迭代模式,可以提升软件开发效率,缩短开发周期,降低开发成本。

    作者:禅与计算机程序设计艺术 随着云计算、大数据等新兴技术的应用,软件开发领域迎来了蓬勃发展的时期。各种编程语言、框架、工具不断涌现,协同工作的强烈需求已经成为当今社会的一个主要挑战。这就需要一种新的开发方式来适应这种复杂多变的环境。传统的瀑布

    2024年02月06日
    浏览(46)
  • 中文编程开发语言工具开发的实际软件案例:称重管理系统软件

    中文编程开发语言工具开发的实际软件案例:称重管理系统软件 中文编程开发语言工具开发的实际软件案例:称重管理系统软件,软件可以安装在电脑上,也可以安装在收银机上,支持触摸和鼠标点,想学编程可以关注系统化的编程课程。 中文编程系统化教程,不需英语基

    2024年02月07日
    浏览(55)
  • 易语言软件定制开发爬虫模拟协议填写自动化办公软件开发多人团队

    在当今快速发展的信息化时代,企业对于高效、自动化的软件需求日益增长。而易语言软件定制开发爬虫模拟协议填写自动化办公软件开发多人团队,正是为了满足这一需求而诞生的。 一、团队背景 技术顾问、维:Daxiami6789 易语言软件定制开发爬虫模拟协议填写自动化办公

    2024年02月05日
    浏览(51)
  • 软件架构设计(八) 基于架构的软件开发方法

    ABSD虽然在日常生活中并不常见,但是在考试中却是极为常见的,因此仍然是我们的重点学习知识点。 特点 基于架构的软件设计(Architecture-Based Software Design,ABSD),这个开发方法是 架构驱动 。 即 强调由业务、质量和功能需求的组合驱动架构设计 。就是会考虑到业务的情况

    2024年02月09日
    浏览(33)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包