本文編輯:調(diào)皮哥的小助理
1.引言
如果文章能夠給你帶來價(jià)值,希望能夠關(guān)注我。
如果文章能夠讓你學(xué)習(xí)到知識(shí),希望你能夠點(diǎn)個(gè)贊!
好了下面開始今天的學(xué)習(xí)內(nèi)容吧。
今天給大家分享的是 《TI 的IWR1642毫米波雷達(dá)使用串口原始數(shù)據(jù)采集與分析》。通常TI的系列雷達(dá)如IWR1642、IWR6843采集長(zhǎng)時(shí)間的數(shù)據(jù)都是需要使用DCA1000的,不過我們用于學(xué)習(xí)毫米波雷達(dá)傳感器的基礎(chǔ)知識(shí),其實(shí)可以不需要使用DCA1000,使用串口就可以采集到一幀的數(shù)據(jù)了。
2.內(nèi)存資源估計(jì)
因?yàn)榇诓杉臄?shù)據(jù)首先是存儲(chǔ)在IWR1642的內(nèi)存里的,經(jīng)過我對(duì)內(nèi)存的資源估計(jì),發(fā)現(xiàn)最多也就只能存儲(chǔ)一幀的數(shù)據(jù)。
IWR1642雷達(dá)數(shù)據(jù)內(nèi)存(Radar Data Memory)大概是768KB,也就是DSP核內(nèi)部存儲(chǔ)塊L3資源總大小為768KB,主要是用來存儲(chǔ)雷達(dá)數(shù)據(jù)。
進(jìn)入工程里面去看,L3的起始地址是0x200A0000,長(zhǎng)度是0x000A0000,存儲(chǔ)位寬是32位。
(1)可存儲(chǔ)的數(shù)據(jù)大小計(jì)算
AD的采樣率是2.5M,數(shù)據(jù)位寬是16bit,一共四個(gè)接收天線,四個(gè)AD通道。
因此一秒鐘的數(shù)據(jù)大小是2.516/84=20M。
一個(gè)chirp的時(shí)間約為180us,因此一個(gè)chirp所占用的內(nèi)存為20MB*180us=3.6KB。
而一個(gè)CPI原本為128個(gè)占用大小為128*3.6KB=460KB。因此,理論上L3內(nèi)存只能夠存一個(gè)CPI的數(shù)據(jù)。
(上述結(jié)論為自己計(jì)算的,如果計(jì)算出錯(cuò),請(qǐng)指正?。?/p>
其實(shí)一幀的數(shù)據(jù),雖然不可以實(shí)時(shí)地長(zhǎng)時(shí)間采集,但是也足夠用來做毫米波雷達(dá)的學(xué)習(xí)或者實(shí)驗(yàn)教學(xué)了。基本上可學(xué)習(xí)到、測(cè)距、測(cè)速、測(cè)角、CFAR以及聚類,而且串口采集數(shù)據(jù)比較簡(jiǎn)單,可謂是“一鍵操作”,方便又快捷。
3.基本操作
(1)使用Uniflash固化編譯好的xwr16xx_mmw_demo.bin文件;
(2)上電,打開MATLAB程序,修改好串口號(hào),點(diǎn)擊運(yùn)行,即可開始一幀數(shù)據(jù)的采集了。
(3)采集完成之后,輸出的是2D-FFT的結(jié)果。
4.數(shù)據(jù)格式說明
發(fā)射天線:2個(gè);
接收天線:4個(gè);
一幀數(shù)據(jù)的脈沖數(shù):128個(gè)(兩個(gè)脈沖交替各發(fā)射128次)
ADC采樣點(diǎn)數(shù):128個(gè)
ADC位數(shù):16bit(兩個(gè)字節(jié)組成一個(gè)十進(jìn)制數(shù))
采樣形式:IQ正交采樣(兩個(gè)十進(jìn)制數(shù)組成一個(gè)復(fù)數(shù),I+jQ);
ADC采樣率為:2.5Msps。
故而,串口收到的字節(jié)數(shù)為:241281282*2=524288(個(gè))。
收到的十進(jìn)制數(shù)的個(gè)數(shù)為:字節(jié)數(shù)/2 =524288/2 = 262144(個(gè))。
收到的復(fù)信號(hào)數(shù)據(jù)個(gè)數(shù)為:10進(jìn)制數(shù)的個(gè)數(shù)/2 =262144/2 = 131027(個(gè))。
正好也符合復(fù)信號(hào)個(gè)數(shù)為:1281282*4= 131072(個(gè)),即表示兩個(gè)發(fā)射天線,四個(gè)接收天線,一共128個(gè)交替脈沖,每個(gè)脈沖一共128個(gè)采樣點(diǎn)。
需要注意的是:
當(dāng)采用虛擬天線模式時(shí),復(fù)信號(hào)的個(gè)數(shù)為:1281288= 131072(個(gè)),表示一發(fā)8收,只有8個(gè)接收通道的數(shù)據(jù)。
當(dāng)沒有采用虛擬天線模式時(shí),復(fù)信號(hào)的個(gè)數(shù)為:2561284= 131072(個(gè)),表示2發(fā)4收,只有4個(gè)接收通道,而256表示有256個(gè)脈沖。
因?yàn)闆]有使用虛擬天線,兩個(gè)發(fā)射天線的信號(hào)都被4個(gè)接收天線接收,自然脈沖數(shù)會(huì)增多2倍。通常我們?yōu)榱耸褂肨DM-MIMO的角度分辨率,采用的是虛擬天線模式增大角度分辨率。所以數(shù)據(jù)格式記住是128個(gè)脈沖,每個(gè)脈沖128個(gè)采樣點(diǎn),一共8個(gè)接收通道。
(1) 經(jīng)過一系列解析,得到信號(hào)的實(shí)部和虛部時(shí)域圖,如下:
其中,可以看出,信號(hào)的前面一半是TX1(第一個(gè)發(fā)射天線)的128個(gè)脈沖在四個(gè)接收通道上的數(shù)據(jù),一共為1281284= 65536。同理,后一半是TX2的數(shù)據(jù)。
把上面的實(shí)部信號(hào)放大了看,只看前5個(gè)脈沖,紅框的部分就是第一個(gè)發(fā)射天線(TX1)下,RX1、RX2、RX3、RX4的接受數(shù)據(jù),每個(gè)RX一共128個(gè)點(diǎn),如下圖所示:
搞清楚前面這些數(shù)據(jù)的關(guān)系與排列形式,那么接下來對(duì)信號(hào)進(jìn)行處理那就非常簡(jiǎn)單了。
5.代碼分析
(1)雷達(dá)參數(shù)設(shè)置與坐標(biāo)計(jì)算
雷達(dá)參數(shù)根據(jù).cfg文件配置,其中.cfg文件由自己配置。
%% 時(shí)間2021年10月
%% 作者:調(diào)皮連續(xù)波
%% 未經(jīng)許可、禁止轉(zhuǎn)載!
clc;
close all;
clear all;
delete(instrfind);
%%
controlSerialPort = ‘COM43’; %預(yù)先設(shè)定USER COM
dataSerialPort = ‘COM44’; %預(yù)先設(shè)定DATA COM
%% 雷達(dá)參數(shù)
Tx_Number = 2; %發(fā)射天線
Rx_Number = 4; %接收天線
Range_Number = 128; %距離點(diǎn)數(shù)(每個(gè)脈沖256個(gè)點(diǎn))
Doppler_Number = 128; %多普勒通道數(shù)(總共16個(gè)重復(fù)脈沖數(shù))
global Params;
Params.NChirp = Doppler_Number; %1幀數(shù)據(jù)的chirp個(gè)數(shù)
Params.NChan = Rx_Number; %RxAn數(shù),ADC通道數(shù)
Params.NSample = Range_Number; %每個(gè)chirp ADC采樣數(shù)
Params.Fs = 2.5e6; %采樣頻率
Params.c = 3.0e8; %光速
Params.startFreq = 77e9; %起始頻率
Params.freqSlope = 60e12; %chirp的斜率
Params.bandwidth = 3.072e9; %真實(shí)帶寬
Params.lambda=Params.c/Params.startFreq; %雷達(dá)信號(hào)波長(zhǎng)
Params.Tc = 144e-6; %chirp周期
global FFT2_mag;
%% 坐標(biāo)計(jì)算
[X,Y] = meshgrid(Params.c*(0:Params.NSample-1)*Params.Fs/2/Params.freqSlope/Params.NSample, …
(-Params.NChirp/2:Params.NChirp/2 - 1)*Params.lambda/Params.Tc/Params.NChirp/2);
%%
(2)雷達(dá)配置命令下發(fā)與數(shù)據(jù)接收
%%
loadCfg = 1; % 下發(fā)命令標(biāo)志
configurationFileName_stop =‘iwr1642.cfg’; % 雷達(dá)停止命令
cliCfg = readCfg(configurationFileName_stop); % 配置文件讀取
if(loadCfg)
hdataSerialPort = configureDataSport(dataSerialPort,Tx_NumberRx_NumberDoppler_NumberRange_Number22);%鏈接 COM串口
mmwDemoCliPrompt = char(‘mmwDemo:/>’);
hControlSerialPort = configureControlPort(controlSerialPort);%鏈接 COM串口
%Send CLI configuration to IWR16xx
fprintf(‘Sending configuration from %s file to IWR16xx …\n’, configurationFileName_stop);
for k=1:length(cliCfg)
fprintf(hControlSerialPort, cliCfg{k});
fprintf(‘%s\n’, cliCfg{k});
echo = fgetl(hControlSerialPort); % Get an echo of a command
done = fgetl(hControlSerialPort); % Get “Done”
prompt = fread(hControlSerialPort, size(mmwDemoCliPrompt,2)); % Get the prompt back
end
prompt_1= fread(hdataSerialPort, Tx_NumberRx_NumberDoppler_NumberRange_Number22); % Get the prompt back
%% 可在此保存數(shù)據(jù)
adc_data = dec2hex(prompt_1,2);
end
fclose(hControlSerialPort);
delete(hControlSerialPort);
fclose(hdataSerialPort);
delete(hdataSerialPort);
(3) 數(shù)據(jù)讀取、拆分、組合
% 讀取數(shù)據(jù)
% Data_hex=textread(‘data_2.txt’,‘%s’)';%讀出采集的數(shù)據(jù)
Data_dec=hex2dec(adc_data); %將16進(jìn)制轉(zhuǎn)換為10進(jìn)制
% 組合數(shù)據(jù)
Data_zuhe=zeros(1,Tx_NumberRx_NumberDoppler_NumberRange_Number2); %建立計(jì)算存儲(chǔ)數(shù)據(jù)的空矩陣
for i=1:1:Tx_NumberRx_NumberDoppler_NumberRange_Number2
Data_zuhe(i) = Data_dec((i-1)*2+1)+Data_dec((i-1)2+2)256;%兩個(gè)字節(jié)組成一個(gè)數(shù),第二個(gè)字節(jié)乘以256相當(dāng)于左移8位。
if(Data_zuhe(i)>32767)
Data_zuhe(i) = Data_zuhe(i) - 65536; %限制幅度
end
end
%% 分放數(shù)據(jù)
ADC_Data=zeros(Tx_Number,Doppler_Number,Rx_Number,Range_Number2); %建立計(jì)算存儲(chǔ)數(shù)據(jù)的空矩陣
for t=1:1:Tx_Number
for i=1:1:Doppler_Number
for j=1:1:Rx_Number
for k=1:1:Range_Number2 %實(shí)部虛部
ADC_Data(t,i,j,k) = Data_zuhe(1,(((t-1)*Doppler_Number+(i-1))*Rx_Number+(j-1))Range_Number2+k);%時(shí)域數(shù)據(jù)排列順序?yàn)?TX1 TX2
end
end
end
end
(4)時(shí)域圖
%% 打印全部的實(shí)虛數(shù)據(jù)
Re_Data_All=zeros(1,Range_NumberDoppler_NumberTx_NumberRx_Number); %建立計(jì)算存儲(chǔ)數(shù)據(jù)的空矩陣
Im_Data_All=zeros(1,Range_NumberDoppler_NumberTx_NumberRx_Number); %建立計(jì)算存儲(chǔ)數(shù)據(jù)的空矩陣
% 虛部實(shí)部分解
for i=1:1:Tx_NumberRx_NumberDoppler_NumberRange_Number2
Im_Data_All(1,i) = Data_zuhe(1,(i-1)2+1);
Re_Data_All(1,i) = Data_zuhe(1,(i-1)2+2);
end
% 原始信號(hào)實(shí)部、虛部圖形繪制
figure()
subplot(2,1,1);
plot(Im_Data_All(1,:));title(‘實(shí)部波形’);grid on;
subplot(2,1,2);
plot(Re_Data_All(1,:),‘r’);title(‘虛部波形’);grid on;
%% 打印分組后的實(shí)虛數(shù)據(jù) 數(shù)據(jù)結(jié)構(gòu)為:2T4R在TX2組的16個(gè)脈沖數(shù)據(jù)
Re_Data=zeros(Doppler_Number,Range_Number); %建立計(jì)算存儲(chǔ)數(shù)據(jù)的空矩陣
Im_Data=zeros(Doppler_Number,Range_Number); %建立計(jì)算存儲(chǔ)數(shù)據(jù)的空矩陣
for chirp=1:Doppler_Number %查看所在chirp的數(shù)據(jù)
% figure();
for j=1:1:Tx_Number
for k=1:1:Rx_Number
for i=1:1:Range_Number
Re_Data(chirp,i) = ADC_Data(j,chirp,k,(i-1)2+2);
Im_Data(chirp,i) = ADC_Data(j,chirp,k,(i-1)2+1);
end
% subplot(Tx_Number,Rx_Number,(j-1)Rx_Number+k);
% plot(Im_Data(1,:));title([num2str(j) ‘T’ num2str(k) ‘R虛部波形’]);grid on;
end
end
end
%% 虛部+實(shí)部數(shù)據(jù)重組得到復(fù)信號(hào) 25642162
ReIm_Data = complex(Re_Data,Im_Data); %這里只用虛擬天線的最后一組數(shù)據(jù)。原本數(shù)據(jù)大小應(yīng)該是162568=32768,現(xiàn)在只有16256*1=4096。
% Im_Data1=reshape(Im_Data,1,[]);
% figure();
% plot(Im_Data1);
(5)輸出1D-FFT結(jié)果
%% 1D FFT
fft1d= zeros(Doppler_Number,Range_Number);
for chirp_fft=1:Doppler_Number
fft1d(chirp_fft,:) = fft((ReIm_Data(chirp_fft,:)));
end
FFT1_mag=abs(fft1d);
figure();
mesh(FFT1_mag);
xlabel(‘采樣點(diǎn)數(shù)’);ylabel(‘脈沖數(shù)’);zlabel(‘幅度’);
title(‘距離維FFT結(jié)果’);
(6)輸出2D-FFT結(jié)果
%% 2D FFT
fft2d= zeros(Doppler_Number,Range_Number);
for chirp_fft=1:Range_Number
fft2d(:,chirp_fft) =fftshift( fft((fft1d(:,chirp_fft))));
end
FFT2_mag=(abs(fft2d));
figure();
mesh(X,Y,FFT2_mag);
xlabel(‘距離維’);ylabel(‘速度維’);zlabel(‘幅度’);
title(‘速度維FFT結(jié)果’);
(7)額外的函數(shù)
主要是串口鏈接函數(shù)和配置參數(shù)解析函數(shù)。
function [sphandle] = configureDataSport(comPortString, bufferSize)
% comPortString = [‘COM’ num2str(comPortNum)];
sphandle = serial(comPortString,‘BaudRate’,921600);
% set(sphandle,‘Timeout’,15);
set(sphandle,‘Terminator’, ‘’);
set(sphandle,‘InputBufferSize’, bufferSize);
set(sphandle,‘Timeout’,10);
set(sphandle,‘ErrorFcn’,@dispError);
fopen(sphandle);
end
function [sphandle] = configureControlPort(comPortString)
%if ~isempty(instrfind(‘Type’,‘serial’))
% disp(‘Serial port(s) already open. Re-initializing…’);
% delete(instrfind(‘Type’,‘serial’)); % delete open serial ports.
%end
%comPortString = [‘COM’ num2str(comPortNum)];
sphandle = serial(comPortString,‘BaudRate’,115200);
set(sphandle,‘Parity’,‘none’)
set(sphandle,‘Terminator’,‘LF’)
fopen(sphandle);
end
function config = readCfg(filename) %讀取配置文件
config = cell(1,100);
fid = fopen(filename, ‘r’);
if fid == -1
fprintf(‘File %s not found!\n’, filename);
return;
else
fprintf(‘Opening configuration file %s …\n’, filename);
end
tline = fgetl(fid);
k=1;
while ischar(tline)
config{k} = tline;
tline = fgetl(fid);
k = k + 1;
end
config = config(1:k-1);
fclose(fid);
end
待續(xù)。。。。未完!敬請(qǐng)保持關(guān)注!文章來源:http://www.zghlxwxcb.cn/news/detail-406769.html
代碼下載鏈接:代碼下載文章來源地址http://www.zghlxwxcb.cn/news/detail-406769.html
到了這里,關(guān)于TI IWR1642毫米波雷達(dá)使用串口原始數(shù)據(jù)采集與分析的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!