網(wǎng)站數(shù)據(jù)分析工具有哪些網(wǎng)站推廣seo是什么
Bartlett / CBF原理看這里
Capon原理看這里
這里只講怎么調(diào)用openradar提供的aoa_bartlett和aoa_capon函數(shù):
一些吐槽:雖然看起來openradar的作者代碼水平很高,但里面有很多匪夷所思的寫法,比如他demo里的解析文件格式就很迷啊等等…
先獲取矢量矩陣 (steering vector):
比如果你想得到[-90°,90°],分辨率為1°(就有181個(gè)角度點(diǎn)),8根虛擬天線的矢量矩陣,那么就會(huì)生成一個(gè)shape為[181, 8]的ndarray (也就是下面那行代碼的steering_vec)。num_vec得到的是一共有多少角度(上面那個(gè)例子的話就是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可能不支持,報(bào)錯(cuò)說和python自帶的complex有歧義,把np去掉,變成complex即可。
ANGLE_RANGE 是在一側(cè),你要得到多少角度信息,那么一共就有 2 * ANGLE_RANGE + 1個(gè)角度信息,+1是因?yàn)?°。
ANGLE_RES 是你需要的角度分辨率
VIRT_ANT 是虛擬天線數(shù)
以下舉例
ANGLE_RANGE = 90
ANGLE_RES = 1
VIRT_ANT = 8
BINS_PROCESSED = 112
意思想得到的角度為[-90°, 90°],因?yàn)橛?,所以有2*ANGLE_RANGE + 1 = 181
個(gè)角度格子,想要的角度分辨率為1°,處理前112個(gè)range-bin。
Bartlett/CBF:
radar_cube shape : (128, 8, 128) - (chirp, vx, adc_samples)
ra = np.zeros((ANGLE_BINS, BINS_PROCESSED), dtype=np.complex128)
# 只取前BIN_PROCESSED個(gè)range-bin處理
ra = dsp.aoa_bartlett(steering_vec, radar_cube[:, :, :BINS_PROCESSED], axis=1)
ra = ra.sum(0) # 對(duì)所有chirp的得到的角度信息求和
plt.title('bartlet sum all chirps')
plt.imshow(np.abs(ra))
下面我嘗試跟著Bartlett的原理自己寫了一個(gè)函數(shù),實(shí)測(cè)效果一致。
只取了第一個(gè)chirp,沒像上面那樣求和,實(shí)測(cè)這兩種方法差不多,對(duì)所有chirp得到的角度信息求和(上面那種)的話效果會(huì)好一點(diǎn)點(diǎn)點(diǎn)點(diǎn)點(diǎn)。
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): # 遍歷每一個(gè)range-bin,得到每個(gè)range-bin上的角度信息tmp = steering_vec @ radar_cube2[:, i]ra[:, i] = tmp
plt.title('CBF conjugate')
# openradar bartlett源碼就是把得到的每個(gè)角度的復(fù)數(shù)取模然后再平方,這樣寫是對(duì)的,我對(duì)比過用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), 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個(gè)frame里只有1個(gè)chirp,那么就要把openradar的dsp.angle_estimation.cov_matrix
里的這個(gè)判斷刪了:
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
大概意思就是他覺得你輸錯(cuò)了,還幫你改正了,但實(shí)際上你沒輸錯(cuò),他幫了倒忙,就是要處理一幀里面,1個(gè)chirp,8根虛擬天線的數(shù)據(jù),anyway,如果一幀里只有小于虛擬天線個(gè)數(shù)的chirp數(shù)的話,把這段判斷刪了或注釋掉就行。
下面的視頻是我對(duì)這Bartlett/CBF和Capon和Angle-FFT在openradar的circle.bin這個(gè)數(shù)據(jù)上的效果對(duì)比: