
IWR6843ISK捕获并分析原始ADC数据
IWR6843ISK捕获并分析原始ADC数据
·
我这里使用的设备为 IWR6843ISK+DCA1000EVM+mmWave Studio
参考资料:采用不同型号雷达有不同格式的数据规定,以官方提供的文档为准
原始数据介绍
- 原始数据格式介绍:
对于iwr6843isk和dca1000EVM设备,原始数据通过两个 LVDS lanes被捕获,Lanes1 存储两个采样点实部,Lanes2 存储两个采样点虚部,以non-interleaved的形式,储存在二进制文件中
- non-interleaved的形式,我的理解是,对于每一个chirp,会按照先存储RX0对于该chirp的所有采样点数,再存储RX1的所有采样点数,直到 RX channel都存储完毕,再去存储下一个chirp
- 由于只能使用两个LVDS lanes,因此iwr6843无法使用 3个RXchannel进行数据捕获,只能使用1,2,4个RXchannel捕获数据
- 数据容量:
计算公式:Total Size in Bytes = Num ADC Samples × Num RX Channels × Num Frames × Num Chirps × Num Bytes Per Sample
对于复数的输出形式, Num Bytes Per Sample的值为4,2bytes存储实部,2bytes存储虚部
例如:
我这里采集的原始数据大小为4915200bytes
参数配置为:
参数名 | Value |
---|---|
ADC Samples | 100 |
RX Channels | 4 |
Frames | 8 |
Chirps | 128 |
Bytes Per Sample | 4 |
这里我启用了3个TX,分别发射3种chirp构成TDM-MIMO,故对于每一个RX接收到的chirp数应该是3*128
关于TDM-MIMO的详细信息可参考我的另一篇文章
计算可得 100*4*8*128*3*4 = 4915200 bytes 与实际相符
参考代码
matlab读取数据参考代码
%%% This script is used to read the binary file produced by the DCA1000 and Mmwave Studio
%%% Command to run in Matlab GUI -
readDCA1000('<ADC capture bin file>') function [retVal] = readDCA1000(fileName)
%% global variables
% change based on sensor config
numADCSamples = 256; % number of ADC samples per chirp
numADCBits = 16; % number of ADC bits per sample
numRX = 4; % number of receivers
numLanes = 2; % do not change. number of lanes is always 2
isReal = 0; % set to 1 if real only data, 0 if complex data0
%% read file
% read .bin file
fid = fopen(fileName,'r');
adcData = fread(fid, 'int16');
% if 12 or 14 bits ADC per sample compensate for sign extension
if numADCBits ~= 16
l_max = 2^(numADCBits-1)-1;
adcData(adcData > l_max) = adcData(adcData > l_max) - 2^numADCBits;
end
fclose(fid);
fileSize = size(adcData, 1);
% real data reshape, filesize = numADCSamples*numChirps
if isReal
numChirps = fileSize/numADCSamples/numRX;
LVDS = zeros(1, fileSize);
%create column for each chirp
LVDS = reshape(adcData, numADCSamples*numRX, numChirps);
%each row is data from one chirp
LVDS = LVDS.';
else
% for complex data
% filesize = 2 * numADCSamples*numChirps
numChirps = fileSize/2/numADCSamples/numRX;
LVDS = zeros(1, fileSize/2);
%combine real and imaginary part into complex data
%read in file: 2I is followed by 2Q
counter = 1;
for i=1:4:fileSize-1
LVDS(1,counter) = adcData(i) + sqrt(-1)*adcData(i+2);
LVDS(1,counter+1) = adcData(i+1)+sqrt(-1)*adcData(i+3);
counter = counter + 2;
end
% create column for each chirp
LVDS = reshape(LVDS, numADCSamples*numRX, numChirps);
%each row is data from one chirp
LVDS = LVDS.';
end
%organize data per RX
adcData = zeros(numRX,numChirps*numADCSamples);
for row = 1:numRX
for i = 1: numChirps
adcData(row, (i-1)*numADCSamples+1:i*numADCSamples) = LVDS(i, (row-1)*numADCSamples+1:row*numADCSamples);
end
end
% return receiver data
retVal = adcData;
python读取数据参考代码
这里我采用了openrader的开源库实现,代码更为简洁
参考资料:OpenRadar
import numpy as np
from mmwave.dataloader import DCA1000
# 雷达参数配置
# numStartFreq = 60
# numRampEndTime = 48.57
# numIdleTime = 7
numFrames = 100
numADCSamples = 119
# numSampleRate = 3000
# numFreqSlope = 74.98
numTxAntennas = 3
numRxAntennas = 4
numLoopsPerFrame = 88
numChirpsPerFrame = numTxAntennas * numLoopsPerFrame
# numRangeBins = numADCSamples
# numDopplerBins = numLoopsPerFrame
# numAngleBins = 64
# 原始数据路径
bin_path = 'D:\\Workspace_lab\\adc_data.bin'
adc_data = np.fromfile(bin_path, dtype=np.uint16)
adc_data = adc_data.reshape(numFrames, -1)
adc_data = np.apply_along_axis(DCA1000.organize, 1, adc_data, num_chirps=numChirpsPerFrame,
num_rx=numRxAntennas, num_samples=numADCSamples)
# 转换结果:(Frame, Chirp, numRx, ADCsample) 四维numpy数组
print(adc_data.shape)
更多推荐
所有评论(0)