5G-NR中STO估计技术

STO的影响

STO(Symbol Time Offset)是指符号定时偏差。OFDM系统中,在发射端,我们会做IFFT进行OFDM调制,同时添加CP(Cyclic Prefix,循环前缀)。接收端则是该过程的逆过程,即去除CP,而后进行FFT。由于接收端不知道每个符号精确的起始位置,在进行符号同步时可能或提前或滞后给出一个起始信号,从而会对FFT的结果产生影响。

image

图1 4种OFDM符号起始点的情况

图1是《MIMO-OFDM Wireless Communications with MATLAB》一书中第5.1节给出的示意图[1],四种情况分别对应:

  1. 定时准确,FFT窗的起始点与OFDM符号去除CP后的起始点一致,这种情况下可以保持子载波频率成分的正交性,OFDM符号可以完美恢复;

\[Y_l[k]=\sum_{n=0}^{N-1}x_l[n]e^{-j2\pi nk/N} \]

  1. 定时提前,落在CP内,这种情况下FFT的输入信号是原信号的循环移位,假设偏移了\(\delta\)个值,那进行FFT的时域信号为 \(\{x_l[n+\delta]\}_{n=0}^{N-1}\) ,FFT后的频域结果为

    \[\begin{aligned} Y_l[k]&=\sum_{n=0}^{N-1}x_l[n-\delta]e^{-j2\pi nk/N}\\ &=\sum_{m=-\delta}^{N-1-\delta} x_l[m]e^{-j2\pi(m+\delta)/N}\\ &=\sum_{m=-\delta}^{1} x_l[m]e^{-j2\pi(m+\delta)/N}+\sum_{m=0}^{N-1} x_l[m]e^{-j2\pi(m+\delta)/N}-\sum_{m=N-\delta}^{N-1} x_l[m]e^{-j2\pi(m+\delta)/N}\\ \end{aligned}\]

    由于循环前缀的特性(将后半段放到前面),上面式子第一项与第三项相同,于是

    \[Y_l[k]=\left\{\sum_{n=0}^{N-1}x_l[n]e^{-j2\pi nk/N}\right\}\cdot e^{-j2\pi \delta k/N} \]

    对应频域点发生旋转,如图2所示
    image

图2 STO的影响

简单的matlab仿真代码如下:

clear,clc
close all
Nfft = 4096; % FFT size
Ncp = 1024;  % extended CP
Nofdm = Nfft+Ncp;
RB = 64; % resource block num
Qm = 2; % modulation order
Ebn0 = 20;
sto = 64;
SNR = Ebn0+10*log10(Qm)+10*log10(RB*12/Nfft);
b = pskmod(randi([0,3],RB*12,1),4,0.25*pi); % QPSK
Ng = Nfft-RB*12; % Guard
x = [zeros(Ng/2,1);b;zeros(Ng/2,1)];
x_tx = ifft(fftshift(x));
x_tx = [x_tx(Nfft-Ncp+1:Nfft);x_tx]; % add CP

x_ch = awgn(x_tx,SNR,'measured');
y_rx = x_ch(Ncp+1:Nofdm); % remove cp without sto
y_rx1 = x_ch(Ncp+1-sto:Nofdm-sto); % with sto

y = fftshift(fft(y_rx));
y1 = fftshift(fft(y_rx1));
yb = y(Ng/2+1:Ng/2+RB*12);
yb1 = y1(Ng/2+1:Ng/2+RB*12);

figure;
% set(0,'defaultfigurecolor','w');
subplot(121);
plot(yb,'.'); axis equal; axis([-1.2,1.2,-1.2,1.2]); hold on;
title('scatter without sto');
subplot(122);
plot(yb1,'.'); axis equal;axis([-1.2,1.2,-1.2,1.2]); 
title('scatter with sto');

  1. OFDM符号的定时起点在前一个OFDM符号的信道响应结束之前,因此,符号时序为时过早,无法避免ISI(Inter Symbol Interference,符号间干扰)。在这种情况下,子载波之间的正交性被ISI破坏,此外,还会有ICI(Inte Channel Interference,信道间干扰)发生。
  2. FFT窗包含下一个OFDM符号的循环前缀,此时也会发生符号间干扰。

STO估计技术

STO的估计主要分为时域估计技术和频域估计技术。

频域STO估计

基于导频的频域STO估计

频域STO估计主要借助于导频信息,也就是DMRS(De-Modulation Reference Symbol)符号。DMRS符号有一个重要的特性就是,每个子载波上的功率为1

我们知道,在时域上的同步偏差,反映到频域上就是相位旋转,假设发射的导频信号为\(X_l(k)\),接收到的导频信号则为\(Y_l(k)e^{j2\pi\delta k/N}\),其中\(Y_l(k)=H_l(k)X_l(k)\)(理想情况下)。我们把接收到的信号与发射端的导频信号作相关(共轭相乘),再作IFFT转换到时域上,则有

\[\begin{aligned} y_l^X(n)&=IFFT\{Y_l(k)e^{j2\pi\delta k/N}X_l^*(k)\}\\ &=\frac{1}{N}\sum_{k=0}^{N-1}Y_l(k)e^{j2\pi\delta k/N} X_l^*(k)e^{j2\pi nk/N}\\ &=\frac{1}{N}\sum_{k=0}^{N-1}H_l(k)X_l(k)X_l^*(k)e^{j2\pi(\delta+n)k/N}\\ &= \frac{1}{N}\sum_{k=0}^{N-1}H_l(k)e^{j2\pi(\delta+n)k/N} \\ &= h_l(n+\delta)\end{aligned} \]

其中,第三行到第四行是因为\(X_l(k)X_l^*(k)=1\),也是DMRS符号的一个特性。这样,反映到时域就是信道脉冲响应的移位。根据估计出的STO值可以对接收信号进行补偿,从而获得正确的星座图。

如图3和图4分别是DMRS信号相关峰值,和星座图。
image

图3 DMRS相关峰值

image

图4 STO补偿情况

这部分对应的Matlab代码如下,

% test_sto_est.m
% 3gpp ts38.211
clear,clc
close all
global ShowFigure;
ShowFigure=1;
rng(0);
Nfft = 4096; % FFT size
Ncp = 1024;  % extended CP
Nofdm = Nfft+Ncp;
RB = 64; % resource block num
Qm = 2; % modulation order
Ebn0 = 20;
sto = 32;
Nsymb = 12;
dmrs_pos = [2,6,9];
Ng = Nfft-RB*12; % Guard
SNR = Ebn0+10*log10(Qm)+10*log10(RB*12/Nfft);
%% transmitter
b = pskmod(randi([0,3],RB*12,Nsymb-numel(dmrs_pos)),4,0.25*pi); % QPSK
dmrs = pskmod(randi([0,15],RB*6,numel(dmrs_pos)),16,0.125*pi);
% random number, not the real way for dmrs generation, just for simulation
tx_dmrs = dmrs./rms(dmrs,2);

% resource mapping
dmrs_idx = 1;
data_idx = 1;
x = zeros(RB*12,Nsymb);
for l = 1:Nsymb
    if ismember(l,dmrs_pos)
        x(:,l) = upsample(tx_dmrs(:,dmrs_idx),2); % configuration type 1 for pusch
        dmrs_idx = dmrs_idx+1;
    else
        x(:,l) = b(:,data_idx);
        data_idx = data_idx+1;
    end
end

x1 = [zeros(Ng/2,Nsymb);x;zeros(Ng/2,Nsymb)];
x_tx = ifft(fftshift(x1,1));
x_tx = [x_tx(Nfft-Ncp+1:Nfft,:);x_tx]; % add CP

%% channel
% x_ch = x_tx;
x_ch = awgn(x_tx,SNR,'measured');
% y_rx = x_ch(Ncp+1:Nofdm,:); % remove cp without sto
y_rx = x_ch(Ncp+1-sto:Nofdm-sto,:); % with sto

%% receiver
y = fftshift(fft(y_rx),1);
yb = y(Ng/2+1:Ng/2+RB*12,:);
dmrs_idx = 1;
data_idx = 1;
rx_dmrs = zeros(RB*12,numel(dmrs_pos));
rx_data = zeros(RB*12,Nsymb-numel(dmrs_pos));
for l = 1:Nsymb
    if ismember(l,dmrs_pos)
        rx_dmrs(:,dmrs_idx) = yb(:,l);
        dmrs_idx = dmrs_idx+1;
    else
        rx_data(:,data_idx) = yb(:,l);
        data_idx = data_idx+1;
    end
end
rx_dmrs = rx_dmrs(1:2:end-1,:);
sto_e = sto_est(rx_dmrs,tx_dmrs,Nfft,'freq');
% compensation for sto
k = Ng/2+[1:RB*12];
rx_data1 = rx_data.*exp(1i*(sto_e*2*pi/Nfft)*(k-1)');

if ShowFigure == 1
    figure;
    % set(0,'defaultfigurecolor','w');
    subplot(121);
    plot(rx_data1,'.'); axis equal;axis([-1.2,1.2,-1.2,1.2]); 
    title('scatter with sto compensated');
    subplot(122);
    plot(rx_data,'.'); axis equal;axis([-1.2,1.2,-1.2,1.2]); 
    title('scatter with sto not compensated');
end

其中,sto_est函数涵盖了多种估计算法,也在此处给出。

function varargout = sto_est(varargin)
% Symbol Timing Offset Estimation.
% sto = sto_est(y,xp,Nfft,'freq');
% sto = sto_est(y,Nfft,Ng,delay,'time');
% Inputs:
%   y      : received symbols in time domain or frequency domain.
%   xp     : transmitter pilot symbol in frequency domain.
%   Nfft   : FFT points.
%   Ng     : guard length.
%   delay  : delay length in time domain sto est.
%   method : 'freq','time'
% Outputs:
%   sto_est  : STO estimation result.

global ShowFigure;

narginchk(1,5);
nargoutchk(0,2);

% parse input arguments.
lenargin = length(varargin);
if lenargin>=1
    y = varargin{1};
    method = 'time';
    if lenargin >= 2
        method = varargin{lenargin};
    end
end

% estimate sto.
if strcmpi(method,'freq')
    xp = varargin{2};
    Nfft = varargin{3};

    corr = conj(xp).*y;
    corrt = ifft(corr,Nfft);
    if ShowFigure == 1
        figure; plot(abs(corrt),'b-.');
        title('channel impulse response');
    end
    [~,pos] = max(corrt);
    sto_est = (pos-1)/2;
    sto_est = mean(sto_est);
%     sto_est = (pos-1)/2*(Nfft/Nfft_sto); % lower FFT size for resource;
elseif strcmpi(method,'time')
    Nfft = varargin{2};
    Ng = varargin{3};
    if lenargin == 5
        delay = varargin{4};
    else
        delay = (Nfft+Ng)/2;
    end
    Nofdm=Nfft+Ng; minimum=100; sto_est=0;
    Mag = zeros(1,Nofdm);
    for n=1:Nofdm
        nn = n+delay+[0:Ng-1]; tmp0 = abs(y(nn))-abs(y(nn+Nfft));
        Mag(n) = sum(abs(tmp0).^2); % Squared difference
        if Mag(n)<minimum
            minimum=Mag(n); 
            sto_est=delay+(n-1)-Nfft-Ng; 
        end
    end
end

% arguments out.
if nargout == 1
    varargout = {sto_est};
elseif nargout == 2
    varargout = {sto_est,0};
end

时域STO估计

基于CP的时域STO估计

该种估计技术主要是利用OFDM系统的CP信息。如图5所示,是使用双滑动窗口的时域STO估计技术示意图。
image

图5 时域STO估计,双滑动窗口

W1和W2是两个等长的滑动窗口,间隔距离等于OFDM符号长度。我们知道,循环前缀是把尾部特定长度复制到头部,那么,当W1恰好覆盖到循环前缀,W2此时覆盖的内容与W1完全相同,此时二者的区别最小。

判断二者区别最小的方法有很多种,比如差值最小,差值的平方最小,相关值最大等等,用公式分别表示为:

  1. 差值最小

    \[\hat{\delta}=arg\quad \mathop{min}\limits_{\delta}\{\sum_{i=\delta}^{N_G-1+\delta} |y_l[n+i]-y_l[n+N+i]|\} \]

  2. 差值平方最小

    \[\hat{\delta}=arg\quad \mathop{min}\limits_{\delta}\{\sum_{i=\delta}^{N_G-1+\delta} (|y_l[n+i]-y_l[n+N+i]|)^2\} \]

  3. 相关值最大

    \[\hat{\delta}=arg\quad \mathop{max}\limits_{\delta}\{\sum_{i=\delta}^{N_G-1+\delta} |y_l[n+i]\cdot y_l^*[n+N+i]|\} \]

这里MATLAB仿真使用第2种,差值平方最小,得到的估计值与频域估计结果相同。代码参见频域估计的sto_est函数。

基于训练序列的时域STO估计

与基于CP的估计类似, 基于训练序列的时域STO估计也是利用已知的时域特性来估计STO。训练序列(Training Symbol)与导频类似,是在发射端发送的用来解调的参考信号。训练序列与导频的区别是,导频有多种插入方式,例如块状导频(Block Pilot),梳状导频(Comb Pilot),栅状导频(Lattice Pilot),如图6所示(图片来自《MIMO-OFDM Wireless Communications with MATLAB》6.1节)[1:1]

image

图6 三种导频插入方式

后两者的插入方式,可以将导频信息散入到整个帧当中,而训练序列更类似与块状导频,单独占用一个符号用于接收机的同步。在3GPP TS38.211 6.4.1.1.3当中,如果传输预编码启用,PUSCH的DMRS信号插入方式为,隔1个符号插一个0(2倍上采样),反映在时域就是,重复一段。从公式的角度看一下:

\[\begin{aligned} x(n)&=\frac{1}{N}\sum_{k=0}^{N-1}X(k)e^{j2\pi kn/N},n=0,1,\cdots N-1 \\ x'(n)&=\frac{1}{2N}\sum_{k=0}^{2N-1}X'(k)e^{j2\pi kn/2N},n=0,1,\cdots 2N-1\\ &=\frac{1}{2N}\sum_{l=0}^{N-1}X'(2l)e^{j2\pi\cdot 2ln/2N}+\frac{1}{2N}\sum_{l=0}^{N-1}X'(2l+1)e^{j2\pi (2l+1)n/2N}\\ &= \frac{1}{2N}\sum_{k=0}^{N-1}X(k)e^{j2\pi kn/N},n=0,1,\cdots 2N-1 \end{aligned} \]

其中,\(X'(k)\)\(X(k)\)的2倍上采样,\(x'(n)\)\(x(n)\) 分别是2倍上采样和原序列的时域结果,当\(n=0:N-1\)\(x'(n)=x(n)\),当\(n=N:2N-1\),由于单位圆的周期性,此时\(x'(n)\)是前一段的重复。其在时域上的示意图如图7所示。

image

图7 时域STO估计,基于训练序列

基于训练序列的时域STO估计与基于CP的估计类似,只是原来的CP换成了时域上重复的训练序列,这里不再赘述。

参考资料


  1. Cho, Yong Soo, et al. MIMO-OFDM wireless communications with MATLAB. John Wiley & Sons, 2010. ↩︎ ↩︎

posted @ 2022-10-13 18:58  devindd  阅读(1200)  评论(0编辑  收藏  举报