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

目标反射回波检测算法及其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中的实际实现,请关注后续博文“用Verilog-HDL摩尔型状态机进行流程控制”。

关于A/D和D/A转换即实验平台搭建的过程,请参看本系列的上一篇博文“互相关/卷积/FIR电路的实现”。

原文地址:https://www.cnblogs.com/helesheng/p/9467308.html

时间: 2024-11-29 01:05:14

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

bresenham算法的FPGA的实现2

在上一篇里http://www.cnblogs.com/sepeng/p/4045593.html <bresenham算法的FPGA的实现1>已经做了一个整体框架的布局,但是那个程序只是支持|k|<1.要想全屏支持,就还需要对这个程序做修改,觉得自己的修改方式很繁琐,期望大家的指点,有高质量的code出现.算法的原理部分在上一篇中已经给出 1 /* 2 date:2014/10/23 3 version : QuartusII + de1-soc cyclone V 4 designe

基于改进人工蜂群算法的K均值聚类算法(附MATLAB版源代码)

其实一直以来也没有准备在园子里发这样的文章,相对来说,算法改进放在园子里还是会稍稍显得格格不入.但是最近邮箱收到的几封邮件让我觉得有必要通过我的博客把过去做过的东西分享出去更给更多需要的人.从论文刊登后,陆陆续续收到本科生.研究生还有博士生的来信和短信微信等,表示了对论文的兴趣以及寻求算法的效果和实现细节,所以,我也就通过邮件或者短信微信来回信,但是有时候也会忘记回复. 另外一个原因也是时间久了,我对于论文以及改进的算法的记忆也越来越模糊,或者那天无意间把代码遗失在哪个角落,真的很难想象我还会全

数据挖掘十大算法总结--核心思想,算法优缺点,应用领域

本文所涉算法均只概述核心思想,具体实现细节参看本博客"数据挖掘算法学习"分类下其他文章,不定期更新中.转载请注明出处,谢谢. 参考了许多资料加上个人理解,对十大算法进行如下分类: ?分类算法:C4.5,CART,Adaboost,NaiveBayes,KNN,SVM ?聚类算法:KMeans ?统计学习:EM ?关联分析:Apriori ?链接挖掘:PageRank 其中,EM算法虽可以用来聚类,但是由于EM算法进行迭代速度很慢,比kMeans性能差很多,并且KMeans算法 聚类效果

【转载】算法设计之五大常用算法设计方法总结

转载自http://blog.csdn.net/zolalad/article/details/11393915 算法设计之五大常用算法设计方法总结 一.[分治法]  在计算机科学中,分治法是一种很重要的算法.字面上的解释是"分而治之",就是把一个复杂的问题分成两个或更多的相同或相似的子问题,再把子问题分成更小的子问题--直到最后子问题可以简单的直接求解,原问题的解即子问题的解的合并.这个技巧是很多高效算法的基础,如排序算法(快速排序,归并排序),傅立叶变换(快速傅立叶变换)--等.任

算法导论——lec 13 贪心算法与图上算法

之前我们介绍了用动态规划的方法来解决一些最优化的问题.但对于有些最优化问题来说,用动态规划就是"高射炮打蚊子",采用一些更加简单有效的方法就可以解决.贪心算法就是其中之一.贪心算法是使所做的选择看起来是当前最佳的,期望通过所做的局部最优选择来产生一个全局最优解. 一. 活动选择问题 [问题]对几个互相竞争的活动进行调度:活动集合S = {a1, a2, ..., an},它们都要求以独占的方式使用某一公共资源(如教室),每个活动ai有一个开始时间si和结束时间fi ,且0 ≤ si &

基本算法研究1-冒泡排序算法测试

基本算法研究1-冒泡排序算法测试 1.经典冒泡排序法基本原理 先看一个动态图,感觉比较形象: 冒泡排序(Bubble Sort)是一种简单的排序算法.默认是从小到大排序,即把最大的数据排在最后,相当于每次把最大数据像气泡一样浮到水面一样.它重复地走访过要排序的数列,一次比较两个元素,如果他们的顺序错误就把他们交换过来.走访数列的工作是重复地进行直到没有再需要交换. 基本步骤: 1.比较相邻的元素.如果第一个比第二个大,就交换他们两个.        2.对每一对相邻元素作同样的工作,从开始第一对

【机器学习算法-python实现】采样算法的简单实现

1.背景 采样算法是机器学习中比较常用,也比较容易实现的(出去分层采样).常用的采样算法有以下几种(来自百度知道): 一.单纯随机抽样(simple random sampling) 将调查总体全部观察单位编号,再用抽签法或随机数字表随机抽取部分观察单位组成样本. 优点:操作简单,均数.率及相应的标准误计算简单. 缺点:总体较大时,难以一一编号. 二.系统抽样(systematic sampling) 又称机械抽样.等距抽样,即先将总体的观察单位按某一顺序号分成n个部分,再从第一部分随机抽取第k

【JavaScript】【算法】JavaScript版排序算法

JavaScript版排序算法:冒泡排序.快速排序.插入排序.希尔排序(小数据时,希尔排序会比快排快哦) 1 //排序算法 2 window.onload = function(){ 3 var array = [0,1,2,44,4, 4 324,5,65,6,6, 5 34,4,5,6,2, 6 43,5,6,62,43, 7 5,1,4,51,56, 8 76,7,7,2,1, 9 45,4,6,7,8]; 10 //var array = [4,2,5,1,0,3]; 11 array

图灵算法群《啊哈算法》领读

--图灵算法群阅读计划(第一期) 领读人:Zoctopus·Lian 本书特色 一本充满智慧和趣味的算法入门书.没有枯燥的描述,没有难懂的公式,一切以实际应用为出发点. 书中涉及到的数据结构有栈.队列.链表.树.并查集.堆和图等:涉及到的算法有排序.枚举.深度和广度优先搜索.图的遍历,当然还有图论中不可以缺少的四种最短路径算法.两种最小生成树算法.割点与割边算法.二分图的最大匹配算法等. 书中通过幽默的语言配以可爱的插图来讲解算法,使用C语言实现. 适合读者 适合算法零基础入门和喜爱编程的朋友(