目标反射回波检测算法及其FPGA实现之一:算法概述

前段时间,接触了一个声呐目标反射回波检测的项目。声呐接收机要实现的核心功能是在含有大量噪声的反射回波中,识别出发射机发出的激励信号的回波。我会分几篇文章分享这个基于FPGA的回波识别算法的开发过程和原码,欢迎大家不吝赐教。以下原创内容欢迎网友转载,但请注明出处: https://www.cnblogs.com/helesheng。本文首先简要介绍基于FPGA的互相关反射回波检测算法的主要设计思路。

声呐测距的原理非常简单,如下图所示,抹香鲸在水下发射特定的声波信号,并监听感兴趣的对象(乌贼)反射的该声波的回波。抹香鲸就可以根据回波的时间、幅度和相位的信息,“推算出”乌贼的方位、距离、速度和体表硬度等基本物理信息。

图1 声呐基本原理示意图

这里我们只讨论最简单的物理信息——距离。抹香鲸可以根据反射波到达的时间“计算”出和猎物之间的距离:L=V×Δt/2

图2 声呐测距示意图

由上图可知,声呐测距的问题可以被简化为:如何在接收到的信号中准确的定位出发射信号的反射回波。造成反射信号定位困难的原因有二:反射信号经过目标反射和长距离传播后信号强度大大降低;大量的噪声进一步降低了接收信号的信噪比。

下图上方是对一段长度为64个采样点的正弦信号(约6个周期)加blackman窗后得到的理想回波信号。下图下方则是用matlab产生的仿真回波信号,其中加入了标准差为800白噪声。可以看出,想不经过任何算法就得到反射回波的位置不是一件容易的事。

图3 理论回波信号和加入了噪声后的仿真回波信号

一种最直接的思路是对信号求短时傅里叶变换(short-time FFT)。在Matlab中仿真这一过程的MATLAB代码如下。

%%这个脚本用于验证短时傅里叶变换检测回波的算法

i=1:60;

s=2000*sin(2*pi*i*6/60);%加了blackman窗的信号模板

s=[0,0,s,0,0];

s=s.*(blackman(64))';

sl=[zeros(1,100),s,zeros(1,100)];%两边扩展后的信号

figure;

subplot(2,1,1);

plot(sl);grid;

title('理论回波信号')

n=randn(1,264)*800;%方差为800的噪声信号

slp=sl+n;%加入噪声后的扩展信号

subplot(2,1,2);

plot(slp);grid;

title('加入白噪声后的仿真回波实际信号')

[S,F,T,P]=spectrogram(slp,64,63,64,50E3);%slp为信号,64为加窗的长度,60为每次傅里叶变换交叠部分的长度,64为傅里叶变换的长度,50E3是采样率。

figure;

surf(abs(S));

xlabel('时间')

ylabel('频率')

zlabel('信号强度')

title('短时傅里叶变换得到的时频图')

得到仿真回波信号的时频图如下所示。从图中可以发现短时短时傅里叶算法能够成功的检出回波出现的时间。 

图4 短时傅里叶变换得到的时频图

但采用短时傅里叶变换搜索反射回波的办法有以下缺点:

1、FFT算法的乘加计算的计算量为N*Log(N),例如,当窗口长度为64时,进行的乘加运算次数为64*6=384次MAC(乘加)运算。为了获得最够高的时域分辨率和目标定位精度,需要足够高的短时傅里叶窗口交叠率(overlap rate)。例如,为了获得固定采样率下的最高定位精度,每次采样后都应该进行一次FFT,每个A/D采样间隔要执行的计算量是384次MAC。

2、短时傅里叶变换需要对信号加窗截断为较短的长度分别进行FFT,以提高结果在时域的分辨率,而加窗会在截断边界处产生能量泄露效应。而这一点在上图中就有所体现,在时频图的边界处产生较大的干扰,影响算法对回波位置的判断。

3、短时傅里叶变换只在激励信号为正/余弦信号时才有效。如果激励信号在频域不是一根唯一的谱线(也就是非正/余弦信号),则反射回波中也会含有其他频率分量,对其实施FFT就很难判断哪些是激励哪些是噪声了。

一种更优的算法使通过计算激励信号M(t)和反射回波s(t)的互相关:

                                       (1)

来搜索反射回波在时间轴上的位置。其物理解释是:在回波信号中搜索和激励信号M(t)“最相似”的地方,从而定位哪里最像回波信号。下图是对没有添加噪声的理论回波信号相关的结果。

图5 理论回波信号和激励的互相关

显然,由于激励信号具有一定的周期性,导致互相关结果具有更加复杂的周期性结构。如果直接采用式(1)的结果来计算回波位置是不明智的,需要进一步通过积分环节来降低结果中的高频周期拨动。当然,由于互相关结果R(τ)的直流分量为0,直接对其积分也不行。可以先对其求平方,以产生与R(τ)的功率成正比,且只有正值的信号,才能用于积分计算。我设计了如下所示的目标函数来表征回波信号与激励信号的相似程度。

                                            (2)

其中t0是最后一步积分求和窗口的长度,如果也取激励信号的长度,即64,则得到如下图所示的理想信号仿真结果。

图6 对互相关结果求平方的仿真

图7 对平方结果截断积分的结果

采用和上述短时傅里叶变换同样严格的加性噪声参数验证这一算法的Matlab仿真代码如下所示。

%这个脚本用于验证回波卷积算法

i=1:60;

s=2000*sin(2*pi*i*6/60);%加了blackman窗的信号模板

s=[0,0,s,0,0];

s=s.*(blackman(64))';

plot(s);grid;

title('5K信号的64个点@50KSPS')

sl=[zeros(1,100),s,zeros(1,100)];%两边扩展后的信号

figure;

subplot(5,1,1);

plot(sl);grid;

title('理论回波信号')

n=randn(1,264)*800;%方差为800的噪声信号

slp=sl+n;%加入噪声后的扩展信号

subplot(5,1,2);

plot(slp);grid;

title('加入白噪声后的仿真回波实际信号')

tp=conv(slp,s);%加入噪声后的仿真实际信号和模板卷积(由于激励信号左右对称,这里采用卷积函数conv()计算互相关)

subplot(5,1,3);

plot(tp);grid;

title('实际信号和信号模板卷积的结果')

tp1=tp.^2;%计算卷积结果的平方(能量)

subplot(5,1,4);

plot(tp1);grid;

title('卷积结果的平方')

w=ones(1,64);%矩形窗,用于通过卷积对历史数据求和

tp2=conv(w,tp1);%历史数据累加

subplot(5,1,5);

plot(tp2);grid;

title('历史数据累加')

其运行结果如下图所示。

图8 对加入噪声的回波信号采用互相关算法的仿真结果

可以看出最后一行的积分结果具有相当高的信噪比,能够容易的分辨出加入噪声(方差也是800)的回波信号中回波的位置。

另外,这种算法非常好的解决了短时傅里叶变换中出现的问题:

1、相关算法的乘加计算量为N,大大小于FFT的计算量N*log(N),当激励信号长度为64个采样点时,一个采样周期中的计算量仅为64次MAC。当激励信号为左右对称的信号时,计算量可以进一步减少为N/2次乘加运算。

2、对激励加窗函数后在计算相关可以有效的避免加窗带来的泄露效应,从上图的仿真结果中可以看出(2)式积分结果两端不存在干扰。

3、可对任何形式的激励信号(如方波或锯齿波)实时相关计算,其频谱中即使存在多条谱线或连续谱也不会影响(2)式积分结果。

细心的读者会发现所谓“短时傅里叶方法”和这里提出的“互相关搜索法”具有相通之处,用通俗的语言解释:

傅里叶变换的实质就是让信号和不同频率的正弦信号相关,以计算信号和它们的“相似度”,从而得到信号在不同频率下的“功率密度”,并进一步得到频谱的。而我们直接采用互相关法的优势就在于,不在需要计算奈奎斯特频率以内其他频率正弦信号和信号的相关了。当然,由于我们搜索的就是回波中和激励信号频率相同的信号所在的位置,这种“互相关搜索法”自然能够省去“短时傅里叶方法”中大部分的计算量。

关于上述算法在FPGA中的实际实现,请关注后续博文“目标反射回波检测算法及其FPGA实现之二:互相关/卷积/FIR电路的实现”。

关于A/D和D/A转换即实验平台搭建的过程,请参看本系列的上一篇博文“目标反射回波检测算法及其FPGA实现(准备篇) —— 用Verilog-HDL状态机控制硬件接口” 。

目标反射回波检测算法及其FPGA实现 之一:算法概述的更多相关文章

  1. 目标反射回波检测算法及其FPGA实现 之三:平方、积分电路及算法的顶层实现

    目标反射回波检测算法及其FPGA实现之三: 平方.积分电路及算法的顶层实现 前段时间,接触了一个声呐目标反射回波检测的项目.声呐接收机要实现的核心功能是在含有大量噪声的反射回波中,识别出发射机发出的激 ...

  2. 目标反射回波检测算法及其FPGA实现 之二:互相关/卷积/FIR电路的实现

    目标反射回波检测算法及其FPGA实现之二: 互相关/卷积/FIR电路的实现 前段时间,接触了一个声呐目标反射回波检测的项目.声呐接收机要实现的核心功能是在含有大量噪声的反射回波中,识别出发射机发出的激 ...

  3. 目标反射回波检测算法及其FPGA实现(准备篇): 用Verilog-HDL状态机控制硬件接口

    基于FPGA的目标反射回波检测算法及其实现(准备篇) :用Verilog-HDL状态机控制硬件接口 前段时间,开发了一个简单的目标反射回波信号识别算法,我会分几篇文章分享这个基于FPGA的回波识别算法 ...

  4. paip.检测信用卡账单数据的正确性算法

    paip.检测信用卡账单数据的正确性算法 主要3点: //1.重点检测.大钱记录 //2.检测遗漏记录 //3.排除双唇记录. //4.试着cls share,改变错误的cls. 作者Attilax ...

  5. bresenham算法的FPGA的实现2

    在上一篇里http://www.cnblogs.com/sepeng/p/4045593.html <bresenham算法的FPGA的实现1>已经做了一个整体框架的布局,但是那个程序只是 ...

  6. 基于FPGA的Cordic算法实现

    CORDIC(Coordinate Rotation Digital Computer)算法即坐标旋转数字计算方法,是J.D.Volder1于1959年首次提出,主要用于三角函数.双曲线.指数.对数的 ...

  7. 基于dsp_builder的算法在FPGA上的实现(转自https://www.cnblogs.com/sunev/archive/2012/11/17/2774836.html)

    一.摘要 结合dsp_builder.matlab.modelsim和quartus ii等软件完成算法的FPGA实现. 二.实验平台 硬件平台:DIY_DE2 软件平台:quartus ii9.0 ...

  8. FPGA之CORDIC算法实现_代码实现(下)

    关于FPGA之CORDIC算法的纯逻辑实现,博主洋葱洋葱“https://www.cnblogs.com/cofin/p/9188629.html”以及善良的一休军“https://blog.csdn ...

  9. 【图像处理】Haar Adaboost 检测自定义目标(视频车辆检测算法代码)

    阅读须知 本博客涉及到的资源: 正样本:http://download.csdn.net/detail/zhuangxiaobin/7326197 负样本:http://download.csdn.n ...

随机推荐

  1. Python学习---面向对象的学习[基础]

    面向对象 面向对象的三大特性是指:封装.继承和多态. 说明: Python可以函数式编程,也可以面向对象编程 l 面向过程:根据业务逻辑从上到下写垒代码 l 函数式 :将某功能代码封装到函数中,日后便 ...

  2. HTML学习---HTML状态码

    301 Moved Permanently 永久移动.请求的资源已被永久的移动到新URI,返回信息会包括新的URI,浏览器会自动定向到新URI.今后任何新的请求都应使用新的URI代替302 Found ...

  3. 沉淀再出发:关于java中的AQS理解

    沉淀再出发:关于java中的AQS理解 一.前言 在java中有很多锁结构都继承自AQS(AbstractQueuedSynchronizer)这个抽象类如果我们仔细了解可以发现AQS的作用是非常大的 ...

  4. JVM垃圾收集算法的选择

    1. 介绍 JVM提供了多种垃圾收集器,应该根据应用选择一种合适的垃圾收集器. 垃圾回收管理内存通过如下操作: 在年轻代分配对象,把年龄大的对象晋升到老年代. 当年老代超过阈值的时候,并发标记收集. ...

  5. 消息中间件--"rocketmq"02之QuickStart

    依赖 <dependency> <groupId>com.alibaba.rocketmq</groupId> <artifactId>rocketmq ...

  6. TensorFlow函数(五)参数初始化方法

    1.初始化为常量 tf.constant_initializer(value, dtype) 生成一个初始值为常量value的tensor对象 value:指定的常量 dtype:数据类型 tf.ze ...

  7. [Python 多线程] Lock、阻塞锁、非阻塞锁 (八)

    线程同步技术: 解决多个线程争抢同一个资源的情况,线程协作工作.一份数据同一时刻只能有一个线程处理. 解决线程同步的几种方法: Lock.RLock.Condition.Barrier.semapho ...

  8. mysql存储过程学习(一)

    转载 什么是存储过程,存储过程的作用及优点  mysql存储过程详细教程  mysql 使用存储过程批量插数据 一.存储过程介绍: 存储过程(Stored Procedure)是一组为了完成特定功能的 ...

  9. iOS中Block循环引用的问题

    说到循环引用问题,想必大家都碰到过吧,比如在使用Block的时候,使用__weakSelf来代替self解决等,但是对于这个,还是有不少可以探索的点,下面我就来说下,希望对大家有所帮助. 是否所有的B ...

  10. CentOS7 minimal(最小化安装)后增加的软件安装

    1.net-tools 安装,因为习惯使用ifconfig命令 2.wget安装,下载工具必不可少 3.vim安装,相比于vi个人更喜欢vim 4.yum-plugin-priorities安装,用于 ...