【自动驾驶|毫米波雷达】逻辑化讲解测角全流程

第一次更新:2024/5/7

目录

一. 引入

基础概念

二. 测角原理

1. 接收天线不同位置

2. 角度几何关系

3. 角度正负规定

4. 角度测量

5. 最大不模糊角

三. 角度分辨率

1. 相位变化量

2. 角度表示

3. 角度变化量

三. 测角算法

1. 三维快速傅里叶变换 (3D-FFT:Three-Dimensional Fast Fourier Transform)

1) 原理

2) matlab代码

2.  波束形成技术(DBF:Digital Beam Forming)

1)原理

2)波束形成算法(matlab代码)

3. 多元信号分类算法(MUSIC:Multiple Signal Classification)

1)原理

2)MUSIC算法(matlab代码)


一. 引入

毫米波雷达测角测得是哪个角呢?

传统的毫米波雷达角度测量是特指水平面方位角的测量,即目标物体相对于雷达“正方向”的偏离角度(正方向也就是垂直于雷达天线板的法线方向),如下图:

基础概念

  • 到达角(AOA:Angle of Arrival): 指接收机中的天线阵列或单个天线接收到雷达信号时,根据信号相位差或时间差计算出来的信号到达方向。
  • 雷达的视场(FOV:Field of View): 顾名思义为雷达的“视野范围”,可以理解为AOA的值域。如图所示为前向毫米波雷达以及角雷达的FOV。

二. 测角原理

毫米波雷达方位角的测量主要依赖于接收天线(RX),角度测量的基本原理即通过回波信号在接收天线的距离差d来估计相位差∆∅

1. 接收天线不同位置

假设电磁波的发出与接收天线为同一根

假设电磁波的发射与接收天线不同,则在接收天线处的相位差为:

其中,f_0为初始发波频率,Δd为相邻接收天线的距离差,Δτ为时间差,λ为波长。

2. 角度几何关系

根据距离差Δd与角度θ的几何关系:

3. 角度正负规定

4. 角度测量

可以进行障碍物的角度估计,得到测角公式:

由测角公式可得:相位差是关于角度的非线性函数

  • 当角度θ越接近0°时,角度估算精度越高;
  • 当角度θ越接近90°时,角度估算精度越低。

5. 最大不模糊角

当角度范围超过180°时,会造成测量角度不准确,即有“最大不模糊角”:

\theta <|\pi|

故此时最大到达角(AOA: Angle of Arrival)为:

从理论角度来看,最大视场角(FOV:Field of View)为:

三. 角度分辨率

角度分辨率(θres )是两个物体在角度 FFT 中可显示为两个谱峰时的最小角度间隔

1. 相位变化量

2. 角度表示

又因为:

所以:

3. 角度变化量

三. 测角算法

最常见的角度测量方式为:3D-FFT(三维快速傅里叶变换)DBF(数字波束形成技术)以及MUSIC算法。其中,3D-FFT(三维快速傅里叶变换)和DBF(数字波束形成技术)做DOA估计是最简单且运算复杂度最低的方法,但是这两方法并不能实现超分辨,其角分辨率受限于阵列的孔径,MUSIC算法是实现超分辨的一种算法。

超分辨:据已知图像信息恢复图像细节和其他数据信息的过程,简单来说就是增大图像的分辨率,防止其图像质量下降。(也就是让图像更加清晰的能力)

1. 三维快速傅里叶变换 (3D-FFT:Three-Dimensional Fast Fourier Transform)

1) 原理

三维FFT原理图

在进行完慢时间维FFT和快时间维FFT后,在2D-FFT峰值相对应的相位序列进行FFT,图中雷达对两个目标进行探测。FFT的点数为天线的阵列数N,FFT后得到两个目标对应的相位变化量\omega _1,\omega_2

根据角度估算公式:

\omega_1=\frac{2\pi dsin\theta_1}{\lambda }

即可得到障碍物的角度为:

\theta_1=sin^{-1}\frac{\lambda \omega_1}{2\pi d}

2) 3D-FFT(matlab代码)

% generate signal and array response
fs = 100e3;   % sample rate
f0 = 20e3;    % signal frequency
t = 0:1/fs:0.1;    % time vector
s = sin(2*pi*f0*t); % signal
d = 0.02; % element spacing
N = 8; % number of elements
theta = 10; % target angle
c = 343; % speed of sound
lambda = c/f0; % wavelength
k = 2*pi/lambda; % wavenumber
d_array = d*(0:N-1); % array element positions
phi_array = exp(-1i*k*d_array*cosd(theta)); % array response
x = s*phi_array; % received signal
X = fftshift(fft2(x)); % 2D FFT
[m, n] = size(X); % size of FFT matrix
theta_x = asind((-m/2:m/2-1)/(m/2)*sin(pi/2)); % angle axis
theta_y = asind((-n/2:n/2-1)/(n/2)*sin(pi/2)); % angle axis
[X_max, I] = max(abs(X(:))); % find max value in FFT matrix
[I_row, I_col] = ind2sub([m n],I); % find row and column index
theta_x(I_row) % estimate angle in x direction
theta_y(I_col) % estimate angle in y direction

2.  波束形成技术(DBF:Digital Beam Forming)

1)原理

DBF本质是构造视场范围内的各个角度的导向矢量,并用这些导向矢量分别去和阵列的回波信号相乘以得到各个角度下的能量值,我们通过寻找其中的极大值(目标所处方向的回波与导向矢量相干叠加,这些方向的能量会得到增强,而噪声是非相干的,能量得到增强的方向,对应极大值的位置,也即信号的方向)来得到实际回波的方向而达到测角的目的。

信号模型:

假设在平面上均匀排布着M-1个阵列(也就是天线)

设窄带发射信号为:s(t),则阵列接收到的信号x(t)为:

定义导向矢量为:

故:

x(n)=a(θ)s(t)

导向矢量是阵列天线的所有阵元对具有单位能量窄带信源的响应。由于阵列响应在不同方向上是不同的,导向矢量与信源的方向是相互关联的,这种关联的独特性依赖于阵列的几何结构。对于同一阵元阵列,导向矢量的每一个元素具有单位幅度。

总输出为:

y(t)=\sum_{n=1}^{M}a_n(\theta)s(t)

令导矢向量中的角度θ在[0,π]中遍历,使得总输出y(t)的模值最小,此时满足条件的角度即波束形成技术所求得的DOA估计角度。

2)波束形成算法(matlab代码)

数字波束合成可以等效的理解为让发射波束按照指定方向来发射电磁波

实际操作过程中的数字波束是通过回波信号FFT之后的峰值点在通过一个阵列流来改变波束的指向来实现的

波束形成技术中常用两种算法:

  • LCMV算法:在有用信号形式以及信号方向完全已知的情况下,在某种约束条件下,使得阵列的输出的方差最小。

LCMV仿真图:

  • LMS算法:采用迭代模式,为每个步骤迭代n时刻的权向量加上一个校正值后,即可组成m+1时刻的权向量,用它逼近最优权向量。

LMS仿真图:

% 生成一个6个天线的阵列
N = 6;
theta = linspace(-pi/2, pi/2, 181);
d = 0.5;
array = phased.ULA(N, d);
 
% 生成两个目标
pos = [-20 5; 10 -10];
fc = 3e8/77e9;
lambda = fc/2;
c = 3e8;
t = (0:0.1e-6:1000e-6)';
s1 = cos(2*pi*fc*t + 2*pi*pos(1,1)*sin(pos(1,2)*pi/180)/c);
s2 = cos(2*pi*fc*t + 2*pi*pos(2,1)*sin(pos(2,2)*pi/180)/c);
s = s1 + s2;
 
% 接收到的信号
rx = array(s, [0;5;10;15;20;25]*1e-3);
 
% DBF估计到达角
angdbf = phased.PhaseShiftBeamformer('SensorArray', array, 'OperatingFrequency', fc, ...
    'Direction', [-90:90], 'PropagationSpeed', c);
[y,doasdbf] = angdbf(rx);
doasdbf = unwrap(doasdbf)*180/pi;
disp(doasdbf);
 
 
 
 
 
 
 
% define parameters
fs = 100e3; % sample rate
f0 = 20e3; % signal frequency
t = 0:1/fs:0.1; % time vector
s = sin(2pif0t); % signal
d = 0.02; % element spacing
N = 8; % number of elements
theta = 10; % target angle
c = 343; % speed of sound
lambda = c/f0; % wavelength
k = 2pi/lambda; % wavenumber
d_array = d*(0:N-1); % array element positions
phi_array = exp(-1ikd_arraycosd(theta)); % array response
x = sphi_array; % received signal
 
% DBF processing
theta_range = -90:1:90; % angle range
w = ones(1,N); % weighting coefficients
P = zeros(size(theta_range)); % power spectrum
for i = 1:length(theta_range)
phi = exp(-1ikd_array'sind(theta_range(i))); % steering vector
y = wx.phi; % beamformed signal
P(i) = abs(sum(y))^2/(Nsum(abs(y).^2)); % power spectrum
end
 
% find peak angle
[P_max, I] = max(P);
theta_est = theta_range(I);
 
% plot results
figure;
plot(theta_range, P);
hold on;
plot(theta_est, P_max, 'r*');
xlabel('Angle (degree)');
ylabel('Power spectrum');
title('DBF');
legend('Power spectrum', 'Estimated angle');

3. 多元信号分类算法(MUSIC:Multiple Signal Classification)

 MUSIC(Multiple Signal Classification),多重信号分类,是一类空间谱估计算法。其思想是利用接收数据的协方差矩阵进行特征分解,分离出信号子空间和噪声子空间,利用信号导矢向量与噪声子空间的正交性来构成空间扫描谱,进行全域搜索谱峰,从而实现信号的参数估计。

1)原理

假设N元等距线阵,阵元间距为d,信号的波长为λ,空间中有r个信源,那么接收到的观测信号可表示为:

X(t)=\sum_{i=1}^{r}s_i(t)A(\theta_i)+N(t)

其中s_i为第i个信号,\theta_i为第i个信号的入射角度,A(\theta_i)为导矢向量,N(t)为高斯白噪声。

协方差矩阵为:

R=E[XX^T]=AR_SA^T+R_n

将一组完备的正交基分为信号子空间和噪声子空间:

U_S=span[q_1,q_2,...,q_r]

U_n=span[q(r+1),...,q_N]

又因为:

Rq_n=\sigma ^2Iq_n,n=r+1,...,N

代入R=ASA^T+\sigma ^2I得:

A\cdot R_sA^Tq_n=0

即表明信号来波方向的相位矢量A噪声特征值对应 的特征向量正交

定义一个噪声矩阵:

E_n=[q_{r+1},...,q_N]

根据上式可以得到:

A^H(\theta_i)E_n*E_n^TA(\theta_i)=0

构造空间谱

P_{music}=\frac{1}{A^H(\theta_i)P_NA(\theta_i)}

其中P_n=E_n*E_n^T, \theta_i遍历空间搜索角度,当搜索到角度θ的时候,此时P_{music}有一尖峰,对应角度即障碍物角度。

2)MUSIC算法(matlab代码)

MUSIC仿真图:

代码:

% 生成一个6个天线的阵列
N = 6;
theta = linspace(-pi/2, pi/2, 181);
d = 0.5;
array = phased.ULA(N, d);
 
% 生成两个目标
pos = [-20 5; 10 -10];
fc = 3e8/77e9;
lambda = fc/2;
c = 3e8;
t = (0:0.1e-6:1000e-6)';
s1 = cos(2*pi*fc*t + 2*pi*pos(1,1)*sin(pos(1,2)*pi/180)/c);
s2 = cos(2*pi*fc*t + 2*pi*pos(2,1)*sin(pos(2,2)*pi/180)/c);
s = s1 + s2;
 
% 接收到的信号
rx = array(s, [0;5;10;15;20;25]*1e-3);
 
% MUSIC估计到达角
angmusic = phased.MUSIC('SensorArray', array, 'OperatingFrequency', fc, 'NumSignals', 2, 'ScanAngles', theta);
[Pmusic,doasmusic] = step(angmusic, rx);
doasmusic = unwrap(doasmusic)*180/pi;
disp(doasmusic);
 
 
 
 
 
 
% generate signal and array response
fs = 100e3; % sample rate
f0 = 20e3; % signal frequency
t = 0:1/fs:0.1; % time vector
s = sin(2*pi*f0*t); % signal
d = 0.02; % element spacing
N = 8; % number of elements
theta = [10, 20]; % target angles
c = 343; % speed of sound
lambda = c/f0; % wavelength
k = 2*pi/lambda; % wavenumber
d_array = d*(0:N-1); % array element positions
phi_array = exp(-1i*k*d_array'*cosd(theta)); % array response
x = s*phi_array; % received signal
 
% MUSIC processing
theta_range = -90:1:90; % angle range
U = svd(x); % singular values of received signal
n = length(U); % number of eigenvalues
P = zeros(size(theta_range)); % power spectrum
for i = 1:length(theta_range)
    phi = exp(-1i*k*d_array'*cosd(theta_range(i))); % steering vector
    En = eye(n)-U*U'; % noise subspace projection matrix
    P(i) = 1/abs(phi'*En*En'*phi); % power spectrum
end
 
% find peak angles
[P_max, I] = sort(P, 'descend');
theta_est = theta_range(I(1:2));
 
% plot results
figure;
plot(theta_range, P);
hold on;
plot(theta_est, P_max(1:2), 'r*');
xlabel('Angle (degree)');
ylabel('Power spectrum');
title('MUSIC');
legend('Power spectrum', 'Estimated angles');

参考:

详细介绍雷达到达角估计算法3DFFT,DBF,MUSIC,Capon的原理、对比、各自的优势_雷达dbf技术-CSDN博客

《深入浅出通信原理》陈爱军

《阵列信号处理及MATLAB实现》张小飞 

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

maven远程仓库访问顺序

首先需要了解一下各个配置文件&#xff0c;主要分为三类&#xff1a; 全局配置文件(${maven.home}/conf/settings.xml)&#xff0c;maven安装路径下的/conf/settings.xml用户配置文件(%USER_HOME%/.m2/settings.xml)&#xff0c;windows用户文件夹下项目配置文件&#xff1a;p…

汽车EDI:安通林Antolin EDI 项目案例

安通林&#xff08;Antolin&#xff09;是一家全球性的汽车零部件制造商&#xff0c;专注于汽车内饰系统和零部件的生产&#xff0c;致力于创新和采用先进的技术。近年来 安通林Antolin 推动其供应商部署EDI系统&#xff0c;使得双方能够通过EDI传输业务单据&#xff0c;极大提…

制造业如何选择合适的项目管理软件?(内含软件推荐)

近期&#xff0c;收到很多小伙伴的提问&#xff1a;“想了解制造行业如何选择到合适的项目管理软件&#xff1f;”在竞争激烈的市场环境中&#xff0c;有效的项目管理对于制造业的发展至关重要&#xff0c;而项目管理软件则是重要支撑&#xff0c;能帮助企业更好地规划和跟踪项…

OpenAI推动人工智能商业化:萨姆·奥尔特曼的《星门计划》

Sam Altman最近在斯坦福大学做了一次采访&#xff0c;这实际上是迄今为止最具洞察力的采访之一&#xff0c;我将深入探讨他说的几件事&#xff0c;并解释为什么它们实际上是如此具有洞察力&#xff0c;因为这确实是一次非凡的采访&#xff0c;所以&#xff0c;不再浪费时间&…

CSS 网格布局一行X个排列

<div class"icon-box"><divv-for"(item,index) in icon" :key"index" class"icon"style"cursor: pointer">{{item}}</div></div>.icon-box{display: grid; /**网格布局*/grid-template-columns: r…

烽火三十六技丨网络资产安全治理平台新版本发布,一文看懂四大核心优势

云计算、移动互联网、物联网等技术飞速发展&#xff0c;网络环境愈发开放互联&#xff0c;原有的资产管理方式已难以适应当下的变化。同时&#xff0c;网络资产需求的突发性和人为疏忽&#xff0c;也时常导致资产数量不明、类型模糊、安全漏洞检查不全面等问题。因此&#xff0…

鸿蒙ArkUI:【编程范式:命令式->声明式】

命令式 简单讲就是需要开发用代码一步一步进行布局&#xff0c;这个过程需要开发全程参与。 开发前请熟悉鸿蒙开发指导文档&#xff1a;gitee.com/li-shizhen-skin/harmony-os/blob/master/README.md点击或者复制转到。 Objective-C ObjectiveC 复制代码 UIView *cardView …

SNMPv3-原理浅谈+报文示例+简易配置

个人认为&#xff0c;理解报文就理解了协议。通过报文中的字段可以理解协议在交互过程中相关传递的信息&#xff0c;更加便于理解协议。 因此本文将在 SNMPv3 协议报文的基础上进行介绍。 SNMPv3 相关 RFC 文档。 关于 SNMPv3 的基本内容介绍&#xff0c;可参考RFC3410-Intro…

SQL分库分表

一、介绍 问题分析 随着互联网及移动互联网的发展&#xff0c;应用系统的数据量也是成指数式增长&#xff0c;若采用单数据库进行数据存储&#xff0c;存在以下性能瓶颈: 1. IO瓶颈:热点数据太多&#xff0c;数据库缓存不足&#xff0c;产生大量磁盘IO&#xff0c;效率较低。…

CLIP 浅析

CLIP 浅析 文章目录 CLIP 浅析概述如何训练CLIP如何使用Clip进行图像分类优缺点分析优点缺点 概述 CLIP的英文全称是Contrastive Language-Image Pre-training&#xff0c;即一种基于对比文本-图像对的预训练方法或者模型。 如何训练CLIP CLIP包括两个模型&#xff1a;Text …

平滑 3d 坐标

3d平滑 import torch import torch.nn.functional as F import numpy as np import matplotlib.pyplot as plt from mpl_toolkits.mplot3d import Axes3Dclass SmoothOperator:def smooth(self, vertices):# 使用一维平均池化进行平滑vertices_smooth F.avg_pool1d(vertices.p…

第五十八节 Java设计模式 - 适配器模式

Java设计模式 - 适配器模式 我们在现实生活中使用适配器很多。例如&#xff0c;我们使用存储卡适配器连接存储卡和计算机&#xff0c;因为计算机仅支持一种类型的存储卡&#xff0c;并且我们的卡与计算机不兼容。 适配器是两个不兼容实体之间的转换器。适配器模式是一种结构模…

镜像制作过程

镜像制作过程 Centos镜像制作 虚拟机系统安装将网卡转换为eth0在install安装时按tab健加入一下配置 net.ifnames=0 biosdevname=0

CRF++ 中文NER

CLUENER数据准备 data [] with open("data/train.json", r) as f:for line in f.readlines():data.append(eval(line)) data特征提取 import jieba import jieba.posseg as psegdef process(text, labelsNone):words [i for i in text]words_flags pseg.cut(tex…

2024数维杯数学建模C题思路代码

2024年数维杯&电工杯思路代码在线文档​https://www.kdocs.cn/l/cdlol5FlRAdE 这道题想要做出好的结果&#xff0c;必须要结合插值法和分布函数来做&#xff0c;主要还是因为勘探点太少&#xff0c;直接用插值法效果不太好&#xff0c;以下是我做的&#xff0c;函数分布可…

图片识别公式神器推荐_mathpix

你是否遇到在某个资料上看到一个很复杂的公式&#xff0c;但有懒得再 word 或者其他文件上打出来。 比如这个&#xff1a; 如果直接截图的话&#xff0c;只能说非常丑陋。 推荐一个网站 mathpix&#xff0c;点击 try for free&#xff0c;注册登录。 Mathpix: AI-powered doc…

计数问题C++

题目&#xff1a; 思路&#xff1a; 1~n之间进行循环遍历&#xff0c;如果i不等于0继续循环&#xff0c;然后求出i的个位数与十位数&#xff0c;如果个位数为要查找的特定数字&#xff0c;计时器就1. 代码&#xff1a; #include<iostream> using namespace std; int n,x…

Django简介

Django 1.安装Django pip install djangopython的包的分布 \python- python.exe- Scripts- pip.exe- django-admin.exe [工具&#xff0c;创建django项目]- Lib- 内置模块- site-packages [安装的包]- pymysql- flask- django [框架的源码]2.创建项目 Django项目会有…

应用层协议之 DNS 协议

DNS 就是一个域名解析系统。域名就是网址&#xff0c;类似于 www.baidu.com。网络上的服务器想要访问它&#xff0c;就得需要它对应的 IP 地址&#xff0c;同时&#xff0c;每个域名对对应着一个 / N个 IP 地址&#xff08;即对应多台服务器&#xff09;。 因此&#xff0c;为了…

SpringCloud:服务拆分和远程调用

程序员老茶 &#x1f648;作者简介&#xff1a;练习时长两年半的Java up主 &#x1f649;个人主页&#xff1a;程序员老茶 &#x1f64a; P   S : 点赞是免费的&#xff0c;却可以让写博客的作者开心好久好久&#x1f60e; &#x1f4da;系列专栏&#xff1a;Java全栈&#…