OpenRadar DOA函数 Bartlett/CBF和Capon使用

Bartlett / CBF原理看这里
Capon原理看这里

这里只讲怎么调用openradar提供的aoa_bartlett和aoa_capon函数:
一些吐槽:虽然看起来openradar的作者代码水平很高,但里面有很多匪夷所思的写法,比如他demo里的解析文件格式就很迷啊等等…

1. 波束成形 或者 Angle-FFT 之前要先做 Range-FFT

先对adc_sample维度做距离FFT,一般是最后一个维度,得到相位信息。

2. 获取矢量矩阵 (steering vector):

比如果你想得到[-90°,90°],分辨率为1°(就有181个角度点),8根虚拟天线的矢量矩阵,那么就会生成一个shape为[181, 8]的ndarray (也就是下面那行代码的steering_vec)。num_vec得到的是一共有多少角度(上面那个例子的话就是181),没啥用,可以不管。

num_vec, steering_vec = dsp.gen_steering_vec(ANGLE_RANGE, ANGLE_RES, VIRT_ANT)

By the way, dsp.gen_steering_vec里面用了np.complex, 高版本的numpy可能不支持,报错说和python自带的complex有歧义,把np去掉,变成complex即可。

ANGLE_RANGE 是在一侧,你要得到多少角度信息,那么一共就有 2 * ANGLE_RANGE + 1个角度信息,+1是因为0°。
ANGLE_RES 是你需要的角度分辨率
VIRT_ANT 是虚拟天线数
以下举例

ANGLE_RANGE = 90
ANGLE_RES = 1
VIRT_ANT = 8
BINS_PROCESSED = 112

意思想得到的角度为[-90°, 90°],因为有0,所以有2*ANGLE_RANGE + 1 = 181个角度格子,想要的角度分辨率为1°,处理前112个range-bin。

3.1 Bartlett/CBF:

可以看到源码aoa_bartlett这边已经帮我们对range-angle图取模并且平方放大了。
在这里插入图片描述

下面这段是我使用openradar提供的aoa_bartlett API
radar_cube shape : (128, 8, 128) - (chirp, vx, adc_samples)

ra = np.zeros((ANGLE_BINS, BINS_PROCESSED), dtype=np.complex128)
# 只取前BIN_PROCESSED个range-bin处理
ra = dsp.aoa_bartlett(steering_vec, radar_cube[:, :, :BINS_PROCESSED], axis=1) 
ra = ra.sum(0) # 对所有chirp的得到的角度信息求和
plt.title('bartlet sum all chirps')
plt.imshow(ra) # !!! 源码里面帮我们对复数取模并且平方放大了,就不用我们自己做啦。下面那段复现代码是自己取模放大

下面这段是我尝试跟着Bartlett的原理自己写了一个函数,实测效果一致。
只取了第一个chirp,没像上面那样求和,实测这两种方法差不多,对所有chirp得到的角度信息求和(上面那种)的话效果会好一点点点点点。
radar_cube2 shape : (8, 128) - (vx, adc_samples)

ra = np.zeros((ANGLE_BINS, BINS_PROCESSED), dtype=np.complex128)
steering_vec = np.conjugate(steering_vec) # 要取共轭!
for i in range(BINS_PROCESSED): # 遍历每一个range-bin,得到每个range-bin上的角度信息
    tmp = steering_vec @ radar_cube2[:, i]
    ra[:, i] = tmp
plt.title('CBF conjugate')
# openradar bartlett源码就是把得到的每个角度的复数取模然后再平方,这样写是对的,我对比过用dsp.aoa_bartlett的range-angle图,效果一样
plt.imshow(np.abs(ra) ** 2)  # 仿照源码 取模 平方放大信号

3.2 Capon

radar_cube shape : (128, 8, 256) - (chirps, vx, adc_samples)

range_azimuth = np.zeros((ANGLE_BINS, BINS_PROCESSED), dtype=np.complex128)
for i in range(BINS_PROCESSED):
    range_azimuth[:, i], beamWeights[:,i] = dsp.aoa_capon(radar_cube[:, :, i].T, steering_vec, magnitude=False)
plt.title('256 chirps Capon')
plt.imshow(np.abs(range_azimuth))

此外,如果你的chirp小于8,比如1个frame里只有1个chirp,那么就要把openradar的dsp.angle_estimation.cov_matrix里的这个判断删了:

if x.shape[0] > x.shape[1]:
   warnings.warn("cov_matrix input should have Vrx as rows. Needs to be transposed", RuntimeWarning)
   x = x.T

大概意思就是他觉得你输错了,还帮你改正了,但实际上你没输错,他帮了倒忙,就是要处理一帧里面,1个chirp,8根虚拟天线的数据,anyway,如果一帧里只有小于虚拟天线个数的chirp数的话,把这段判断删了或注释掉就行。

下面的视频是我对这Bartlett/CBF和Capon和Angle-FFT在openradar的circle.bin这个数据上的效果对比:
视频链接

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: 基于Bartlett算法和Capon算法的DOA(Direction of Arrival)估计是指通过对接收到的信号进行处理,确定信号来自的方向。 Bartlett算法是一种传统的DOA估计方法,它利用阵列天线接收到的信号进行相关运算,并计算信号在不同方向上的功率谱密度。根据功率谱密度的特点,可以确定最大功率谱密度值对应的方向,即信号的到达方向。 Capon算法是一种高精度的DOA估计方法。它通过对接收信号进行波束形成,构造一个空间谱函数,然后通过最小方差准则来实现DOA估计。Capon算法考虑了信号间的互相干扰,并用一个空间谱函数来描述信号的特性,从而提高了DOA估计的准确性。 基于Bartlett算法和Capon算法的DOA估计都要求在阵列中有多个天线,以获取多个信号的相位差,进而进行信号方向的估计。这两种算法都可以应用于无线通信、无线定位等领域,用于确定信号源的位置和方向。 总的来说,Bartlett算法是一种简单直观的DOA估计方法,适用于信号强度较高的情况;而Capon算法是一种更精确的DOA估计方法,适用于信号强度较弱或信号间互相干扰较大的情况。根据具体的应用场景和需求,可以选择合适的算法来进行DOA估计。 ### 回答2: 基于Bartlett算法和Capon算法的DOA(方向到达)估计是指利用这两种算法来确定信号源的方向。DOA估计是无线通信、雷达、声学和阵列信号处理等领域中的重要问题。 Bartlett算法是一种基于谱估计的DOA估计方法。它通过测量信号在不同传感器上的到达时间差异,计算信号在不同方向上的功率谱。然后,对功率谱进行平均,得到DOA估计结果。Bartlett算法简单易实现,但对信号源数目的估计容易受到误差干扰。 Capon算法则是一种基于最小方差准则的DOA估计方法。它将多个传感器的接收信号线性组合,构建协方差矩阵,并求解该矩阵的逆矩阵。通过将接收信号的功率谱和协方差矩阵相乘,得到源信号的功率谱。然后,Capon算法通过最小化源信号功率谱的倒数,找到最小方差的解,进而得出DOA估计结果。Capon算法能够有效克服Bartlett算法的误差干扰问题,提供更准确的DOA估计。 综上所述,基于Bartlett算法和Capon算法的DOA估计方法各有优势。Bartlett算法简单易实现,适用于实时应用。而Capon算法准确性更高,适用于复杂环境下的DOA估计。在实际使用中,可以根据具体需求选择适合的算法。 ### 回答3: 基于Bartlett算法和Capon算法的DOA(Direction of Arrival)估计是两种常用的信号处理方法,用于确定信号源的方向。 Bartlett算法是基于波束形成(beamforming)的一种DOA估计方法。首先,通过阵列天线接收到来自信号源的信号。然后,利用波束形成算法,对接收到的信号进行加权、相位调整和相加,形成一个虚拟波束。最后,通过扫描虚拟波束的角度,得到最大能量方向,即信号源的方向。 Capon算法是一种高分辨率的DOA估计方法。它利用了信号的统计特性,通过最小方差准则来确定信号源的方向。首先,构建协方差矩阵,用于描述信号的统计特性。然后,通过求解该协方差矩阵的逆矩阵,得到权值向量。最后,利用权值向量计算信号源的方向。 对比两种算法,Bartlett算法较为简单,适用于信号源数量较少、噪声较小的情况。而Capon算法在信号源数量较多、噪声较大的情况下具有更好的性能,能够提供更高的分辨率。 总之,基于Bartlett算法和Capon算法的DOA估计方法可以应用于信号处理中,用于确定信号源的方向。选择合适的算法取决于具体情况,如信号源数量和噪声水平等。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值