大家好,欢迎来到IT知识分享网。
OTFS 调制
本案例模拟了一条使用正交时频空间(OTFS)调制的通信链路,与标准的正交频分复用(OFDM)调制相比,突出了其载波间干扰(ICI)消除能力。OTFS 是一种多载波调制技术,在由高多路径组成的信道环境中具有弹性[1]。大多数现代无线系统都使用 OFDM,但由于其无法消除 ICI,因此在高多普勒信道中会受到影响。本示例实现了一个简单的 OTFS 发射器和接收器,通过具有移动散射体的信道过滤数据,并使用估计的信道参数在延迟-多普勒(DD)域均衡信道,以检测传输的编码字。
OTFS 原理
在高多普勒信道中,信道特性变化迅速,导致信道相干时间较短。相干时间与信道系数变化成反比。OFDM 多年来一直是各种无线系统的首选调制方案。使用 OFDM 时,高多普勒信道环境需要频繁的信道测量和 ICI。在高多普勒信道环境中,OFDM 的两个缺点包括需要更频繁地测量信道和 ICI:OFDM 在时频(TF)域传输数据,每个数据符号都有自己的正交频率子载波。参考(先导)符号可用于信道测量,但会占用部分信道载波。
延迟多普勒域
多路径对单个 DD 网元的影响如下所示。 




延迟-多普勒域到时频域的表示方法
要了解延迟-多普勒域如何转换到时频域,可以将这一过程与 OFDM 联系起来。下图显示了作为预编码 OFDM 调制-解调系统的 OTFS 调制和解调。
模拟高机动性信道上的 OTFS
M = 64; % 子载波的数量 N = 30; % 每帧的子符号数量 df = 15e3; % 将此设置为LTE的频率间隔 fc = 5e9; % 载波频率,单位赫兹 padLen = 10; % 使这个值大于信道延迟扩展的样本数 padType = 'ZP'; % 此示例需要ZP来减轻符号间干扰(ISI) SNRdB = 40; % 信噪比,单位分贝
% 导频生成和网格填充 pilotBin = floor(N/2)+1; % 计算导频信号放置的网格位置,取N的一半的向下取整值,然后加1,以确定DD域中的中心子符号位置。 Pdd = zeros(M,N); % 初始化一个M行N列的零矩阵,这个矩阵将用于表示延迟-多普勒(DD)域。 Pdd(1,pilotBin) = exp(1i*pi/4); % 在DD域的特定位置填充导频信号。这里使用exp(1i*pi/4)生成一个复数值作为导频信号,放置在第一行第pilotBin列的位置,以此来观察导频信号在信道中的效果。
OTFS调制
% OTFS modulation txOut = helperOTFSmod(Pdd,padLen,padType);
% 配置路径参数 chanParams.pathDelays = [1 5 8 ]; % 路径延迟的样本数 chanParams.pathGains = [1 0.7 0.5]; % 复杂路径增益 chanParams.pathDopplers = [1 -3 5 ]; % 多普勒指数,以fsamp/MN为倍数 fsamp = M*df; % Nyquist率的采样频率 if strcmp(padType,'ZP') || strcmp(padType,'CP') Meff = M + padLen; % 每个OTFS子符号的样本数 numSamps = Meff * N; % 每个OTFS符号的样本数 T = ((M+padLen)/(M*df)); % 符号时长(秒) else Meff = M; % 每个OTFS子符号的样本数 numSamps = M*N + padLen; % 每个OTFS符号的样本数 T = 1/df; % 符号时长(秒) end % 从多普勒指数计算实际的多普勒频率 chanParams.pathDopplerFreqs = chanParams.pathDopplers * 1/(N*T); % Hz % 将OTFS调制信号通过信道发送 dopplerOut = dopplerChannel(txOut,fsamp,chanParams); % 添加白色高斯噪声 Es = mean(abs(pskmod(0:3,4,pi/4).^ 2)); n0 = Es/(10^(SNRdB/10)); chOut = awgn(dopplerOut,SNRdB,'measured');
显示实际的散射体参数延迟和多普勒频移值,以便将归一化值与实际值联系起来。
for k = 1:length(chanParams.pathDelays) fprintf('Scatterer %d\n',k); fprintf('\tDelay = %5.2f us\n', 1e6*chanParams.pathDelays(k)/(Meff*df)); fprintf('\tRelative Doppler shift = %5.0f Hz (%5.0f km/h)\n', ... chanParams.pathDopplerFreqs(k), (physconst('LightSpeed')*chanParams.pathDopplerFreqs(k)/fc)*(3600/1000)); end
% 获取一个样本窗口 rxIn = chOut(1:numSamps); % OTFS解调 Ydd = helperOTFSdemod(rxIn,M,padLen,0,padType);
figure; xa = 0:1:N-1; ya = 0:1:M-1; mesh(xa,ya,abs(Hdd)); view([-9.441 62.412]); title('Delay-Doppler Channel Response H_{dd} from Channel Sounding'); xlabel('Normalized Doppler'); ylabel('Normalized Delay'); zlabel('Magnitude');
[lp,vp] = find(abs(Hdd) >= 0.05); chanEst.pathGains = diag(Hdd(lp,vp)); % 获取路径增益 chanEst.pathDelays = lp - 1; % 获取延迟指数 chanEst.pathDopplers = vp - pilotBin; % 获取多普勒指数
% 数据生成 Xgrid = zeros(M,N); Xdata = randi([0,1],2*M,N); Xgrid(1:M,:) = pskmod(Xdata,4,pi/4,InputType="bit");
%在所有子载波和符号上传输引导信号,以探测信道的声音 txOut = ofdmmod(exp(1i*pi/4)*ones(M,N),M,padLen); % 在整个网格上发送先导信号 dopplerOut = dopplerChannel(txOut,fsamp,chanParams); % 通过通道发送 chOut = awgn(dopplerOut,SNRdB,'measured'); % 添加噪声 Yofdm = ofdmdemod(chOut(1:(M+padLen)*N),M,padLen); % 解调 Hofdm = Yofdm * conj(Pdd(1,pilotBin)) / (abs(Pdd(1,pilotBin))^2 + n0); % LMMSE 信道估计值
使用 OFDM 发送数据网格。利用测得的信道估计值,对所有符号进行单抽头 FDE 均衡。
%在同一信道上传输数据,并使用信道估计值进行均衡 txOut = ofdmmod(Xgrid,M,padLen); % 传输数据网格 dopplerOut = dopplerChannel(txOut,fsamp,chanParams); % 通过信道发送 chOut = awgn(dopplerOut,SNRdB,'measured'); % 添加噪声 rxWindow = chOut(1:(M+padLen)*N); Yofdm = ofdmdemod(rxWindow,M,padLen); % 解调 Xhat_ofdm = conj(Hofdm) .* Yofdm ./ (abs(Hofdm).^2+n0); % 用 LMMSE 均衡
显示接收到的星座图。即使信噪比很高,星座也会产生噪声。您可以将两个散射体的多普勒频移设为零,观察星座的误差矢量幅度(EVM)是否减小,从而验证噪声主要来自 ICI。
constDiagOFDM = comm.ConstellationDiagram( ... 'ReferenceConstellation',pskmod(0:3,4,pi/4), ... 'XLimits',[-2 2], ... 'YLimits',[-2 2], ... 'Title','OFDM with Single-Tap FDE'); constDiagOFDM(Xhat_ofdm(:)); XhatData = pskdemod(Xhat_ofdm,4,pi/4, ... OutputType="bit",OutputDataType="logical"); % decode [~,ber] = biterr(Xdata,XhatData); fprintf('OFDM BER with single-tap equalizer = %3.3e\n', ber);
OTFS Over High-Doppler Channel
Transmit the same data grid using OTFS modulation.
% OTFS 调制 txOut = helperOTFSmod(Xgrid,padLen,padType); % 添加通道和噪声 dopplerOut = dopplerChannel(txOut,fsamp,chanParams); chOut = awgn(dopplerOut,SNRdB,'measured');
% 使用信道估计值形成 G 矩阵 G = getG(M,N,chanEst,padLen,padType);
rxWindow = chOut(1:numSamps); y_otfs = ((G'*G)+n0*eye(Meff*N)) \ (G'*rxWindow); % LMMSE Xhat_otfs = helperOTFSdemod(y_otfs,M,padLen,0,padType); % OTFS 解调
constDiagOTFS = comm.ConstellationDiagram( ... 'ReferenceConstellation',pskmod(0:3,4,pi/4), ... 'XLimits',[-2 2], ... 'YLimits',[-2 2], ... 'Title','OTFS with Time-Domain LMMSE Equalization'); constDiagOTFS(Xhat_otfs(:));


总结
免责声明:本站所有文章内容,图片,视频等均是来源于用户投稿和互联网及文摘转载整编而成,不代表本站观点,不承担相关法律责任。其著作权各归其原作者或其出版社所有。如发现本站有涉嫌抄袭侵权/违法违规的内容,侵犯到您的权益,请在线联系站长,一经查实,本站将立刻删除。 本文来自网络,若有侵权,请联系删除,如若转载,请注明出处:https://haidsoft.com/111916.html



