首页 > 其他分享 >上升沿/下降沿识别与周期信号提取

上升沿/下降沿识别与周期信号提取

时间:2024-07-08 19:26:14浏览次数:16  
标签:提取 周期 检测 label 信号 input 识别 True

1.前言

在普通算法开发或深度学习中,经常需要先检测信号上升沿,然后使用两个跳变信号提取出相应的周期信号,以便进行后续处理。在线识别跳变信号任务通常相当复杂,与我们在既定规则下采集数据集时相比更为困难。在在线检测中,通常会遇到周期不确定、多样的幅值、以及干扰跳变等多种情况。如果后续算法具有足够的鲁棒性,那么第一步信号检测就显得非常重要。如果此步骤处理不当,那么后续算法的性能就会大打折扣。OK,让我们分析一下下面种常见的信号。

2. 分析周期信号

下面,以我本次项目遇到的周期信号示例。首先我们分析信号的特点:

图1. 部分原始数据

 从上图1中可以看出信号大致呈现一定的周期性,但从局部放大图上看信号的变化趋势较为复杂多变。有同学肯定会想到一种简单的方法:

我不关注信号过程性,因为信号变化过程过于复杂,但周期信号发生的前后却较为干净,因此可以利用以下方法求解:

(1)若信号在\Delta t时间内保持在一个相对趋向零附近的值,且下一时刻幅值突然增大开始记录数据;

(2)信号在另一个在另一个\Delta t时间内又回到相对趋向零附近的值,停止记录,生成一组数据。

注意 :这种方法隐藏的假设条件:

(1)周期信号的间隔时间必须大于局部放大图中展示的接近零点的那段时间,否则失效;

(2)信号的滞后性不影响后续处理。因为你是利用结束的一段零点区间判定,因此无法做到动作结束,信号检测结束。

另一种常规方法:

2.1 信号变换

从学过的高数中我们依稀记得如果一个变量的表达式过于复杂,我们可以对变量做处理,只要变量的功能能完全取代旧变量,这样处理完全没问题,例如比较根号下x的大小与比较x平方是等价的。ok,让我们对信号变换,这里只对我处理的信号变换,你的要自己选择合适的变换,变换后的信号如图2所示。

图2. 预处理后的信号 

从图2可以看出变换后的信号复杂性明显降低,可以简单分析一下,存在以下特点:

(1)“近似”由两个抛物线组成,只是近似!

(2)一个周期信号可以看作由两段曲线组成,每一段曲线的开头和结束均是上升沿和下降沿。

抓住这几个特点就是我们解题的方向和条件,下一步我们希望我们的方法可以不易遗漏的找到信号中所有的上升沿和下降沿,然后再根据信号的特点消掉部分跳变检测,最后得到想要的信号。

3. 基于阈值+固定窗口法的跳变检测

3.1 阈值法检测

首先,我们先识别上升沿,大家可能第一解题思路就是取阈值,当检测到信号大于阈值th1时,则认为可以记录信号了。然后再小于另一个趋向0的信号便结束。

有同学肯定会问“中间有一段趋向零的信号,遇到后岂不是停止了?”

答案是肯定的!如图3所示。下一步该怎么办呢?

 图3. 阈值法周期检测  

3.2 阈值+固定窗口法检测

有同学肯定又会说“我给他增加一个结束的判定条件:只有当记录的数据维度大于一定数量才结束,这不就锁死了么?”

方法总结如下:

(1)若信号在\Delta t时间内保持在一个相对趋向零附近的值,且下一时刻幅值突然增大开始记录数据;

(2)信号在另一个在另一个\Delta t时间内记录的数量大于th2且回到相对趋向零附近的值,停止记录,生成一组数据。

OK,按照上面的意思,我们取一个固定的阈值,只有当记录的数量大于阈值th2时我们才检测是否接近零点,得到图4。可出现了两种很不情愿的情况:

(1)阈值设置的太小,有些周期较长的信号被检测错误;

(2)阈值设置的太大,有些周期较短的信号“尾巴”太长,丧失了动态检测的意义。

图4. 阈值+固定窗口法周期检测  

如果你在乎尾巴参差不齐,那你可以考虑这种方法,毕竟简单粗暴。但是有一个非常大的隐患值得引起你的注意:如果检测到一个周期信号的另一个上升沿,那就会直到检测到下一个周期信号的第一个下降沿才结束,后面就会一直错位。当然你可以通过设定记录的长度加以限制,还的有初始化操作。

OK,怎么可以更灵敏的检测周期并去掉尾巴,获得信息量更足的周期信号?

4. 基于梯度+阈值的周期信号检测方法

阈值+固定窗口法还隐藏着另一个隐患:当遇到小凸起的噪音时会引发疯狂错位,如下图所示,蓝框中的噪音信号触发了开始信号,后面即使判定失败,又会继续判定一个周期信号中另一个上升沿作为起始信号(错误),往复下去!所以必须有相应的纠错机制。

图5. 噪音干扰示例  

4.1跳变检测

OK,一步步来吧,步骤如下:

(1)首先把信号中的上升沿和下降沿全部检测出;

(2)若第一步成功,每检测到第二个上升沿后可以准备在检测到下降沿后准备收网。

如何检测上升沿或者下降沿呢?我估计大家肯定想到梯度(\Delta x/\Delta t),这里展示一个示例:

def decend_cal(input,input_old):
    d1 = input[0] - input_old[0]
    d2 = input[1] - input_old[1]
    d3 = input[2] - input_old[2]
    d4 = input[3] - input_old[3]
    d5 = input[4] - input_old[4]
    d6 = input[5] - input_old[5]
    re = [d1,d2,d3,d4,d5,d6]
    return re

gradient = decend_cal(inp, inp_old)
inp_old = inp

 """利用梯度捕捉上升沿与下降沿"""
if any(num > 500 for num in gradient):  # 捕捉上升沿
      up_gradient_label = True
      down_gradient_label = False
if any(num < -200 for num in gradient):
       up_gradient_label = False
       down_gradient_label = True

当一个上升沿来临时,会有一串的梯度都会大于阈值,我们只想在一个抛物线上识别一次,而不是很多次,那该怎么办呢?

用PLC领域的“互锁”思想!上面的代码也是一个简单的互锁,A发生时禁止B发生,B发生时禁止A发生。代码如下:

 if (w_2_le_aver > yuzhi and up_allow==True and up_gradient_label == True):  # 发现上升沿
            up_allow = False
            decend_start_label = True
            first_10_label = True  # 保存上升前10个数据
            up_count += 1

            if up_count %2 == 0 and up_count>1:  # 统计上升沿数量
                up_count = 0
                second_up_label = True

if decend_start_label == True:
    a_arr.append(a_le[i])  # 保存数据

    if first_10_label == True:
          w_2_l_aver_array.append(int(w_2))

    if(len(w_2_l_aver_array)>5 and first_10_label == True):
         if all(num < 100000 for num in ss):
               print("上升沿捕捉失败")
                """重新开始"""

                decend_start_label = False  #
                up_allow = True
                if err_occur == False:
                    up_count -=1  # 误检,重新回到上一次位置
                err_occur = True
                a_arr.clear()
      else:
          err_occur = False
if (w_2_li_aver < yuzhi_decend and decend_start_label == True  and down_gradient_label==True  and 5<len(w_x_little_arr) < 60):  
            decend_start_label = False  # 互锁
            up_allow = True


            if second_up_label == True:
                second_up_label = False
                a_arr.clear()


 识别的上升沿和下降沿如下:

图6. 上升沿检测

图7. 下降沿检测 

4.2 周期信号检测

识别多了不可怕,怕的是漏掉识别的,从图6和图7上看,没有遗漏的,就可以利用互锁识别一个周期信号了,识别效果如下:

图8. 周期检测  

图8 展示了一个周期信号的示意图,比较完美检测到所有的周期信号,像图中的很色跳变指示线逻辑上比较复杂,不建议尝试展示了,用图3所示的效果即可,逻辑实现上比较简单。这种方法也会受到噪音的干扰,如图9所示,该怎么处理呢?

 图9.噪音干扰  

解决方法就是:利用检测到的第一个上升沿后面连取10个值,如果最大值都很小,说明就是很小的干扰源忽略不计,需要放弃本次采集的数据,并将保存的数据,标志位清零!尤其是记录的上升沿数量一定回到初始值!!!但是,还有另一个问题:如果你采集的上升沿连续都是噪音,那么一味减1处理肯定是错误的!因此还要判定噪声的位置,具体处理见上面的代码。OK,处理完这一步,就可以轻松实现了周期信号的提取了,如下图所示:

 图10.最终周期信号切割示意图   

有同学肯定好奇图10示例不也有连续的上升沿检测失误吗?

是的,但是不影响。后面我检测到我会以后面的为准,这就是上面提到的清零,请标志位。另外还涉及到参数初始化,这里不再讲解,比较容易实现了,整个流程就处理完了。

标签:提取,周期,检测,label,信号,input,识别,True
From: https://blog.csdn.net/2301_79275917/article/details/140185589

相关文章

  • 加油站iOS车牌识别系统的正确打开方式
    在智慧城市的不断推动下,交通领域的各个部分也在逐渐完善,国内加油站也在推行精细化管理,除了做好日常的安全管理,营销服务也被提上案头,最终实现加油站“智慧”服务,赢得客户青睐。加油站车牌识别系统及客户服务系统以车牌识别技术为基础,除了部置在加油站出入口,识别进出站车辆......
  • 调用智谱清言的图像识别接口
    github地址:https://github.com/LLM-Red-Team/glm-free-api1.docker来取镜像并部署 拉取镜像dockerpullvinlic/glm-free-api:latest docker部署dockerrun-it-d--init--nameglm-free-api-p8000:8000-eTZ=Asia/Shanghaivinlic/glm-free-api:latest查看服......
  • 信号与线性系统笔记总结
    使用说明前三章是ppt加个人注释,后面都是手写笔记总结。在这里我要狠狠安利西电郭宝龙教授,他讲信号这门课很有耐心,也很有思路。笔记可能有错误的地方,后期会不断更正。参考视频:【西安电子科技大学——信号与系统(郭宝龙)】https://www.bilibili.com/video/BV1PZ4y1t7DA/?p=3&......
  • 人脸识别与美颜算法实战:基于Python、机器学习与深度学习
    代码和pdf书等:GitHub-guozhe1992/read引言与基础知识:介绍人脸识别与美颜算法的基本概念、应用场景以及Python编程和机器学习的基础知识。视频图像处理技术:详细讲解基于Anaconda和PyCharm的环境搭建,以及视频图像处理的基础技术,如图像读取、显示、保存和格式转换等。抖音特效......
  • C#实现控制台传参调用YoloV5进行人体识别
    一、项目地址 二、代码解析3、自定义人体信息类  该类用于在控制台打印人体位置信息///<summary>///人体信息///</summary>publicclassBodyInfo{publicintLeft{get;set;}=0;publicintTop{get;set;}=0;......
  • 微信小程序自动识别收货地址
    为提升用户体验,在用户新增收货地址时,加入自动识别收货地址功能。.wxml<viewclass="top"><inputtype="text"placeholder="复制收货信息(格式:姓名→电话→地址)"value="{{distinguish}}"bindinput="distinguishinput"></input><t......
  • 15集终于编译成功了-了个球!编译TFLite Micro语音识别工程-《MCU嵌入式AI开发笔记》
    15集终于编译成功了-个球!编译TFLiteMicro语音识别工程-《MCU嵌入式AI开发笔记》还是参考这个官方文档:https://codelabs.developers.google.cn/codelabs/sparkfun-tensorflow#2全是干货!这里面提到的这个Micro工程已经移开了:https://github.com/tensorflow/tensorflow/t......
  • 昇思25天学习打卡营第11天 | LLM原理和实践:基于MindSpore实现BERT对话情绪识别
    1.基于MindSpore实现BERT对话情绪识别1.1环境配置#实验环境已经预装了mindspore==2.2.14,如需更换mindspore版本,可更改下面mindspore的版本号!pipuninstallmindspore-y!pipinstall-ihttps://pypi.mirrors.ustc.edu.cn/simplemindspore==2.2.14#该案例在min......
  • 进程信号
    1.信号的产生1.1信号概念在生活中有很多的信号在我们身边围绕,例如红绿灯,发令枪,上课铃等等在接受到信号,我们可以做出三种动作1.立马去做对应信号的事情2.等一会再做,有自己的事情或者更重要的事情3.直接忽视,不做信号是给进程发送的eg:kill-9pid进程本身是程序员......
  • 《已解决》无法将“pip”项识别为 cmdlet、函数、脚本文件或可运行程序的名称
    原因:Python环境未正确配置:可能你没有将Python添加到系统的环境变量中。你需要手动将Python的安装目录(以及包含 pip.exe 的文件夹)添加到系统的环境变量 PATH 中。 解决:1.找到python的安装目录键盘按下  win键+R键,输入cmd回车。随后输入wherepythonwhere......