本例程介绍一个参考TI 2944文档的DDMA波形的设计。2944芯片是一款4T4R的芯片,可以四个天线同时发射电磁波,提高了发射功率,因此相比于TDMA能够探测更远的距离,适合与汽车雷达应用。但是四根天线同时发射波形同时也带来的问题是需要在接收端解调出每个天线的波形,采用了DDMA(多普勒维多址),TI文档中给出的DDMA原理是:
2944采用的是4T4R的4个发射通道,在施加了人为的相位偏移之后,导致了最大不模糊距离降低,因此需要解速度模糊,因此增加了2个空band,这这里我们介绍发射波形的设置:
TI 文档介绍的4个发射通道的相位偏转如上图所示。具体的原理可以参考TI 的AWR 2944的文档。里面讲的比较详细。
这里我们直接根据文档设计DDMA的波形。并设计两个目标,目标的参数分别是距离、速度、方位角和俯仰角四个参数。波形的其他参数我们参考TI 原有的参数。
%% ---------------------------------------------------------------------------------------
c = physconst('LightSpeed'); % 设置光速
fc = 76.42e9; % 频率77G 载频
numADC = 384; % ADC采样点数 时域 adc samples
numChirps =768; % 每个frame的chirp个数
numCPI = 1; % 一个frame
rampEndTime = 18.81e-6; %采样时间
idleTime = 5e-6; %空闲时间
T = rampEndTime+ idleTime; % pulse repetition interval (PRI)
F = 30e6; % 采样频率 ,最大频率
dt = 1/F; % 采样间隔 :时间间隔
slope = 8.883e12; % 斜率
lambda = c/fc; %波长
N = numChirps*numADC*numCPI; % ADC一共的 采样个数 点数
t = linspace(0,T*numChirps*numCPI,N); % frame的时间轴
t_onePulse = 0:dt:dt*numADC-dt; % 一个chirp的时间轴
numTX = 4; % 发射天线
numRX = 4; % 接收天线
d_rx = lambda/2; % 接收天线之间的间隔
d_tx = lambda/2; % 发射天线之间的间隔
%% ------------------目标设置,一共是两个目标------------------------------------------
target_1 = [100 20 -15 6]; %距离-速度-方位角-俯仰角
r1_y = target_1(1)*cosd(target_1(4))*cosd(target_1(3)); %目标1的y坐标
r1_x = target_1(1)*cosd(target_1(4))*sind(target_1(3)); %目标1的x坐标
r1_z = target_1(1)*sind(target_1(4));
v1_y = target_1(2)*cosd(target_1(4))*cosd(target_1(3)); %目标1速度Y分量
v1_x = target_1(2)*cosd(target_1(4))*sind(target_1(3)); %目标1速度X分量
v1_z = target_1(2)*sind(target_1(4)); %目标1速度X分量
r1 = [r1_x r1_y r1_z]; %目标1的坐标值
target_2 = [40 10 10 -10]; %距离-速度-方位角-俯仰角
r2_y = target_2(1)*cosd(target_2(4))*cosd(target_2(3)); %目标2的y坐标
r2_x = target_2(1)*cosd(target_2(4))*sind(target_2(3)); %目标2的x坐标
r2_z = target_2(1)*sind(target_2(4)); %目标2的z坐标
v2_y = target_2(2)*cosd(target_2(4))*cosd(target_2(3)); %目标2速度Y分量
v2_x = target_2(2)*cosd(target_2(4))*sind(target_2(3)); %目标2速度X分量
v2_z = target_2(2)*sind(target_2(4));
r2 = [r2_x r2_y r2_z];
%% ---------------------- 计算发射天线的坐标值 ------------
figure(1)
tx_loc = cell(1,numTX); %构建一个1行numTX列的cell数据
tx_loc{1} = [0, 0, 0]; %发射天线的坐标,第一个是0 0 0
tx_loc{2} = [2*d_tx, 0, 1.6*d_tx]; %发射天线的坐标,第一个是0 0 0
tx_loc{3} = [4*d_tx, 0, 0]; %发射天线的坐标,第一个是0 0 0
tx_loc{4} = [8*d_tx, 0, 0]; %发射天线的坐标,第一个是0 0 0
for ii=1:numTX
scatter3(tx_loc{ii}(1),tx_loc{ii}(2),tx_loc{ii}(3),'r','filled')
hold on
end
rx_loc = cell(1,numRX); %numRX
rx_loc{1} = [-5.5*d_rx, 0, 0];
rx_loc{2} = [-5*d_rx, 0, 0];
rx_loc{3} = [-4.5*d_rx, 0, 0];
rx_loc{4} = [-4*d_rx, 0, 0];
for i = 1:numRX
scatter3(rx_loc{i}(1),rx_loc{i}(2),rx_loc{i}(3),'b','filled')
end
title('MIMO天线虚拟阵列图')
xlabel('x坐标/m');
ylabel('y坐标/m')
text(tx_loc{1}(1),tx_loc{1}(2),tx_loc{1}(3),'发射天线1')
%% 计算目标在雷达信号发射期间内的移动距离,转换为坐标
tar1_loc = zeros(length(t),3); % 目标1的位置预定义
tar2_loc = zeros(length(t),3); % 目标2的位置预定义
tar1_loc(:,1) = r1(1) + v1_x*t; % 第一列定义为x坐标,意思是在雷达发射脉冲768 chirp全部时间内,目标在X方向移动的距离值
tar1_loc(:,2) = r1(2) + v1_y*t; % 目标位置坐标
tar1_loc(:,3) = r1(3) + v1_z*t;
tar2_loc(:,1) = r2(1) + v2_x*t;
tar2_loc(:,2) = r2(2) + v2_y*t;
tar2_loc(:,3) = r2(3) + v2_z*t;
%% 计算目标在移动中,信号从发射到每个接收天线之间的时间 路程/光速=时间
delays_tar1 = cell(numTX,numRX); %目标1的在运动时间,信号从发射到接收走过的时间
delays_tar2 = cell(numTX,numRX);
for i = 1:numTX
for j = 1:numRX
delays_tar1{i,j} = (vecnorm(tar1_loc-repmat(rx_loc{j},N,1),2,2)+vecnorm(tar1_loc-repmat(tx_loc{i},N,1),2,2))/c; %范数重复数组副本
delays_tar2{i,j} = (vecnorm(tar2_loc-repmat(rx_loc{j},N,1),2,2)+vecnorm(tar2_loc-repmat(tx_loc{i},N,1),2,2))/c; %计算延迟时间
end
end
%% 信号设置
phase1 = @(tx,fx) 2*pi*(fx.*tx+slope/2*tx.^2); % 发射信号时域表示形式
phase2 = @(tx,fx,k) 2*pi*(fx.*tx+slope/2*tx.^2)+2*pi/6*(k-1); % 发射信号时域表示形式
phase3 = @(tx,fx,k) 2*pi*(fx.*tx+slope/2*tx.^2)+4*pi/6*(k-1) ; % 发射信号时域表示形式
phase4 = @(tx,fx,k) 2*pi*(fx.*tx+slope/2*tx.^2)+6*pi/6*(k-1); % 发射信号时域表示形式
mixed = cell(1,numRX);
for j = 1:numRX
% for ii = 1:numTX
% disp(['Processing Channel: ' num2str(j) '/' num2str(numRX)]);
for k = 1:numChirps*numCPI
phase_t1 = phase1(t_onePulse,fc); %设置发射信号波形 ,一个chirp信号
phase_t2 = phase2(t_onePulse,fc,k) ;
phase_t3 = phase3(t_onePulse,fc,k);
phase_t4 = phase4(t_onePulse,fc,k);
phase_1 = phase1(t_onePulse-(delays_tar1{1,j}((k-1)*numADC+1:k*numADC))',fc); %T1-T numRX
phase_2 = phase2(t_onePulse-(delays_tar1{2,j}((k-1)*numADC+1:k*numADC))',fc,1);
phase_3 = phase3(t_onePulse-(delays_tar1{3,j}((k-1)*numADC+1:k*numADC))',fc,1);
phase_4 = phase4(t_onePulse-(delays_tar1{4,j}((k-1)*numADC+1:k*numADC))',fc,1) ;
phase_21 = phase1(t_onePulse-(delays_tar2{1,j}((k-1)*numADC+1:k*numADC))',fc); % 计算每个接收天线对应第二个目标的回波信号
phase_22 = phase2(t_onePulse-(delays_tar2{2,j}((k-1)*numADC+1:k*numADC))',fc,1);
phase_23 = phase3(t_onePulse-(delays_tar2{3,j}((k-1)*numADC+1:k*numADC))',fc,1);
phase_24 = phase4(t_onePulse-(delays_tar2{4,j}((k-1)*numADC+1:k*numADC))',fc,1);
% signal_t((k-1)*numADC+1:k*numADC) = exp(1i*phase_t1);
signal_1((k-1)*numADC+1:k*numADC) = exp(1i*(phase_t1 - phase_1))+exp(1i*(phase_t2 - phase_2)) +exp(1i*(phase_t3 - phase_3)) +exp(1i*(phase_t4 - phase_4));
signal_2((k-1)*numADC+1:k*numADC) = exp(1i*(phase_t1 - phase_21))+exp(1i*(phase_t2 - phase_22))+exp(1i*(phase_t3 - phase_23))+exp(1i*(phase_t4 - phase_24));
end
mixed{1,j} = awgn(signal_1 + signal_2,5,'measured'); %接收到的信号
mixed{1,j} = reshape(mixed{1,j},[384,768]);
end
signal_1=[];
for ik = 1:numRX
signal_1 = cat(3,signal_1,mixed{1,ik});
end
AdcData = permute(signal_1,[3 1 2]);
figure(2);
mesh(squeeze(abs(AdcData(1,:,:))));
%% 1D-FFT
FFT_1D = fft(AdcData , [],2); %加窗后fft计算, frameAdcData:4*384*768
FFT_1D = FFT_1D(:,1:192,:); % 取一半 4*192*768
%% 2D-FFT
FFT_2D= fft(FFT_1D, [],3); %加窗后fft,注意把dopplerWin转换为了1*1*768,才能加窗 = 4*192*768
FFT_2D(:,1,:)=0; % 消除直流分量
FFT_2Dsum_acrossRx = 20*log10(squeeze(sum(abs(FFT_2D),1))); %每一列数据是4个天线幅值累加,=192*768
fft2d=fftshift(fft(FFT_1D,[],3),3);
vector_v=(-384:383)*0.106;
vector_r=(1:192)* 1.3;% 取一半
figure(3)
mesh(vector_v,vector_r,db(squeeze(abs(fft2d(1,:,:)))));
xlabel('doppler');ylabel('距离向');grid on;title('2dfft');
%% 程序结束,本程序最终到2D-FFT结果,后面的计算过程可以根据自己的需求继续,例如距离维度的CFAR、角度FFT和速度维度的CFAR等过程以及点云输出。