雷达编程实战之静态杂波滤除与到达角估计

雷达中经过混频的中频信号常常混有直流分量等一系列硬件设计引入的固定频率杂波,我们称之位静态杂波,雷达信号处理需要把这些静态杂波滤除从而有效的提高信噪比,实现准确的目标检测功能。

目标的到达角估计作为常规车载雷达信号处理的末端,因为雷达阵列规模的限制等原因,是一个比较容易出错的环节,下文介绍了几种常见的到达角估计方法,并穿插介绍了俯仰角的一种计算方式,能够很好解决俯仰角错误估计导致的后续数据处理流程中将井盖与交通警示牌混淆的问题。俯仰角计算需要接收(发射)天线之间在水平面法线上有距离差。

目录

静态杂波滤除

到达角估计 


静态杂波滤除

信号处理算法中的静态杂波滤除主要有以下几种方法:

  • 零速通道置零法
  • 动目标显示(MTI)
  • 相量均值相消算法

零速通道置零法方法在2D-FFT(速度维FFT)后直接将零速附近通道置零,此操作意味着静止目标或者低速目标会直接消失,此操作意味着静止目标或者低速目标会直接消失,下图左中信号的直流分量幅值很高,目标的幅度被直流分量严重压制,在进行后续的CFAR处理之前最好能够将信号的直流分量去除,便于提高雷达的性能,右边是采用零通道置零法之后的R-V谱矩阵,可以看出,这种方法对直流分量有一定的抑制效果,但对目标的微多普勒信息有一定的损失。因此,采用这种最简单的方法需要考虑具体的应用场景。

MTI是指利用杂波抑制滤波器来抑制杂波,提高雷达信号的信杂比,以利于运动目标检测的技术。 

静止目标或者杂波在多Chirp数据间不会产生初始相位的变化,其均值会很大。如果目标是运动目标或者微动目标,由于目标运动会导致每个Chirp间的相位不同,其相量求和累加后会出现抵消(可以想象成正弦信号每个点相加为零),则其均值会很小,也就是说,对1DFFT结果中所有Chrip求得平均Chirp就可以得到静态杂波,然后用每Chirp减去刚才计算的均值chirp就可以得到目标回波信号,核心思想是求均值做差。我们项目中使用的是第三种方法,使用的是芯片中的硬核,具体的实现代码如下。

/********************************************P2 mean******************************************************/
#if 1
//					memset((uint8_t *)FFT1D_MEAN_ADDR,0,10*1024);BB_OPCLEAR(BB_CLEAR_P2);BB_OPGATE_EN(BB_GATE_P2);BB_P2_CFG0(NUM_ANT-1,USE_RANGE-1,NUM_CHIRP-1,P2_CFG0_DIV64,P2_CFG0_SUBMODE_CPX_SUM_MUL,P2_CFG0_MODE_ACC); //jumpCnt,interCnt,intraCnt,rsfBit,sub_mode,modeBB_P2_CFG1(USE_RANGE*NUM_BYTE32,NUM_BYTE32); //src0JumpInc,src0InterIncBB_P2_CFG2(bb_prep.cfg2.jumpInc,FFT1D_CACHE_ADDR); //src0IntraInc,src0BaseAddrBB_P2_CFG3(0,0); //src1JumpInc,src1InterIncBB_P2_CFG4(0,0); //src1IntraInc,src1BaseAddrBB_P2_CFG5(USE_RANGE*NUM_BYTE32,NUM_BYTE32); //dstJumpInc,dstInterIncBB_P2_CFG6(0,FFT1D_MEAN_ADDR); //dstIntraInc,dstBaseAddrBB_ISR_CLEAR(BB_ISR_P2_JUMP_END);BB_OPTRIG(BB_TRIG_P2);BB_waitISR(BB_ISR_P2_JUMP_END);BB_OPGATE_DIS(BB_GATE_P2);#if 0USART_Transmit_Bytes(&USART0,(uint8_t *)FFT1D_MEAN_ADDR,USE_RANGE*NUM_ANT*NUM_BYTE32);#endif
#endif/*********************************************P2 minus+FFT2DANT1*********************************************/
#if 1BB_P2_CFG0(0,0,NUM_CHIRP-1,P2_CFG0_DIV1,P2_CFG0_SUBMODE_CPX_MINUS,P2_CFG0_MODE_ADD); //jumpCnt,interCnt,intraCnt,rsfBit,sub_mode,modeBB_P2_CFG1(0,0); //src0JumpInc,src0InterIncBB_P2_CFG3(0,0); //src1JumpInc,src1InterIncBB_P2_CFG5(0,0); //dstJumpInc,dstInterIncBB_P2_CFG6(0,BB_FFT_BASE); //dstIntraInc,dstBaseAddrBB_FFT_Cfg0(0,0,FFT2D_USE_A,FFT2D_USE_B,NUM_CHIRP-1,FFTPT_256,FFT_UNLOAD_EN,FFT_MODE_FORWARD); //rsfOutput,rsfInput,useA,useB,inPt,fftPt,unloadEn,mode   //useA>useBBB_FFT_ZP_Clear();BB_FFT_Cfg1(WIN_VEL1_ADDR,FFT_CFG1_OUTLSFEN_RIGHT,0,FFT_CFG1_INLSFEN_RIGHT,0,FFT_CFG1_WIN_SIZE_14BIT,FFT_CFG1_WIN_EN); //winBaseAddr,winSize,winEnbb_regb_str->FFT_SRC_ZP00=fft2d_zp.txNum_zp0[CFAR_TX];bb_regb_str->FFT_SRC_ZP01=fft2d_zp.txNum_zp1[CFAR_TX];bb_regb_str->FFT_SRC_ZP02=fft2d_zp.txNum_zp2[CFAR_TX];bb_regb_str->FFT_SRC_ZP03=fft2d_zp.txNum_zp3[CFAR_TX];BB_FFT_CMD0(FFT_CMD0_CLEAR_IBUF);BB_OPCLEAR(BB_CLEAR_FFT|BB_CLEAR_P2);BB_OPGATE_EN(BB_GATE_P2|BB_GATE_FFT);sP2_Cfg2 =(uint64_t)bb_prep.cfg2.jumpInc<<BB_BIT32_POS|(FFT1D_CACHE_ADDR+USE_RANGE*CFAR_ANT*NUM_BYTE32); //src0IntraInc,src0BaseAddrsP2_Cfg4 =(uint64_t)(FFT1D_MEAN_ADDR+USE_RANGE*NUM_BYTE32*CFAR_ANT);//src1IntraInc,src1BaseAddrsFFT_Cfg2 = (uint64_t)bb_prep.cfg2.jumpInc<<BB_BIT32_POS|(FFT2D_CACHE_ADDR+USE_RANGE*CFAR_ANT*NUM_BYTE32);for(uint32_t rangeNow=1;rangeNow<=USE_RANGE;rangeNow++){bb_regb_str->P2_CFG2 = sP2_Cfg2;bb_regb_str->P2_CFG4 = sP2_Cfg4;bb_regb_str->FFT_CFG2 = sFFT_Cfg2;BB_FFT_CMD0(FFT_CMD0_CLEAR_IBUF);BB_ISR_CLEAR(BB_ISR_FFT_UNLOAD_END);BB_OPTRIG(BB_TRIG_P2);sP2_Cfg2 =((uint64_t)bb_prep.cfg2.jumpInc)<<BB_BIT32_POS|(FFT1D_CACHE_ADDR+USE_RANGE*CFAR_ANT*NUM_BYTE32+rangeNow*NUM_BYTE32); //src0IntraInc,src0BaseAddrsP2_Cfg4 =(uint64_t)FFT1D_MEAN_ADDR+USE_RANGE*NUM_BYTE32*CFAR_ANT+rangeNow*NUM_BYTE32;	//src1IntraInc,src1BaseAddrsFFT_Cfg2 = ((uint64_t)bb_prep.cfg2.jumpInc)<<BB_BIT32_POS|(FFT2D_CACHE_ADDR+USE_RANGE*CFAR_ANT*NUM_BYTE32+rangeNow*NUM_BYTE32);//dstIntraInc,dstBaseAddrBB_waitISR(BB_ISR_FFT_UNLOAD_END);}BB_OPGATE_DIS(BB_GATE_P2|BB_GATE_FFT);#if 0for(uint32_t chirpNow=0; chirpNow<NUM_CHIRP; chirpNow++){USART_Transmit_Bytes(&USART0,(uint8_t *)FFT2D_CACHE_ADDR+USE_RANGE*CFAR_ANT*NUM_BYTE32+chirpNow*bb_prep.cfg2.jumpInc,USE_RANGE*NUM_BYTE32);}#endif#if 0 //absUSART_Transmit_Bytes(&USART0,(uint8_t *)&head[0],8);for (uint32_t chirpNow = 0;chirpNow<NUM_VEL;chirpNow++){USART_Transmit_Bytes(&USART0,(uint8_t *)(FFT2D_CACHE_ADDR+BB_ABS_OFFSET+chirpNow*bb_prep.cfg2.jumpInc+10*NUM_BYTE32),30*NUM_BYTE32);}#endif
#endif

到达角估计 

到达角估计有以下几种常见的方式:

  • 3DFFT
  • DBF
  • MUSIC与Capon

三维快速傅里叶变换算法是一种比较常见的算法,通过对雷达接收信号进行傅里叶变换,是通过MIMO多天线将角度信息转换到频域的方法。在频域中,可以通过对各个接收天线2DFFT后数据进行快速傅里叶变换从而得到目标的水平角,下面是它的Matlab代码实现,ADCBufCalib去除了速度维度的数据,只剩下了512点*16通道。

FFT1D_Buf=fft(squeeze(ADCBufCalib(:,1,:)));
FFT1D_Buf(1:10,:)=0;
FFT3D_Buf=fft(FFT1D_Buf,128,2);
FFT3D_BufABS=abs(FFT3D_Buf);    
figure(4);
meshz(fftshift(FFT3D_BufABS,2));

DBF是一种基于阵列信号处理的雷达到达角估计算法。DBF本质是构造视场范围内的各个角度的导向矢量,并用这些导向矢量分别去和阵列的回波信号相乘以得到各个角度下的能量值,通过寻找其中的极大值(目标所处方向的回波与导向矢量相干叠加,这些方向的能量会得到增强,而噪声是非相干的,能量得到增强的方向,对应极大值的位置,也即信号的方向)来得到实际回波的方向而达到测角的目的。我们可以利用这种方式来使用根据测得水平角的导向矢量与2DFFT水平角通道乘加增强之后,再对垂直通道进行4DFFT,选择出的最大值可以对应目标的俯仰角。下面是其用硬核实现的代码。 

BB_P2_CFG0(0,NUM_ANT_V-1,NUM_RX-1,P2_CFG0_DIV1,P2_CFG0_SUBMODE_CPX_SUM_MUL,P2_CFG0_MODE_MAC); //jumpCnt,interCnt,intraCnt,rsfBit,sub_mode,mode
BB_P2_CFG1(0,NUM_RX*USE_RANGE*NUM_BYTE32); //src0JumpInc,src0InterInc
BB_P2_CFG3(0,0); //src1JumpInc,src1InterInc
BB_P2_CFG5(0,0); //dstJumpInc,dstInterInc
BB_P2_CFG6(0,BB_FFT_BASE); //dstIntraInc,dstBaseAddr
BB_P2_CFG7(P2_CFG7_SRC0CONJ_DIS,P2_CFG7_SRC0LSF_RIGHT,0,
P2_CFG7_SRC1CONJ_DIS,P2_CFG7_SRC1LSF_RIGHT,0,
P2_CFG7_DSTCONJ_DIS,P2_CFG7_DSTLSF_RIGHT,0);
BB_FFT_Cfg0(0,0,FFT4D_USE_A,FFT4D_USE_B,NUM_ANT_V-1,FFTPT_128,FFT_UNLOAD_EN,FFT_MODE_FORWARD); //rsfOutput,rsfInput,useA,useB,inPt,fftPt,unloadEn,mode   //useA>useB
BB_FFT_Cfg1(WIN_RANGE_ADDR,FFT_CFG1_OUTLSFEN_RIGHT,0,FFT_CFG1_INLSFEN_RIGHT,0,FFT_CFG1_WIN_SIZE_14BIT,FFT_CFG1_WIN_DIS); //winBaseAddr,winSize,winEn
BB_FFT_Cfg2(NUM_BYTE32,FFT4D_CACHE_ADDR); //dstIntraInc,dstBaseAddr
BB_FFT_ZP_Clear();
bb_regb_str->FFT_SRC_ZP00=(uint64_t)0x07;
bb_regb_str->FFT_SRC_ZP01=(uint64_t)0;
BB_OPGATE_EN(BB_GATE_P2|BB_GATE_FFT);
for(uint32_t targetNow=0;targetNow<frameRst->targetNum;targetNow++)
{BB_P2_CFG2(USE_RANGE*NUM_BYTE32,FFT2D_CACHE_ADDR+frameRst->target[targetNow].d1Idx*NUM_BYTE32+frameRst->target[targetNow].d2Idx*bb_prep.cfg2.jumpInc); //src0IntraInc,src0BaseAddrBB_P2_CFG4(NUM_ANGLE*NUM_BYTE32,STEERING_VEC_PF_ADDR+frameRst->target[targetNow].d3Idx*NUM_BYTE32); //src1IntraInc,src1BaseAddr//FFT4DBB_OPCLEAR(BB_CLEAR_FFT|BB_CLEAR_P2);BB_FFT_CMD0(FFT_CMD0_CLEAR_IBUF);BB_ISR_CLEAR(BB_ISR_FFT_UNLOAD_END);BB_OPTRIG(BB_TRIG_P2);BB_waitISR(BB_ISR_FFT_UNLOAD_END);#if 0USART_Transmit_Bytes(&USART0, (uint8_t*)FFT4D_CACHE_ADDR,NUM_ANGLE*NUM_BYTE32);#endifframeRst->target[targetNow].d4Idx = BB_FFT_STA0_curMaxIdx;
}
BB_OPGATE_DIS(BB_GATE_P2|BB_GATE_FFT);

MUSIC与Capon:这两种方法对于大规模数据的处理速度较慢,这里就暂不介绍了,有兴趣的朋友可以自己找些资料研究一下。


十六宿舍 原创作品,转载必须标注原文链接。

©2023 Yang Li. All rights reserved.

欢迎关注 『十六宿舍』,大家喜欢的话,给个👍,更多关于嵌入式相关技术的内容持续更新中。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/116260.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

机器视觉康耐视Visionpro-脚本编写标记标识:点,直线,矩形,圆

显示标记标识的重要作用就是,对NG或者OK对操作机器视觉的人去看到具体位置缺陷或者NG坐标。 一.点CogPointMarker CogPointMarker PointMarker1 = new CogPointMarker();//创建对象,点CogPointMarker //注意运行工具 PointMarker1.X = 100; PointMarker1

多线程带来的的风险-线程安全

多线程带来的的风险-线程安全 ~~ 多线程编程中,最难的地方,也是一个最重要的地方&#xff0c;还是一个最容易出错的地方,更是一个面试中特别爱考的地方.❤️❤️❤️ 线程安全的概念 万恶之源,罪魁祸首是多线程的抢占式执行,带来的随机性.~~&#x1f615;&#x1f615;&…

人与机器只能感知到可以分类的事物?

众所周知&#xff0c;人与机器都能够感知和分类事物。人类拥有感官系统&#xff0c;如视觉、听觉、嗅觉、触觉和味觉&#xff0c;可以通过感知事物的外部特征和属性来进行分类。机器可以通过传感器和算法来感知和分类事物&#xff0c;比如计算机视觉技术可以通过图像和视频数据…

基于PLE结合卡尔曼滤波的RSSI定位算法matlab仿真

目录 1.算法运行效果图预览 2.算法运行软件版本 3.部分核心程序 4.算法理论概述 5.算法完整程序工程 1.算法运行效果图预览 2.算法运行软件版本 MATLAB2022a 3.部分核心程序 ............................................................... for Num_xb Num_xb2Num_…

银行家算法——C语言实现

算法思路 将操作系统看作是银行家&#xff0c;操作系统所拥有的资源就相当于银行家所拥有的资产&#xff0c;进程向操作系统申请资源就相当于资产家向银行贷款&#xff0c;规定资产家在向银行贷款之前&#xff0c;先申明其所贷数额的最大值&#xff0c;申明之后其贷款的数额不…

【Verilog语法】比较不同计数器的运算方式,其中有一个数是延迟打一拍的效果,目的是使得两个计数器的结果相同。

比较不同计数器的运算方式&#xff0c;其中有一个数是延迟打一拍的效果&#xff0c;目的是使得两个计数器的结果相同。 1&#xff0c;第一种2&#xff0c;第二种3&#xff0c;第三种 第三种方案&#xff0c;完成实现。 1&#xff0c;第一种 &#xff08;1&#xff09;RTL modu…

深度学习自学笔记一:神经网络和深度学习

神经网络是一种模拟人脑神经元之间相互连接的计算模型&#xff0c;它由多个节点&#xff08;或称为神经元&#xff09;组成&#xff0c;并通过调整节点之间的连接权重来学习和处理数据。深度学习则是指利用深层次的神经网络进行学习和建模的机器学习方法。 假设有一个数据集&a…

SAP Service服务重注册技术手册

当SAP服务被卸载后,或SAP虚拟机整机copy后(可能还需要涉及主机名更改),需要对SAP服务重注册。 在路径 \sapmnt\<SID>\ DVEBMGS00\exe下使用程序sapstartsrv.exe来卸载、安装SAP服务: 其中<SID>、NR参考Service中需要卸载的服务名(卸载后,Services列表中的SA…

力扣刷题-链表理论基础

什么是链表 什么是链表&#xff0c;链表是一种通过指针串联在一起的线性结构&#xff0c;每一个节点由两部分组成&#xff0c;一个是数据域一个是指针域&#xff08;存放指向下一个节点的指针&#xff09;&#xff0c;最后一个节点的指针域指向null&#xff08;空指针的意思&a…

Android开发笔记 :理解Fragment

Android开发笔记&#xff1a;理解Fragment 导言 本篇文章产生的原因很简单&#xff0c;就是我在了解Android Jetpack中的Lifecycle框架时发现Lifecycle具体时间和状态的更新都是由一个名为ReportFragment的Fragment来跟踪的&#xff0c;为了更好的了解Fragment是如何追踪Activ…

从Python代码到诗

&#x1f433;序言 在Python社区&#xff0c;没有强制的编码标准&#xff0c;这虽然赋予了开发者更多的自由&#xff0c;但也导致代码风格不一致性。使得部分代码变得晦涩难懂&#xff0c;本文将探讨一系列的开发技巧和最佳实践&#xff0c;开发出优雅的Python脚本。 1、参数接…

基于AVR128单片机智能电风扇控制系统

一、系统方案 模拟的电风扇的工作状态有3种&#xff1a;自然风、常风及睡眠风。使用三个按键S1-S3设置自然风、常风及睡眠风。 再使用两个按键S4和S5&#xff0c;S4用于定时电风扇定时时间长短的设置&#xff0c;每按一次S4键&#xff0c;定时时间增加10秒&#xff0c;最长60秒…