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

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

相关文章
|
12月前
|
数据采集 传感器 Web App开发
无人驾驶车辆中Python爬虫的抓取与决策算法研究
无人驾驶车辆中Python爬虫的抓取与决策算法研究
|
机器学习/深度学习 Web App开发 算法
边做边思考,谷歌大脑提出并发RL算法,机械臂抓取速度提高一倍
RL 算法通常假设,在获取观测值、计算动作并执行期间环境状态不发生变化。这一假设在仿真环境中很容易实现,然而在真实机器人控制当中并不成立,很可能导致控制策略运行缓慢甚至失效。
|
1天前
|
算法 索引
基于Prony算法的系统参数辨识matlab仿真
Prony算法在MATLAB2022a中用于信号分析,识别复指数信号成分。核心程序通过模拟信号X1,添加不同SNR的噪声,应用Prony方法处理并计算误差。算法基于离散序列的复指数叠加模型,通过构建矩阵并解线性方程组估计参数,实现LTI系统动态特性的辨识。
|
3天前
|
算法 安全 数据库
基于结点电压法的配电网状态估计算法matlab仿真
**摘要** 该程序实现了基于结点电压法的配电网状态估计算法,旨在提升数据的准确性和可靠性。在MATLAB2022a中运行,显示了状态估计过程中的电压和相位估计值,以及误差随迭代变化的图表。算法通过迭代计算雅可比矩阵,结合基尔霍夫定律解决线性方程组,估算网络节点电压。状态估计过程中应用了高斯-牛顿或莱文贝格-马夸尔特法,处理量测数据并考虑约束条件,以提高估计精度。程序结果以图形形式展示电压幅值和角度估计的比较,以及估计误差的演变,体现了算法在处理配电网状态估计问题的有效性。
|
3天前
|
算法
基于PSO粒子群优化的PID控制器参数整定算法matlab仿真
该文探讨了使用PSO(粒子群优化)算法优化PID控制器参数的方法。通过PSO迭代,不断调整PID控制器的Kp、Ki、Kd增益,以减小控制误差。文中提供了MATLAB2022a版本的核心代码,展示了参数优化过程及结果。系统仿真图像显示了参数随迭代优化的变化。PID控制器结合PSO算法能有效提升控制性能,适用于复杂系统的参数整定,未来研究可关注算法效率提升和应对不确定性。
|
3天前
|
算法
m基于GA遗传优化的高斯白噪声信道SNR估计算法matlab仿真
**MATLAB2022a模拟展示了遗传算法在AWGN信道中估计SNR的效能。该算法利用生物进化原理全局寻优,解决通信系统中复杂环境下的SNR估计问题。核心代码执行多代选择、重组和突变操作,逐步优化SNR估计。结果以图形形式对比了真实SNR与估计值,并显示了均方根误差(RMSE),体现了算法的准确性。**
10 0
|
5天前
|
机器学习/深度学习 存储 算法
基于SFLA算法的神经网络优化matlab仿真
**摘要:** 使用MATLAB2022a,基于SFLA算法优化神经网络,降低训练误差。程序创建12个神经元的前馈网络,训练后计算性能。SFLA算法寻找最优权重和偏置,更新网络并展示训练与测试集的预测效果,以及误差对比。SFLA融合蛙跳与遗传算法,通过迭代和局部全局搜索改善网络性能。通过调整算法参数和与其他优化算法结合,可进一步提升模型预测精度。
|
5天前
|
算法
基于仿射区间的分布式三相不对称配电网潮流算法matlab仿真
```markdown # 摘要 本课题聚焦于基于仿射区间的分布式三相配电网潮流算法在MATLAB2022a中的仿真。算法利用仿射运算处理三相不平衡情况及分布式电源注入,旨在提供比区间算法更精确的不确定区域。仿真结果展示了算法优势。核心程序设计考虑了PQ、PV及PI节点,将不同类型的节点转换统一处理,以适应含分布式电源的配电网潮流计算需求。 ``` 这个摘要以Markdown格式呈现,总字符数为233,满足了240字符以内的要求。
|
5天前
|
机器学习/深度学习 算法 数据可视化
基于googlenet深度学习网络的睁眼闭眼识别算法matlab仿真
**算法预览图展示睁眼闭眼识别效果;使用Matlab2022a,基于GoogLeNet的CNN模型,对图像进行分类预测并可视化。核心代码包括图像分类及随机样本显示。理论概述中,GoogLeNet以高效Inception模块实现眼部状态的深度学习识别,确保准确性与计算效率。附带三张相关图像。**
|
7天前
|
机器学习/深度学习 自然语言处理 算法
m基于深度学习的OFDM+QPSK链路信道估计和均衡算法误码率matlab仿真,对比LS,MMSE及LMMSE传统算法
**摘要:** 升级版MATLAB仿真对比了深度学习与LS、MMSE、LMMSE的OFDM信道估计算法,新增自动样本生成、复杂度分析及抗频偏性能评估。深度学习在无线通信中,尤其在OFDM的信道估计问题上展现潜力,解决了传统方法的局限。程序涉及信道估计器设计,深度学习模型通过学习导频信息估计信道响应,适应频域变化。核心代码展示了信号处理流程,包括编码、调制、信道模拟、降噪、信道估计和解调。
28 8