%% 生成ADC数据,这里生成IQ两路的
function [signal] = Gendata_IQ(targetList,cfgOut)
%把参数拿出来:
targetnum = targetList.nums;
numsTx = cfgOut.numTx;
numsRx = cfgOut.numRx;
Rangenums = cfgOut.Rangenums;
Dopplernums = cfgOut.Dopplernums;
ChirpB = cfgOut.chirpB; %Hz 这是发射带宽
ChirpUp = cfgOut.chirpUp; %s
FreAdc = cfgOut.freAdc; %Hz
FreStart = cfgOut.freStart; %Hz
ChirpT = cfgOut.chirpT; %s 这是正常的前后发射的chirp之间的时间间隔
Pt = cfgOut.Pt;
Fn = cfgOut.Fn;
Ls = cfgOut.Ls;
Pa = cfgOut.Pa;
array = cfgOut.array;
antennaPhase = cfgOut.antennaPhase;
arraynums = size(array,2);
arraydelay = zeros(1,arraynums) + ChirpT * reshape( repmat([0:numsTx-1], numsRx, 1), 1, arraynums );
%生成一个1*arraynums长的时延数组,[0 0 0 0 1 1 1 1 2 2 2 2 3 3 3 3]*ChirpT
delay_Tx = ChirpT*numsTx;
%事实上,我们是以第一个接收通道的第一个chirp下的采样数据作为"基准",后面数据的时间延迟包括两个部分:
%1、对于同一个通道,其前后chirp之间有一个时间延迟:该延迟为同一个发射天线发射的前后chirp间的时间间隔。
%2、对于不同的通道之间(以numsRx为一组),有因为前后发射的chirp之间的时间延迟:每组通道之间的时间延迟为单chirp的周期。
%3、此外,对于单个chirp下不同距离的采样点之间还有一个时延迟: 1/fadc * n
%不过,这些时延迟对应到具体的数据上是通过速度这个媒介引入的。
arraydx = cfgOut.arraydx; %λ
arraydy = cfgOut.arraydy;
%得到一些中间结果
C = 3e8;
lambda = C/FreStart; %m
Ts = 1/FreAdc; %s
chirpSlop = ChirpB/ChirpUp; %Hz/s
%开始生成ADC数据
signal = zeros(Rangenums,Dopplernums,arraynums);
noiseI = normrnd(0,1,Rangenums,Dopplernums,arraynums); %噪声为正态分布
noiseQ = normrnd(0,1,Rangenums,Dopplernums,arraynums);
for targetID = 1: targetnum
targetR = targetList.R(targetID); %m
targetV = targetList.V(targetID); %m/s
targetAzi = targetList.Azi(targetID); %°
targetEle = targetList.Ele(targetID);
targetRCS = targetList.RCS(targetID); %dBsm
Gt = targetList.Gt(targetID); %dBm
Gr = targetList.Gr(targetID);
%基于雷达方程,计算该目标的SNR
[targetSNR] = CalculateSNR(targetR,targetRCS,Gt,Gr,lambda,Pt,Fn,Ls,FreAdc); %dB
A = sqrt(2*db2pow(targetSNR)); %得到信号的幅度。
targetPhi0 = rand*2*pi; %相位初始随机,范围是[0 2*pi]。
signalTempI = zeros(Rangenums,Dopplernums,arraynums);
signalTempQ = zeros(Rangenums,Dopplernums,arraynums);
signalTemp = zeros(Rangenums,Dopplernums,arraynums);
%开始循环并生成对应的ADC数据。 这里ADC的数据生成,是一个通道一个通道生成的,且对于每个通道的数据,是一个个chirp轮着来。
%你也可以按照另外的顺序来,比如最外层的是chirp,每个chirp下得到各个通道下的ADC数据这样。
%但是会很不方便,因为是TDM的模式,这就导致通道维度同一个chirp下的数据并不是一个发射天线发射后得到的信号。
for channelIdx = 1:arraynums
for dopplerIdx = 1:Dopplernums
for rangeIdx = 1:Rangenums
delayT = 2*targetR/C + 2*targetV*((dopplerIdx-1)*delay_Tx + arraydelay(channelIdx) + rangeIdx*Ts)/C; %时延迟
phi = targetPhi0 + 2*pi*(array(1,channelIdx)*sind(targetAzi)*arraydx + ...
array(2,channelIdx)*sind(targetEle)*arraydy) + antennaPhase(channelIdx)*pi/180;
%这里的相位关系就是这样直接加?不在同一个水平线上的阵列,收到的目标回波可以等效成他们是在同一个水平线上的?
signalTempI(rangeIdx,dopplerIdx,channelIdx) = A * cos(2*pi*(FreStart*delayT + chirpSlop*delayT*rangeIdx*Ts - chirpSlop*delayT*delayT/2) + phi);
signalTempQ(rangeIdx,dopplerIdx,channelIdx) = A * sin(2*pi*(FreStart*delayT + chirpSlop*delayT*rangeIdx*Ts - chirpSlop*delayT*delayT/2) + phi);
signalTemp(rangeIdx,dopplerIdx,channelIdx) = signalTempI(rangeIdx,dopplerIdx,channelIdx) + 1i*signalTempQ(rangeIdx,dopplerIdx,channelIdx);
%这里不去考虑你adc是在什么时候开始采数据的。
%这里是基于混频的解析表达式的结果: 混频之后,g(t) = A*cos(2*pi*fo*T + 2*pi*chirpSlop*T - pi*ChirpSlop*T^2)
%T是目标回波的时间延迟,我们这里要特别注意的是:是针对第一个chirp的第一个接收距离维度的点的时间延迟。
end
end
end
signal = signal + signalTemp;
end
signal = signal + (noiseI-1i*noiseQ);