好久不见,甚是想念
此篇博将对AWR2243的数据包进行解析,关于数据采集部分请参考关于AWR2243数据采集问题这篇。
关于数据解析,推荐首先阅读TI官网上的毫米波雷达设备 ADC 原始数据捕获 。我的设备是AWR2243+DCA1000,数据解析方式文档未明确给出,我两种都试了一下,发现按照xWR12xx and xWR14xx方式解析正确,即上述文档第7页给出的方式,工作需要,我只进行了一维快速傅里叶变换,得到距离和接收功率。
下面是Matlab解析Bin文件代码。
%% 参数设置
FrequencySlope=30e12; %调频斜率
SampleRate=10e6; %采样率
%% 文件路径名称
fname='D:\adc_data.bin';
%% 选择文件读取数据包
fid=fopen(fname,'rb');%打开文件
data=fread(fid,256*128*4*1*2,'int16');
data1=reshape(data,8,[]);%将数据按照存储格式分成八路
adcdata = data1(1:4,:)+1i*data1(5:8,:); %将cdata中的实部与虚部相加,使用一根接收天线只有第一行有数据,其余行是零
fclose(fid);
RX0= reshape(adcdata(1,:),256,128);%该行是选择一根接收天线的所有数据%% 距离FFTrange_win = hanning(256); %加汉宁窗,窗长256range_profile = [];for m=1:128temp=RX0(:,m).*range_win; %加窗函数temp_fft=fft(temp,256);%对每个chirp做N点FFTrange_profile(:,m)=temp_fft;end%% 一维FFT后,距离与接收功率图figure(1); range_profile_Temp = range_profile';X=(0:255)*SampleRate*3e8/256/2/FrequencySlope;%距离公式Y=20*log10(abs(range_profile_Temp));%接收功率公式plot(X,Y); xlabel('距离(m)');ylabel('信号幅值');title('一维FFT处理三维视图');
下面将对代码部分进行详细解析
%% 参数设置
FrequencySlope=30e12; %调频斜率
SampleRate=10e6; %采样率
首先上面的调频斜率和采样率是根据你的采集设置输入的,samples和chirps数量也是,具体数值请参考你自己设置数值,位置如下图所示
%% 文件路径名称
fname='D:\adc_data.bin';
%% 选择文件读取数据包
fid=fopen(fname,'rb');%打开文件
data=fread(fid,256*128*4*1*2,'int16');
data1=reshape(data,8,[]);%将数据按照存储格式分成八路
adcdata = data1(1:4,:)+1i*data1(5:8,:); %将cdata中的实部与虚部相加,使用一根接收天线只有第一行有数据,其余行是零
fclose(fid);
选择你的文件和所在路径,目前读取的是一帧数据,如果想要读取多帧数据,你可以尝试着写一个for循环,我设置的是256个samples和128个chirps,我采用的是一根发射天线一根接收天线做的测试,根据数据存储格式将一帧数据分8路(IQ双通道,4个接收天线通道,一共8路),我的只有第1路(实部)和第5 路(虚部)有数据,然后进行序虚部实部相加,最后我们得到RX0。
分成8路后data1数据如下图所示
虚部实部相加后,变成4路,第一路是一根接收天线的所有数据,其余三路数据为0,adcdata数据如下图所示
将第一路数据放入一个256行乘以128列的RX0数组里,然后进行一维FFT变换,FFT之后,纵坐标对应的是距离信息,横坐标对应的是接收功率信息。
RX0= reshape(adcdata(1,:),256,128);%该行是选择一根接收天线的所有数据%% 距离FFTrange_win = hanning(256); %加汉宁窗,窗长256range_profile = [];for m=1:128temp=RX0(:,m).*range_win; %加窗函数temp_fft=fft(temp,256);%对每个chirp做N点FFTrange_profile(:,m)=temp_fft;end
我将数组进行了转置,现在横坐标对应距离信息,纵坐标对应接收功率信息,然后画图。
figure(1); range_profile_Temp = range_profile';X=(0:255)*SampleRate*3e8/256/2/FrequencySlope;%距离公式Y=20*log10(abs(range_profile_Temp));%接收功率公式plot(X,Y); xlabel('距离(m)');ylabel('信号幅值');title('一维FFT处理三维视图');
运行结果如下,我测的是约5M处的目标物。
如果你要进行二维三维FFT,在这里非常推荐 “唱跳c++篮球”这位博主写的回波3DFFT处理(测距、测速、测角),这位博主写的很详细,可以参考和学习。