verilog实现双滑动窗口能量检测算法

双滑动窗口能量检测算法简介

双滑动窗口能量检测算法常用于认知无线电、雷达信号处理等领域,用于检测未知信号的存在,尤其是在不确定信号模型和噪声环境的情况下。双滑动窗口分组检测算法,基本原理是通过计算两个连续滑动窗口的接收能量的比值作为判决变量m,设定一定阈值,来检测信号的起始与结束

双滑动窗口能量检测算法流程

在这里插入图片描述
窗口A和窗口B在向右滑动的过程中是相对静止的。当没有有效信号(例如检测雷达发射脉冲)到来时,两个窗口中都只包含了噪声,由于在理想情况下噪声的能量是相等的,因此得到的响应是平坦的。当雷达脉冲滑动到达窗口A时,A中的能量将一直增加到整个窗口都包含雷达脉冲信号。相应的,判决变量m也将跟着增加并达到一个峰值(峰值点对应窗口A中填满雷达脉冲数据而窗口B中尚未有雷达脉冲数据的时刻)。过了一时刻,窗口B开始包含信号能量,判决变量m开始减小,当B也全部有数据分组通过时,判决变量m又恢复平坦。事实上,判决变量m_n可以看成是微分器,当输入信号能量变化剧烈时它的值会比较大。可以根据判决变量m的变化进行是否有雷达脉冲到达的判断,当m超过某个阈值时,即可判断有新分组到达。当m持续小于阈值时,可以判断雷达脉冲结束。m = A/B

双滑动窗口能量检测算法的verilog实现

在理解了双滑动窗口能量检测算法流程之后,如何使用verilog编写相应代码,实现在FPGA上信号检测,才是本文的主要目的,本文中,笔者选择窗口A和窗口B的窗长都设置为32,即总长64,每个窗口的计算长度为32,即相当于窗口A计算前32窗口的数据总和,窗口B计算后32窗口的数据总和。
在这里插入图片描述
粗略示意如上,我们不需要统计32个数据之后,再进行一次计算,因为它是滑动的,这样显然会造成逻辑混乱。
在fpga中,我们可以使用32级移位寄存器,实现32个数据的累加,窗口A的计算流程:
即窗口A当前的32个数据总和=当前输入数据 - 输入延迟32周期的数据 + 上一个周期的32个数据总和
同理因为窗口B相比与窗口A还延迟32个周期,则对于窗口B,使用64级移位寄存器,实现出窗口B的计算流程:
即窗口B当前的32个数据总和=输入延迟32周期数据 - 输入延迟64周期的数据 + 上一个周期的32个数据总和
为了验证笔者上述的计算思路是否正确,笔者先使用自增数进行计算逻辑的验证,因为自增数据的加和容易计算,可以进行对比
首先进行分析,当1~32这32个数据全部进入窗口A时,B中的数据仍未0,则窗口A的总和应该为(1+32)*16 = 528,而窗口B的总和为0。
仿真结果如下:
在这里插入图片描述
当33~64这32个数据全部进入窗口A时,B中的窗口数据应为1-32,(33+64)*16 = 1552 仿真结果如下
在这里插入图片描述
对于32级移位寄存器与64级移位寄存器,代码中选择使用vivado的RAM-based Shift Register实现
在这里插入图片描述

经过自增数的验证,可以得出代码逻辑无误,接下来便是在matlab中仿真生成含有噪声的雷达脉冲数据,量化后存入ROM,用以进行仿真测试
matlab生成雷达脉冲数据

在这里插入图片描述
在实际信号检测中,为了确保稳定,需要进行多点脉冲检测,在本代码中,只有当阈值持续高于16个时钟周期,才进行有效信号指示的拉高,同理,结束信号也是这样进行判断。

对于阈值的设定,需要根据信噪比进行确实,或者采用门限自适应算法,这一部分,笔者在接下来的学习中,会进行总结。

整体来说,这个功能实现起来还是比较简单的,笔者也是个萌新,在学习过程中探索,如果有什么问题,欢迎大家在评论区批评指正。

如果觉得笔者的文章对您有些帮助,希望点个赞,激励下笔者的创作,不胜感激!

关于本文的完整matlab代码与vivado工程,可以私信博主免费领取!!!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值