OFDM信号广泛应用于无线通信领域。OFDM是一种多载波信号,由一组称为子载波的正交复指数组成。每个子载波的复振幅可用于承载通信数据,从而实现高数据速率。OFDM波形还具有多普勒容限和无距离 - 多普勒耦合的特点。这些OFDM特性对雷达应用具有吸引力。本节示例展示了如何使用OFDM波形同时进行雷达传感和通信。
设OFDM子载波数量为1024。由于所有子载波在频率上必须等间隔分布,计算子载波间隔。
Nsc = 1024; % 子载波数量
df = B/Nsc; % OFDM子载波间隔
Tsym = 1/df; % OFDM符号持续时间
根据OFDM系统设计规则,子载波间隔必须至少是信号经历的最大多普勒频移的10倍。这是确保子载波正交性所必需的。验证本示例所考虑的场景是否满足此条件。
df > 10*fdmax
为了避免符号间干扰,OFDM符号前面会添加循环前缀。根据最大感兴趣距离计算循环前缀持续时间。
Tcp = range2time(Rmax); % 循环前缀(CP)持续时间
Ncp = ceil(fs*Tcp); % 循环前缀的样本长度
Tcp = Ncp/fs; % 调整循环前缀持续时间,使其样本数为整数
Tofdm = Tsym + Tcp; % 含循环前缀的OFDM符号持续时间
Nofdm = Nsc + Ncp; % 一个OFDM符号中的样本数
指定一些子载波作为保护带。
nullIdx = [1:9 (Nsc/2+1) (Nsc-8:Nsc)]'; % 保护带和直流子载波
Nscd = Nsc-length(nullIdx); % 数据子载波数量
生成要传输的二进制数据。由于每个OFDM子载波可以承载一个复数据符号,因此首先必须对生成的二进制数据进行调制。使用QAM调制对生成的二进制数据进行调制。最后,对QAM调制后的符号进行OFDM调制。
bps = 6; % 每个QAM符号(以及OFDM数据子载波)的比特数
K = 2^bps; % 调制阶数
Mofdm = 128; % 传输的OFDM符号数量
dataTx = randi([0,1], [Nscd*bps Mofdm]);
qamTx = qammod(dataTx, K, 'InputType', 'bit', 'UnitAveragePower', true);
ofdmTx = ofdmmod(qamTx, Nsc, Ncp, nullIdx);
假设相干处理间隔足够长,可以对Mofdm个符号进行相干处理。计算单个OFDM帧的持续时间和一帧中的总数据比特数。
Tofdm*Mofdm % 帧持续时间(秒)
Nscd*bps*Mofdm % 总比特数
注意,OFDM帧持续时间与PMCW帧持续时间相近,但传输的总比特数要大几个数量级。
雷达信号仿真与处理
使用与PMCW情况相同的系统来模拟JRC对OFDM信号的传输以及雷达接收器对目标回波的接收。
xofdm = reshape(ofdmTx, Nofdm, Mofdm);
% OFDM波形不是恒模波形。生成的OFDM样本功率远小于1。为了充分利用可用的发射功率,对波形进行归一化处理,使功率最大的样本功率为1。
xofdm = xofdm/max(sqrt(abs(xofdm).^2), [], 'all');
% 为雷达接收器接收的信号预分配空间
yofdmr = zeros(size(xofdm));
% 在运行仿真之前重置表示JRC和目标的平台对象
reset(jrcmotion);
reset(tgtmotion);
% 假设所有Mofdm个符号都在单个相干处理间隔(CPI)内传输,每次传输一个OFDM符号
for m = 1:Mofdm
% 更新传感器和目标位置
[jrcpos, jrcvel] = jrcmotion(Tofdm);
[tgtpos, tgtvel] = tgtmotion(Tofdm);
% 计算从发射阵列观察到的目标角度
[tgtrng, tgtang] = rangeangle(tgtpos, jrcpos);
% 发射信号
txsig = transmitter(xofdm(:, m));
% 向目标辐射信号
radtxsig = radiator(txsig, tgtang);
% 应用自由空间信道传播效应
chansig = radarChannel(radtxsig, jrcpos, tgtpos, jrcvel, tgtvel);
% 信号从目标反射
tgtsig = target(chansig, false);
% 在接收阵列接收目标回波
rxsig = collector(tgtsig, tgtang);
% 在接收器处添加热噪声
yofdmr(:, m) = receiver(rxsig);
end
处理目标回波以获得距离 - 多普勒图。信号处理步骤如框图所示。
去除循环前缀,并使用ofdmdemod
函数在快速时间域计算DFT。
yofdmr1 = reshape(yofdmr, Nofdm*Mofdm, 1);
% 解调接收到的OFDM信号(计算DFT)
Yofdmr = ofdmdemod(yofdmr1, Nsc, Ncp, Ncp, nullIdx);
组成接收OFDM信号的子载波的复振幅就是发射的QAM符号。因此,为了去除通信数据,将接收信号的DFT除以发射的QAM符号。
Zofdmr = Yofdmr./qamTx;
使用phased.RangeDopplerResponse
计算并绘制距离 - 多普勒图。
% 距离 - 多普勒响应对象在慢时间域计算DFT,然后在快速时间域计算IDFT以获得距离 - 多普勒图
rdr = phased.RangeDopplerResponse('RangeMethod', 'FFT', 'SampleRate', fs, 'SweepSlope', -B/Tofdm,...
'DopplerOutput', 'Speed', 'OperatingFrequency', fc, 'PRFSource', 'Property', 'PRF', 1/Tofdm, ...
'ReferenceRangeCentered', false);
figure;
plotResponse(rdr, Zofdmr, 'Unit', 'db');
xlim([-vrelmax vrelmax]);
ylim([0 Rmax]);
通信信号仿真与处理
使用与PMCW情况相同的随机莱斯信道模型来模拟信号从JRC发射机到下行链路用户的传播。
[yofdmc, pathGains] = commChannel(ofdmTx);
添加接收噪声。
yofdmc = awgn(yofdmc, SNRu, "measured");
计算OFDM信道响应以进行信道均衡。
channelInfo = info(commChannel);
pathFilters = channelInfo.ChannelFilterCoefficients;
toffset = channelInfo.ChannelFilterDelay;
Hofdm = ofdmChannelResponse(pathGains, pathFilters, Nsc, Ncp, ...
setdiff(1:Nsc, nullIdx), toffset);
进行解调和均衡。处理步骤的框图如下所示。
zeropadding = zeros(toffset, 1);
ofdmRx = [yofdmc(toffset+1:end,:); zeropadding];
qamRx = ofdmdemod(ofdmRx, Nsc, Ncp, Ncp/2, nullIdx);
qamEq = ofdmEqualize(qamRx, Hofdm(:), 'Algorithm', 'zf');
解调QAM符号以获得接收的二进制数据。
dataRx = qamdemod(qamEq, K, 'OutputType', 'bit', 'UnitAveragePower', true);
refconst = qammod(0:K-1, K, 'UnitAveragePower', true);
constellationDiagram = comm.ConstellationDiagram('NumInputPorts', 1, ...
'ReferenceConstellation', refconst, 'ChannelNames', {'Received QAM Symbols'});
% 显示组成前10个接收OFDM符号的QAM数据符号
constellationDiagram(qamEq(1:Nscd*10).');
计算误码率。
[numErr,ratio] = biterr(dataTx, dataRx)