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

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

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

目录

静态杂波滤除

到达角估计 


静态杂波滤除

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

  • 零速通道置零法
  • 动目标显示(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.xdnf.cn/news/140465.html

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

相关文章

针对敏感数据的安全转录服务

即便在新冠肺炎疫情期间&#xff0c;继续保持了最高级别的机密性 新冠肺炎疫情带来的各种限制向所有服务提供商提出了挑战&#xff0c;促使提供商们想方设法采取更富想象力的新方法来满足客户的需求。澳鹏采用了一种由两种方案组成的工作机制&#xff0c;服务于客户机密材料的…

解决Spring Boot 2.7.16 在服务器显示启动成功无法访问问题:从本地到服务器的部署坑

&#x1f337;&#x1f341; 博主猫头虎 带您 Go to New World.✨&#x1f341; &#x1f984; 博客首页——猫头虎的博客&#x1f390; &#x1f433;《面试题大全专栏》 文章图文并茂&#x1f995;生动形象&#x1f996;简单易学&#xff01;欢迎大家来踩踩~&#x1f33a; &a…

【100天精通Python】Day69:Python可视化_实战:导航定位中预测轨迹和实际轨迹的3D动画,示例+代码

目录 1. 预测的3D轨迹和实际轨迹的动画图&#xff0c;同时动态更新 2 真值轨迹设置为静态的&#xff0c;预测轨迹不断更新 3 网格的三维坐标系有旋转运动&#xff0c;以此全方位展示预测轨迹和真值轨迹之间的空间关系 1. 预测的3D轨迹和实际轨迹的动画图&#xff0c;同时动态更…

【Phoenix】phoenix实现每个Primarykey主键保留N版本数据,CDC数据记录为Changelog格式

一、背景&#xff1a; CDC数据中包含了&#xff0c;数据的变更过程。当CDC写入传统数据库最终每一个primary key下会保存一条数据。当然可以使用特殊手段保存多分记录但是显然造成了数据膨胀。 另外数据湖Hudi(0.13.1)是不支持保存所有Changelog其Compaction机制会清除所有旧版…

【操作系统笔记一】程序运行机制CPU指令集

内存地址 指针 / 引用 指针、引用本质上就是内存地址&#xff0c;有了内存地址就可以操作对应的内存数据了。 不同的数据类型 字节序 大端序&#xff08;Big Endian&#xff09;&#xff1a;字节顺序从低地址到高地址顺序存储的字节序小端序&#xff08;Little Endian&#…

【MySQL】 MySQL索引事务

文章目录 &#x1f6eb;索引&#x1f38d;索引的概念&#x1f333;索引的作用&#x1f384;索引的使用场景&#x1f340;索引的使用&#x1f4cc;查看索引&#x1f4cc;创建索引&#x1f332;删除索引 &#x1f334;索引保存的数据结构&#x1f388;B树&#x1f388;B树&#x…

10.5 串联型稳压电路(1)

稳压管稳压电路输出电流较小&#xff0c;输出电压不可调&#xff0c;不能满足很多场合下的应用。串联型稳压电路以稳压管稳压电路为基础&#xff0c;利用晶体管的电流放大作用&#xff0c;增大负载电流&#xff1b;在电路中引入深度电压负反馈使输出电压稳定&#xff1b;并且&a…

RabbitMQ快速入门——消费者

public class Consumer_HelloWorld {public static void main(String[] args) throws IOException, TimeoutException {//1.创建连接工厂ConnectionFactory factory new ConnectionFactory();//2.设置参数factory.setHost("172.16.98.133"); ip 默认值 localhostfac…

【论文写作】符号:矩阵、向量的乘法、内积、点积等

【论文写作】符号&#xff1a;矩阵、向量乘法、内积、点积等 文章目录 【论文写作】符号&#xff1a;矩阵、向量乘法、内积、点积等1. 矩阵乘法1.1 矩阵乘积1.2 矩阵哈德玛乘积1.3 矩阵克罗内克积 2. 向量乘法2.1 向量点积、内积2.2 向量Hadamard积2.3 向量外积2.4 向量叉积 1.…

预训练相关知识

1、上下文无关语义表示方式存在问题 语义不同的词具有相同的表示&#xff0c;&#xff08;apple 电子产品苹果/水果苹果&#xff09; 容易出现oov问题 2、神经语言编码器 2.1、序列模型 cnn/rnn等&#xff0c;捕获局部信息和序列依赖信息&#xff0c;无法捕获长距离依赖。易训…

罗德里格斯公式

1.点乘 A ⃗ ⋅ B ⃗ ∣ A ⃗ ∣ ∣ B ⃗ ∣ c o s ⟨ A ⃗ , B ⃗ ⟩ \vec{A} \cdot \vec{B} \left | \vec{A} \right | \left | \vec{B} \right | cos\left \langle \vec{A}, \vec{B} \right \rangle A ⋅B ​A ​ ​B ​cos⟨A ,B ⟩ 对应几何意义&#xff1a;向量 A ⃗…

STL-常用容器

string容器 string构造函数 string本质&#xff1a;类 string和char*区别&#xff1a; char* 是一个指针 string是一个类&#xff0c;类内部封装了char*&#xff0c;管理这个字符串&#xff0c;是一个char*型的容器。 特点&#xff1a; string类内部封装了很多成员方法 …

Android 12,调用系统库libft2.so 遇到的各种问题记录

问题前提,Android 12系统,vendor静态库中调用 libft2.so。(vendor静态库中调用libft2.so会简单点,没这么麻烦) 【问题1】 (native:vendor) can not link against libft2 (native:platform) 本地debug尝试修改: 为了本地环境debug调试方便,我找了个 mk文件,在里面添加了…

Centos安装显卡

1、安装基础环境 yum -y install epel-release yum -y install gcc kernel-devel kernel-headers 2.对应内核版本 yum info kernel-devel kernel-headers Cat /proc/version 3、yum安装版本不对应。则去官网手动下载 离线安装对应的rpm&#xff1a; https://pkgs.org/dow…

RPC框架学习

一、设计目标 RPC 框架的目标就是让远程服务调用更加简单、透明&#xff0c;RPC 框架负责屏蔽底层的传输方式&#xff08;TCP 或者 UDP&#xff09;、序列化方式&#xff08;XML/Json/ 二进制&#xff09;和通信细节。服务调用者可以像调用本地接口一样调用远程的服务提供者&a…

eCharts实现漏斗图

需求&#xff1a;像漏斗那样进行层层筛选&#xff0c;进行一个可直接看见过程的图表 效果&#xff1a; 代码&#xff1a; option { //标题title: {text: Funnel,left: left,top: bottom}, //刷新加下载toolbox: {orient: vertical,top: center,feature: {restore: {},saveA…

Spring Cloud版本选择

SpringCloud版本号由来 SpringCloud的版本号是根据英国伦敦地铁站的名字进行命名的&#xff0c;由地铁站名称字母A-Z依次类推表示发布迭代版本。 SpringCloud和SpringBoot版本对应关系 注意事项&#xff1a; 其实SpringBoot与SpringCloud需要版本对应&#xff0c;否则可能会造…

资料分析笔记

统计术语 现期&#xff1a;现在的时间 基期&#xff1a;之前的时间 现期量 基期量 增长量&#xff08;有正负&#xff09; 增长率 【增幅、增速、r】&#xff08;有正负&#xff09; 同比&#xff1a;例&#xff1a;2014年5月 和 2013年5月 环比&#xff1a;例&#xff1a;20…

《算法竞赛·快冲300题》每日一题:“矩阵”

《算法竞赛快冲300题》将于2024年出版&#xff0c;是《算法竞赛》的辅助练习册。 所有题目放在自建的OJ New Online Judge。 用C/C、Java、Python三种语言给出代码&#xff0c;以中低档题为主&#xff0c;适合入门、进阶。 文章目录 题目描述题解C代码Java代码Python代码 “ 质…

YOLOv5如何训练自己的数据集

文章目录 前言1、数据标注说明2、定义自己模型文件3、训练模型4、参考文献 前言 本文主要介绍如何利用YOLOv5训练自己的数据集 1、数据标注说明 以生活垃圾数据集为例子 生活垃圾数据集&#xff08;YOLO版&#xff09;点击这里直接下载本文生活垃圾数据集 生活垃圾数据集组成&…