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

简介: 欢迎来到我们的 QML & C++ 项目!这个项目结合了 QML(Qt Meta-Object Language)和 C++ 的强大功能,旨在开发出色的用户界面和高性能的后端逻辑。在项目中,我们利用 QML 的声明式语法和可视化设计能力创建出现代化的用户界面。通过直观的编码和可重用的组件,我们能够迅速开发出丰富多样的界面效果和动画效果。同时,我们利用 QML 强大的集成能力,轻松将 C++ 的底层逻辑和数据模型集成到前端界面中。在后端方面,我们使用 C++ 编写高性能的算法、数据处理和计算逻辑。C++ 是一种强大的编程语言,能够提供卓越的性能和可扩展性。我们的团队致力于优化代码,减少资

头图

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

[toc]

关键字: 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)
{
    // @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;
}

大致流程图如下:

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

相关文章
|
3月前
|
并行计算 算法 测试技术
C语言因高效灵活被广泛应用于软件开发。本文探讨了优化C语言程序性能的策略,涵盖算法优化、代码结构优化、内存管理优化、编译器优化、数据结构优化、并行计算优化及性能测试与分析七个方面
C语言因高效灵活被广泛应用于软件开发。本文探讨了优化C语言程序性能的策略,涵盖算法优化、代码结构优化、内存管理优化、编译器优化、数据结构优化、并行计算优化及性能测试与分析七个方面,旨在通过综合策略提升程序性能,满足实际需求。
99 1
|
数据采集 自动驾驶 算法
无人驾驶车辆中Python爬虫的抓取与决策算法研究
无人驾驶车辆中Python爬虫的抓取与决策算法研究
|
机器学习/深度学习 传感器 算法
基于matlab实现步进频波形的雷达定位算法
基于matlab实现步进频波形的雷达定位算法
|
机器学习/深度学习 Web App开发 算法
边做边思考,谷歌大脑提出并发RL算法,机械臂抓取速度提高一倍
RL 算法通常假设,在获取观测值、计算动作并执行期间环境状态不发生变化。这一假设在仿真环境中很容易实现,然而在真实机器人控制当中并不成立,很可能导致控制策略运行缓慢甚至失效。
|
存储 算法 C++
软件开发与算法在计算机中的应用
<h1 style="text-align:center">软件开发基础知识</h1> <div><br></div> <h2>1、软件开发策略:</h2> <p>瀑布模型:通过顺序执行前面的每个阶段来构成的,当每完成一步后,开发过程就转移到下一步骤。</p> <p>原型模型:根据需要不断重复地评估并修改这个模型,直到得到一个可以接受的版本,从这个版本可以开发出完整的系统或产品。<
2285 0
|
算法 数据库
让你提前认识软件开发(14):程序中的算法
第1部分 重新认识C语言 程序中的算法   【文章摘要】         算法(Algorithm),是程序的灵魂。著名计算机科学家、图灵奖获得者沃思曾提出过一个公式:数据结构+算法=程序。
1183 0
|
4天前
|
算法 数据安全/隐私保护 计算机视觉
基于FPGA的图像双线性插值算法verilog实现,包括tb测试文件和MATLAB辅助验证
本项目展示了256×256图像通过双线性插值放大至512×512的效果,无水印展示。使用Matlab 2022a和Vivado 2019.2开发,提供完整代码及详细中文注释、操作视频。核心程序实现图像缩放,并在Matlab中验证效果。双线性插值算法通过FPGA高效实现图像缩放,确保质量。
|
1月前
|
算法 数据安全/隐私保护 计算机视觉
基于Retinex算法的图像去雾matlab仿真
本项目展示了基于Retinex算法的图像去雾技术。完整程序运行效果无水印,使用Matlab2022a开发。核心代码包含详细中文注释和操作步骤视频。Retinex理论由Edwin Land提出,旨在分离图像的光照和反射分量,增强图像对比度、颜色和细节,尤其在雾天条件下表现优异,有效解决图像去雾问题。
|
1月前
|
算法 数据可视化 安全
基于DWA优化算法的机器人路径规划matlab仿真
本项目基于DWA优化算法实现机器人路径规划的MATLAB仿真,适用于动态环境下的自主导航。使用MATLAB2022A版本运行,展示路径规划和预测结果。核心代码通过散点图和轨迹图可视化路径点及预测路径。DWA算法通过定义速度空间、采样候选动作并评估其优劣(目标方向性、障碍物距离、速度一致性),实时调整机器人运动参数,确保安全避障并接近目标。
148 68
|
3天前
|
算法
基于SOA海鸥优化算法的三维曲面最高点搜索matlab仿真
本程序基于海鸥优化算法(SOA)进行三维曲面最高点搜索的MATLAB仿真,输出收敛曲线和搜索结果。使用MATLAB2022A版本运行,核心代码实现种群初始化、适应度计算、交叉变异等操作。SOA模拟海鸥觅食行为,通过搜索飞行、跟随飞行和掠食飞行三种策略高效探索解空间,找到全局最优解。

热门文章

最新文章