保山市建设厅官方网站,北京优化生育,中堂做网站,wordpress 缓存Bartlett / CBF原理看这里 Capon原理看这里
这里只讲怎么调用openradar提供的aoa_bartlett和aoa_capon函数#xff1a; 一些吐槽#xff1a;虽然看起来openradar的作者代码水平很高#xff0c;但里面有很多匪夷所思的写法#xff0c;比如他demo里的解析文件格式就很迷啊等…Bartlett / CBF原理看这里 Capon原理看这里
这里只讲怎么调用openradar提供的aoa_bartlett和aoa_capon函数 一些吐槽虽然看起来openradar的作者代码水平很高但里面有很多匪夷所思的写法比如他demo里的解析文件格式就很迷啊等等…
先获取矢量矩阵 (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。
Bartlett/CBF:
radar_cube shape : (128, 8, 128) - (chirp, vx, adc_samples)
ra np.zeros((ANGLE_BINS, BINS_PROCESSED), dtypenp.complex128)
# 只取前BIN_PROCESSED个range-bin处理
ra dsp.aoa_bartlett(steering_vec, radar_cube[:, :, :BINS_PROCESSED], axis1)
ra ra.sum(0) # 对所有chirp的得到的角度信息求和
plt.title(bartlet sum all chirps)
plt.imshow(np.abs(ra))下面我尝试跟着Bartlett的原理自己写了一个函数实测效果一致。 只取了第一个chirp没像上面那样求和实测这两种方法差不多对所有chirp得到的角度信息求和上面那种的话效果会好一点点点点点。 radar_cube2 shape : (8, 128) - (vx, adc_samples)
ra np.zeros((ANGLE_BINS, BINS_PROCESSED), dtypenp.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) Capon
radar_cube shape : (128, 8, 256) - (chirps, vx, adc_samples)
range_azimuth np.zeros((ANGLE_BINS, BINS_PROCESSED), dtypenp.complex128)
for i in range(BINS_PROCESSED):range_azimuth[:, i], beamWeights[:,i] dsp.aoa_capon(radar_cube[:, :, i].T, steering_vec, magnitudeFalse)
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个chirp8根虚拟天线的数据anyway如果一帧里只有小于虚拟天线个数的chirp数的话把这段判断删了或注释掉就行。
下面的视频是我对这Bartlett/CBF和Capon和Angle-FFT在openradar的circle.bin这个数据上的效果对比