由于TDMA-MIMO采用不同单天线交替发射信号,没有更好的利用发射天线同时工作的发射资源,导致发射功率低以及损耗大,从而使得TDMA波形只能应用在近距离探测的低功率雷达场景。而DDMA波形则能很好的弥补TDMA上述缺点,与TDMA波形下单天线交替工作不同,DDMA波形下所有发射天线同时发射,但是每个发射天线的信号都加入一个特定的频率偏移(在速度维度体现为一个速度频移),通过这个人为偏移的频率使得不同发射天线的信号在Doppler域上分离出来。使不同发射天线的信号在Doppler域上能分离开来。此外,由于DDMA相比于TDMA来说拥有更高的发射功率,因此DDMA波形也将成为往后车载毫米波雷达MIMO雷达的主流波形。有关于DDMA更多细节请参考DDMA原理,这里不在累赘。
有关于信号建模我在雷达仿真:FMCW TDMA-MIMO 3D点云获取方法已经介绍得非常详细,只需要做如下修改就可。我们基于TDMA信号模型做以下修改即可获得DDMA波形:
1) DDMA是Ntx个发射天线同时发射,因此我们需要在接收端分别叠加每个发射天线产生的回波信号。
2)为了区别不同发射天线发射的信号,每个发射天线施加一个固定的频率频移
![]()
上式子中,N通常由发射天线决定,但后续采用Empty Band解调通常满足下式:

式中Nt为发射天线数。在本案例中设置为4 Tx 4 Rx,其中发射天线的分布情况为线性排列,相邻发射天线距离为2λ,通过DDMA解调后,可以等价为1Tx16Rx虚拟阵列。由于固定的频率偏移在中频信号中没法体现出来,为了更直观的体现不同发射天线之间的固定频率频移,将这个频率偏移换算成固定的速度频移为:
![]()
其中
为发射脉冲间隔(chirp间隔)。因此DDMA信号模型建模代码如下:
- for frameid = 1 : numframe
- for txid = 1 : numtx
- for rxid = 1 : numrx
- for chirpid = 1 : numchirp
- for targetid = 1 : numtarget
- for sampleid = 1 : numsamples
- R = target(targetid,1) + ((chirpid-1)*T)*(target(targetid,2) + (txid - 1)*lambda/2/Emptyband/T) + (frameid-1)*numchirp*T*(target(targetid,2)+ (txid - 1)*lambda/2/Emptyband/T); %计算目标随速度变化的距离,以忽略快时间对距离的影响
- delay = 2 * R / parameter.c;
- fixphase = exp(1j*2*pi*(f0*delay-0.5*slope*delay^2)); %中频信号的固定相位,末尾的相位为剩余视频相位,为了更真实还原毫米波雷达数据,本程中没有将其省略
- fastsampdata(sampleid) = exp(1j*2*pi*slope*delay*t(sampleid)) * fixphase; %这里采用随机起伏
- end
- azimuthphase = exp(1j*(2*pi/lambda)*sind(target(targetid,3)) * ( (rxid -1) * Detarx + (txid - 1) * Detatx) ); %目标方位角信息
- temprawdata(:,chirpid,(txid-1)*numrx + rxid,frameid) = temprawdata(:,chirpid,(txid-1)*numrx + rxid,frameid) + fastsampdata.* azimuthphase;
- end
- end
- %加入高斯噪声
- MixIQ = temprawdata(:,:,(txid-1)*numrx + rxid,frameid);
- xigema = std(MixIQ)/db2mag(snr);
- MixIQ = MixIQ + ((randn(size(MixIQ)) + 1i*randn(size(MixIQ)))).*xigema;
- temprawdata(:,:,(txid-1)*numrx + rxid,frameid) = MixIQ;
- end
- end
-
- %% 叠加
- for i = 1 : numtx
- for k = 1 : numrx
- rawdata(:,:,i,frameid) = rawdata(:,:,i,frameid) + temprawdata(:,:,i + (k - 1)*numrx,frameid);
- end
- end
-
- end

仿真环境:window 11 ,Matalb2021b
4T4R两个空带,距离、速度、角度分别为(150,-12,30)、(100,4.4,-15)、(56, 25,13)的仿真效果为:
通过Emptyband算法解调,采用OMP-CS算法进行方位角估计(关于OMP-CS算法原理可参看我另一篇文章基于压缩感知(CS)的DOA估计方法-OMP-CS算法),这里为什么选用OMP-CS算法进行到DOA估计,主要原因是通过DDMA波形解调后,比较容易解调出每个发射天线和接收天线的单快拍数据,而数据采样点减少时,由于传统的基于协方差估计(Capon、MUSIC、ESPRIT)的方法失效,因此这里采用OMP-CS算法。如果各位头铁硬要使用上诉传统的方法,可以积累多个帧进行操作。方位角估计效果为:
将图2图3中目标的距离、速度、角度进行匹配,得到目标的3D点云图像:
DDMA仿真的部分代码结构如下:
- %% Author : Poulen
- %% Data : 2023.9.11
-
- %% 内容介绍:DDMA-MIMO demo,该案例用于学习DDMA原理以及接收端解调。DDMA主要原理为:在发射端每个发射天线同时发射,但是相邻发射天线之间加入一个人为的固定相移;
- %% 这使得不同的发射天线发射的chirp在doppler域得以区分出来,在接收端按照这种差异解调出来。
- %% 缺点:使得最大不模糊速度区间变为原来的1/N(N为发射天线数量),即最大不模糊速度区间减小了
- clear
- close all;
- clc;
- %% DDMA波形参数设置
- %% 参数设计
- parameter = RadarSystemDesign();
- maxv = parameter.dopplerindex;
- %% 获取原始数据
- rawdata = RawDataCapture(parameter);
-
- %% 展示时域信号波形
- timedomian = squeeze(rawdata(:,10,1,1));
- figure;
- subplot(2,1,1);
- plot(real(timedomian),'Color',[0 0 0],'LineWidth',1.2);
- title('原始信号时域波形(实部)');
- ylabel('信号幅度');
- xlabel('时域采样点');
- xlim([0 384]);
- subplot(2,1,2);
- plot(imag(timedomian),'Color',[0 0 0],'LineWidth',1.2);
- title('原始信号时域波形(实部)');
- ylabel('信号幅度');
- xlabel('时域采样点');
- xlim([0 384]);
-
- clear timedomian;
-
- %% 2DFFT(距离-速度估计)
- rangedoppler = RangeDopplerEst(parameter,rawdata);
-
- %% 多通道积累
- mulaccumulata = MulAccumulataEst(parameter,rangedoppler);
-
- figure;
- mesh(parameter.dopplerindex,parameter.rangeindex(1:end/2-38),db(mulaccumulata(1:end/2-38,:,1)));
- xlabel('速度(m/s)');
- ylabel('距离(m)');
- title('RD 图(4T4R Empty Band = 6)');
-
- %% 解调
- [CFAROUT,tagetestindex,targeest] = CA_2DCFAR(parameter,mulaccumulata); %二维cfar
- % figure;
- % mesh(parameter.dopplerindex,parameter.rangeindex(1:end/2-38),CFAROUT((1:end/2-38),:,1));
- % xlabel('速度(m/s)');
- % ylabel('距离(m)');
- % title('RD CA-CFAR 图');
- % % clear mulaccumulata;
-
- [target,AzimuthData] = EmptyBand(parameter,tagetestindex,mulaccumulata,rangedoppler);
-
- %% doa 估计(OMP-CS算法)
- [Azimuspectral,pointcloud] = OMPCS(parameter,target,AzimuthData);
-
- figure;
- plot(parameter.scale,abs(Azimuspectral));
- xlabel('方位向(°)');
- ylabel('幅度');
- title('OMPCS 角度谱');
- %% 绘制3D点云散点图(在该散点图中仅展示第一帧的图像信息)
- figure;
- X = pointcloud(1,:);
- Y = pointcloud(2,:);
- Z = pointcloud(3,:);
- S = 50;
- C = [0 1 0; 1 0 0; 0.5 0.5 0.5]; %注意:这是三个点目标是的RGB原组,若要改变目标数量,该原组需要改变
- get = scatter3(X,Y,Z,S,C);
- xlim([0 parameter.rangeindex(end/2-38)]);
- xlabel('距离(m)');
- ylim([parameter.dopplerindex(1) parameter.dopplerindex(end)]);
- ylabel('速度(m/s)');
- zlim([parameter.scale(1) parameter.scale(end)]);
- zlabel('角度(°)');
- title('3D点云图');
- view(30,35);
文中难免有笔误之处,望各位海涵。另外,制作不易望多多支持。
代码提取链:TDMA-DDMA 3D点云仿真代码合集