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

简介: 欢迎来到我们的 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

相关文章
|
数据采集 自动驾驶 算法
无人驾驶车辆中Python爬虫的抓取与决策算法研究
无人驾驶车辆中Python爬虫的抓取与决策算法研究
|
机器学习/深度学习 传感器 算法
基于matlab实现步进频波形的雷达定位算法
基于matlab实现步进频波形的雷达定位算法
|
机器学习/深度学习 Web App开发 算法
边做边思考,谷歌大脑提出并发RL算法,机械臂抓取速度提高一倍
RL 算法通常假设,在获取观测值、计算动作并执行期间环境状态不发生变化。这一假设在仿真环境中很容易实现,然而在真实机器人控制当中并不成立,很可能导致控制策略运行缓慢甚至失效。
|
29天前
|
算法 安全 数据安全/隐私保护
基于game-based算法的动态频谱访问matlab仿真
本算法展示了在认知无线电网络中,通过游戏理论优化动态频谱访问,提高频谱利用率和物理层安全性。程序运行效果包括负载因子、传输功率、信噪比对用户效用和保密率的影响分析。软件版本:Matlab 2022a。完整代码包含详细中文注释和操作视频。
|
6天前
|
算法 数据安全/隐私保护 索引
OFDM系统PAPR算法的MATLAB仿真,对比SLM,PTS以及CAF,对比不同傅里叶变换长度
本项目展示了在MATLAB 2022a环境下,通过选择映射(SLM)与相位截断星座图(PTS)技术有效降低OFDM系统中PAPR的算法实现。包括无水印的算法运行效果预览、核心程序及详尽的中文注释,附带操作步骤视频,适合研究与教学使用。
|
14天前
|
算法 数据挖掘 数据安全/隐私保护
基于FCM模糊聚类算法的图像分割matlab仿真
本项目展示了基于模糊C均值(FCM)算法的图像分割技术。算法运行效果良好,无水印。使用MATLAB 2022a开发,提供完整代码及中文注释,附带操作步骤视频。FCM算法通过隶属度矩阵和聚类中心矩阵实现图像分割,适用于灰度和彩色图像,广泛应用于医学影像、遥感图像等领域。
|
15天前
|
算法 调度
基于遗传模拟退火混合优化算法的车间作业最优调度matlab仿真,输出甘特图
车间作业调度问题(JSSP)通过遗传算法(GA)和模拟退火算法(SA)优化多个作业在并行工作中心上的加工顺序和时间,以最小化总完成时间和机器闲置时间。MATLAB2022a版本运行测试,展示了有效性和可行性。核心程序采用作业列表表示法,结合遗传操作和模拟退火过程,提高算法性能。
|
16天前
|
存储 算法 决策智能
基于免疫算法的TSP问题求解matlab仿真
旅行商问题(TSP)是一个经典的组合优化问题,目标是寻找经过每个城市恰好一次并返回起点的最短回路。本文介绍了一种基于免疫算法(IA)的解决方案,该算法模拟生物免疫系统的运作机制,通过克隆选择、变异和免疫记忆等步骤,有效解决了TSP问题。程序使用MATLAB 2022a版本运行,展示了良好的优化效果。
|
15天前
|
机器学习/深度学习 算法 芯片
基于GSP工具箱的NILM算法matlab仿真
基于GSP工具箱的NILM算法Matlab仿真,利用图信号处理技术解析家庭或建筑内各电器的独立功耗。GSPBox通过图的节点、边和权重矩阵表示电气系统,实现对未知数据的有效分类。系统使用MATLAB2022a版本,通过滤波或分解技术从全局能耗信号中提取子设备的功耗信息。
|
15天前
|
机器学习/深度学习 算法 5G
基于MIMO系统的SDR-AltMin混合预编码算法matlab性能仿真
基于MIMO系统的SDR-AltMin混合预编码算法通过结合半定松弛和交替最小化技术,优化大规模MIMO系统的预编码矩阵,提高信号质量。Matlab 2022a仿真结果显示,该算法能有效提升系统性能并降低计算复杂度。核心程序包括预编码和接收矩阵的设计,以及不同信噪比下的性能评估。
34 3