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

news2025/1/11 4:11:15

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

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

目录

静态杂波滤除

到达角估计 


静态杂波滤除

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

  • 零速通道置零法
  • 动目标显示(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,mode
	BB_P2_CFG1(USE_RANGE*NUM_BYTE32,NUM_BYTE32); //src0JumpInc,src0InterInc
	BB_P2_CFG2(bb_prep.cfg2.jumpInc,FFT1D_CACHE_ADDR); //src0IntraInc,src0BaseAddr
	BB_P2_CFG3(0,0); //src1JumpInc,src1InterInc
	BB_P2_CFG4(0,0); //src1IntraInc,src1BaseAddr
	BB_P2_CFG5(USE_RANGE*NUM_BYTE32,NUM_BYTE32); //dstJumpInc,dstInterInc
	BB_P2_CFG6(0,FFT1D_MEAN_ADDR); //dstIntraInc,dstBaseAddr
	BB_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 0
		USART_Transmit_Bytes(&USART0,(uint8_t *)FFT1D_MEAN_ADDR,USE_RANGE*NUM_ANT*NUM_BYTE32);
	#endif
#endif

/*********************************************P2 minus+FFT2DANT1*********************************************/
#if 1
	BB_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,mode
	BB_P2_CFG1(0,0); //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_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>useB
	BB_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,winEn
	bb_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,src0BaseAddr
	sP2_Cfg4 =(uint64_t)(FFT1D_MEAN_ADDR+USE_RANGE*NUM_BYTE32*CFAR_ANT);//src1IntraInc,src1BaseAddr
	sFFT_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,src0BaseAddr
		sP2_Cfg4 =(uint64_t)FFT1D_MEAN_ADDR+USE_RANGE*NUM_BYTE32*CFAR_ANT+rangeNow*NUM_BYTE32;	//src1IntraInc,src1BaseAddr
		sFFT_Cfg2 = ((uint64_t)bb_prep.cfg2.jumpInc)<<BB_BIT32_POS|(FFT2D_CACHE_ADDR+USE_RANGE*CFAR_ANT*NUM_BYTE32+rangeNow*NUM_BYTE32);//dstIntraInc,dstBaseAddr
		BB_waitISR(BB_ISR_FFT_UNLOAD_END);
	}
	BB_OPGATE_DIS(BB_GATE_P2|BB_GATE_FFT);
	#if 0
		for(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 //abs
	USART_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,src0BaseAddr
	BB_P2_CFG4(NUM_ANGLE*NUM_BYTE32,STEERING_VEC_PF_ADDR+frameRst->target[targetNow].d3Idx*NUM_BYTE32); //src1IntraInc,src1BaseAddr
	//FFT4D
	BB_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 0
		USART_Transmit_Bytes(&USART0, (uint8_t*)FFT4D_CACHE_ADDR,NUM_ANGLE*NUM_BYTE32);
	#endif
	frameRst->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.coloradmin.cn/o/1037605.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【数据结构】什么是数据结构?

&#x1f984;个人主页:修修修也 &#x1f38f;所属专栏:数据结构 ⚙️操作环境:Visual Studio 2022 数据结构的定义 数据结构(Data Structure)是计算机存储,组织数据的方式,指相互之间存在一种或多种特定关系的数据元素的集合. 这么讲可能有些抽象,放一张图大家可能好理解一点…

Python 打印素数

"""打印素数介绍&#xff1a;素数是指只有两个正因数&#xff08;1和它本身&#xff09;的自然数&#xff0c;而且必须大于1。例如&#xff1a;2、3、5、7、11、13、17、19、23、29等等都是素数。小于2的数不是素数&#xff0c;因为它没有两个正因数。例如&…

编译原理龙书-词法分析

词法分析 词法分析器的作用 词法分析器的主要任务是读入源程序的输入字符&#xff0c;将它们组成词素&#xff0c;生成并输出一个词法单元序列&#xff0c;每个词法单元对应于一个词素 有时&#xff0c;词法分析器可以分成两个级联的处理阶段&#xff1a; 扫描阶段主要负责完…

Base64编码与打印标签(label)实例

文章目录 前言一、Base64 的简单认识二、Base64的使用场景三、 Base64的解码注意问题举个最近与后端配合的例子 四、 base64 转换为arrayBuffer&#xff0c;blod总结 前言 文件格式转换&#xff0c;在日常编程尤为常见&#xff0c;例如pdf文件大小的压缩存储&#xff0c;前端用…

Arduino驱动MMA7260三轴加速度传感器(惯性测量传感器篇)

目录 1、传感器特性 2、控制器和传感器连线图 3、驱动程序 Arduino驱动MMA7260三轴加速度传感器芯片,可以应用到摩托车和汽车放倒报警、遥控航模、游戏手柄、人形机器人跌倒检测、硬盘冲击保护、倾斜度测量等场合。 1

Java初级到中级:技术提升的策略与方法

文章目录 1 问题背景2 前言3 方法 1 问题背景 截至2023年7月&#xff0c;笔者已经毕业2年了&#xff0c;每天都在搬砖打螺丝&#xff0c;自我感觉需要沉淀、思考、总结一下。思考和总结一下如何从Java初级提升到Java中级&#xff0c;需要掌握一些什么方法论&#xff0c;有效地去…

使用命令行快速创建Vite项目

一、构建项目 在终端中使用如下命令行&#xff1a; npm create vite 二、定义项目名称 三、选择项目类型 Vanilla是我们常用的JavaScript&#xff0c;Vue和React是常用前端框架&#xff0c;可以根据自己的需要进行选择 通过上下键进行选择&#xff0c;按下回车进行确认 创建…

CMU15-445 format\clang-format\clang-tidy 失败

CMU15-445 format\clang-format\clang-tidy 失败 问题修改 问题 -- Setting build type to Debug as none was specified. -- Youre using Clang 14.0.0 CMake Warning at CMakeLists.txt:67 (message):BusTub/main couldnt find clang-format.CMake Warning at CMakeLists.tx…

VS2019创建GIt仓库时剔除文件或目录

假设本地有解决方案“SomeSolution” 1、首先”团队资源管理器“-“创建Git存储库”&#xff0c;选择“仅限本地”、“创建” VS会在解决方案目录下自动生成.gitattributes、.gitignore 2、编辑gitignore&#xff0c;直接拖到VS里或者用记事本打开。添加要剔除的文件或文件夹…

git --- 回滚 restore, reset, revert

git --- 回滚 restore, reset, revert git revertgit restoregit resetgit reset --softgit reset --mixedgit reset -- hard git revert git revert 是用于“反做”某一个版本&#xff0c;以达到撤销该版本的修改的目的也就是git revert会生成一个新的commit, 而这个commit需要…

Spring Cloud Alibaba快速整合OpenFeign

文章目录 spring cloud alibaba 整合OpenFeign整合流程1.导入依赖2. 编写调用接口2.1 service&#xff08;这里写的是clients&#xff09;2.2 controller 3.设置其最大链接时间3.1 配置文件3.2 client3.3 接口3.4 被访问的controller spring cloud alibaba 整合OpenFeign Fore…

C++之lseek64应用总结(二百三十六)

简介&#xff1a; CSDN博客专家&#xff0c;专注Android/Linux系统&#xff0c;分享多mic语音方案、音视频、编解码等技术&#xff0c;与大家一起成长&#xff01; 优质专栏&#xff1a;Audio工程师进阶系列【原创干货持续更新中……】&#x1f680; 人生格言&#xff1a; 人生…

基于STM32的宠物托运智能控制系统的设计(第十七届研电赛)

一、功能介绍 使用STM32作为主控设备&#xff0c;通过DHT11温湿度传感器、多合一空气质量检测传感器以及压力传感器对宠物的托运环境中的温湿度、二氧化碳浓度和食物与水的重量进行采集&#xff0c;将采集到的信息在本地LCD显示屏上显示&#xff0c;同时&#xff0c;使用4G模块…

IO模型学习

一、IO读写的基本原理 一个原则&#xff1a;操作系统将内存划分为两部分&#xff1a;一个是内核空间&#xff0c;一个是用户空间。在linux操作系统中&#xff0c;内核模块运行在内核空间&#xff0c;相应的进程处在内核态&#xff1b;用户程序运行在用户态&#xff0c;对应的进…

Vis.js教程(一):基础教程

1、Vis.js是什么 一个动态的、基于浏览器的可视化库。 该库的设计易于使用&#xff0c;能够处理大量动态数据&#xff0c;并能够对数据进行操作和交互。 该库由 DataSet、Timeline、Network、Graph2d 和 Graph3d 组件组成。 Vis.js官网&#xff1a;https://visjs.org/ github…

MS COCO数据集介绍以及pycocotools使用

MS COCO数据集介绍以及pycocotools使用 1、MS COCO数据集简介2、MS COCO数据集目录结构3、 MS COCO标注文件格式3.1 使用Python的json库查看3.2 使用官方cocoAPI查看 4、目标检测验证任务mAP 1、MS COCO数据集简介 2、MS COCO数据集目录结构 ├── coco2017: 数据集根目录├─…

Elasticsearch(Es搜索(简单使用、全文查询、复合查询)、地理位置查询、特殊查询、聚合操作、桶聚合、管道聚合)

Elasticsearch&#xff08;三&#xff09;——Es搜索&#xff08;简单使用、全文查询、复合查询&#xff09;、地理位置查询、特殊查询、聚合操作、桶聚合、管道聚合 一、Es搜索 这里的 Es 数据博主自己上网找的&#xff0c;为了练习 Es 搜索。 1、Elasticsearch 搜索入门 …

<十二>objectARX开发:Arx注册命令类型的含义以及颜色索引对应RGB值

1、注册命令类型 我们经常在acrxEntryPoint.cpp中看到注册命令如下: 那么各个宏定义代表什么意思呢? 主标识:(常用的) ACRX_CMD_MODAL: 在别的命令执行的时候该命令不会在其中执行。ACRX_CMD_TRANSPARENT: 命令可以再其它命令中执行,但在该标志下ads_sssetfirst()不能使…

Python实现猎人猎物优化算法(HPO)优化LightGBM回归模型(LGBMRegressor算法)项目实战

说明&#xff1a;这是一个机器学习实战项目&#xff08;附带数据代码文档视频讲解&#xff09;&#xff0c;如需数据代码文档视频讲解可以直接到文章最后获取。 1.项目背景 猎人猎物优化搜索算法(Hunter–prey optimizer, HPO)是由Naruei& Keynia于2022年提出的一种最新的…

MySQL学习笔记13

DISTINCT数据去重&#xff1a; 案例&#xff1a;获取tb_student学生表学员年龄的分布情况。 mysql> select * from tb_student; ------------------------------------------------- | id | name | age | gender | address | --------------------------…