第8章(1)内容如下:
今天来讲OFDM同步技术的知识,主要参考材料是《MIMO-OFDM无线通信技术及MATLAB实现》,于是给本章取名为第8章——OFDM同步技术。
《MIMO-OFDM无线通信技术及MATLAB实现》代码下载地址:
OFDM同步技术主要内容如下:
一、STO和CFO的基本介绍及影响
在第7章《OFDM信道估计与均衡》系列文章中讲清楚了OFDM符号间干扰(ISI)和子载波(ICI)是什么,也讲了什么时候会出现ISI和ICI以及应对措施。(不懂的同学可出门左转,及时复习!)
那么问题了,既然要分清OFDM符号间,前提便是要知道一个OFDM符号的起始点和结束点在哪里,这样才可以分清楚不同的OFDM符号。
因此,找到OFDM符号的起始点和结束点这是一个关键的问题。
我举个例子。
假设OFDM符号长度是64符号+CP长度16符号=80符号,假设这80个符号是1到80的随机数。
在没有噪声和信道的影响下,接收端收到这些符号,怎么知道收到的第一个符号是不是发送端的第一个符号呢?如果不是,是第几个符号呢?
再进一步,假设发送端循环发送一个OFDM符号是5 6 3 4 5 6,即5 6 3 4 5 6 5 6 3 4 5 6……
接收端不小心漏掉了第一个,其实他自己并不知道漏掉的是第一个或者是第几个,反正收到了 6 3 4 5 6 5 6 3 4 5 6……
然后接收端以为6 是OFDM符号中的第一个符号,此时便认为6 3 4 5 6 5是一个OFDM符号。
可能你已经发现问题了,真正在做FFT的符号(6 3 4 5 6 5)和你想要用去做FFT(5 6 3 4 5 6)偏差了一个符号,这便是符号定时偏差。
以上的举例不是特别严谨,但希望能帮助你理解符号定时偏差是什么。
因此,为了在接收端顺利的进行N点FFT,接收机需要在OFDM符号周期内得到对发射信号精确采样。
也就是说,必须要知道哪些符号是属于一个完整的OFDM符号,或者说需要准确知道一个完整OFDM符号的起始和结束位置。(这句话,仔细阅读,但不用死记硬背,结合后面的代码便能深刻理解了!!!)
对应到数学表达式来讲,令 δ \delta δ 和 ε \varepsilon ε 表示归一化的STO和CFO,则
y l [ n ] = IDFT { Y l [ k ] } = IDFT { H l [ k ] X l [ k ] + Z l [ k ] } = 1 N ∑ k = 0 N − 1 H l [ k ] X l [ k ] e j 2 π ( k + ε ) ( n + δ ) / N + z l [ n ] \begin{aligned} y_{l}[n] &=\operatorname{IDFT}\left\{Y_{l}[k]\right\}=\operatorname{IDFT}\left\{H_{l}[k] X_{l}[k]+Z_{l}[k]\right\} \\ &=\frac{1}{N} \sum_{k=0}^{N-1} H_{l}[k] X_{l}[k] \mathrm{e}^{\mathrm{j} 2 \pi(k+\varepsilon)(n+\delta) / N}+z_{l}[n] \end{aligned} yl[n]=IDFT{Yl[k]}=IDFT{Hl[k]Xl[k]+Zl[k]}=N1k=0∑N−1Hl[k]Xl[k]ej2π(k+ε)(n+δ)/N+zl[n] (1)
其中, z l [ n ] = IDFT { Z l [ k ] } z_{l}[n]=\operatorname{IDFT}\left\{Z_{l}[k]\right\} zl[n]=IDFT{Zl[k]}
在这里 δ \delta δ 和 ε \varepsilon ε 表示归一化的STO和CFO,你需要理解(k+ ε \varepsilon ε)是关于频率的这一项, (n+ δ \delta δ)是关于符号位置的这一项, 这将直接决定你是否理解STO和CFO的区别。
那么出现了STO,会对接收端有什么影响呢?
举个例子来说,假设真实的 δ \delta δ =3,此时令n=1,若 δ \delta δ =0,按照上面的公式(1)算出来的就是 y l [ 1 ] {y_l}\left[ 1 \right] yl[1] ,而由于实际上真实的 δ \delta δ =3,算出来的其实是 y l [ 4 ] {y_l}\left[ 4 \right] yl[4] ,但被接收机认为是 y l [ 1 ] {y_l}\left[ 1 \right] yl[1] 。
以下图片内容来自《MIMO-OFDM无线通信技术及MATLAB实现》第5章:
说完了STO的影响,说一下CFO。
在前面第3章和第4章内容中,均介绍过多普勒效应和收发端本地振荡器对于频率偏差的影响。
举个数值的例子来说,比如发送信号的载波频率是2000Hz,假设多普勒频偏是30Hz,此时接收机的本振是产生1998Hz的载波频率。此时,就有了2000+30-1998 = 32Hz。
当然,多普勒偏移的正负值是和发送机相对于接收机的移动速度的方向有关。
有了频率偏移后,会有什么影响呢?你先思考一下?这个留到下一篇文章再讲。
二、STO的估计技术
上面已经讲过了STO的定义和影响,为了保证OFDM系统性能,接收机必须利用同步技术来估计STO,即准确估计出OFDM符号的起始点和结束点。
CP是OFDM一段数据的复制,正是复制这个特点,可以通过两滑动窗的相似度来对STO进行估计,也可通过CP与该段数据频域上的特点,来对CFO进行估计。(这句话结合下面给出的代码便更好理解了)
我想,这又是CP相对于ZP的一大优势吧。
不管是基于CP还是基于训练符号的STO技术,核心步骤,我个人总结如下:
1、窗滑动
可能是两滑动窗均在移动,也有可能是一个滑动窗在不停向前移动,本地窗固定不动。
2、衡量相似度
可能是两滑动窗之间的相似度,也有可能是滑动窗与本地固定窗的相似度。
相似度的衡量可以从两个角度入手:
(1)基于相关性,则用“相乘、累加”的值来衡量,值越大,说明两滑动窗的相似度越好;
(2)基于差值最小的,则用“相减、平方”的值来衡量,值越小,说明两滑动窗的相似度越好。
当然,基于相关性和差值最小的思想,结合到具体的应用,可以参考下面的公式(5.10)(5.11)(5.12)等公式
3、比较
比较的目的是找出当滑动窗滑到什么位置时,两滑动窗之间的相似度或者滑动窗与本地固定窗的相似度最好,便将这个位置进行标记,以此作为OFDM符号的起始点。
滑动相关的思想和第3章突发通信捕获的思想是一样的,不过第3章中衡量的是滑动窗与本地固定窗的相似度。
当然,STO和CFO的联合估计,可以类似地采用二维搜索。
继续看《MIMO-OFDM无线通信技术及MATLAB实现》第5章内容:
可能有的同学一看到大量的数学公式,就已经开始瞌睡了。不对,说不定已经睡着了。不对,说不定直接滑到下面的代码区了,没看到这段话,哈哈哈哈哈哈哈。
说实话,要完全搞懂那些数学公式推导是要有比较强的信号与系统、数字信号处理的基础知识。我一开始也是看不太懂,在这里提供两个小建议:
(1)代具体数字:上面的公式中,都是字母表示,可代具体的数字进去理解,即用特殊情况帮助理解一般情况;
不想带公式??(有一点真实。)
(2)运行一下代码,看代码一步步执行,便可以理解了。
频域STO技术如下:
三、STO估计技术的可运行MATLAB代码及其注意点
下面代码内容是基于CP的STO估计,在相关性最大和差值最小两种算法的性能比较。
%%%%%%%%%%%%%%%%%%%%% 基于CP的STO(符号定时偏差) %%%%%%%%%%%%%%%%
%%%%%%%%%%%%%%%%%%%%% STO_estimation_sim1.m %%%%%%%%%%%%%
%%%%%%%%%%%%%%%%%%%%% date:2020年11月20日 author:飞蓬大将军 %%%%%%%%%%
%%%%%%%%%%%%%%%%%程序说明
%%%%基于CP,采用最大相关和最小距离算法完成STO的估计
%%%%%% 仿真环境
%软件版本:MATLAB R2019a
clear, figure(1), clf, figure(2), clf
nSTOs = [-3 -3 2 2]; %对应STO的采样数
CFOs = [0 0.5 0 0.5]; %CFO向量
SNRdB = 30; %SNR
MaxIter = 10; %迭代次数
%CFOs = [0 0 0 0];
Nfft = 128; %FFT大小
Ng = Nfft/4; % GI长度
Nofdm = Nfft+Ng; % OFDM符号长度
Nbps = 2; % 2/4 对应 QPSK/16QAM
M = 2^Nbps;
Es = 1;
A = sqrt(3/2/(M-1)*Es); % QAM归一化因子
N = Nfft;
com_delay = Nofdm/2;
Nsym = 100;
rand('seed',1);
randn('seed',1);
for i=1:length(nSTOs)
nSTO= nSTOs(i);
CFO= CFOs(i);
x = []; % 初始化信号块
for m=1:Nsym % random bits generates
msgint=randi([0 M-1],1,N); %bits_generator(1,Nsym*N,Nbps)
Xf = A.*qammod(msgint,M,'UnitAveragePower',true);
xt = ifft(Xf,Nfft);
x_sym = add_CP(xt,Ng); %加CP
x = [x x_sym];
end
%*********************** 信道 ************************%
%%%%%在这里根据需求添加信道,先假设是没有信道
y = x; % 没有信道影响
sig_pow = y*y'/length(y); % sig_pow= mean(mean(y.*conj(y),2))
%%%%%频率偏移 + 符号定时偏移
y_CFO= add_CFO(y,CFO,Nfft); %加CFO
y_CFO_STO= add_STO(y_CFO,-nSTO); %加STO
v_ML=zeros(1,Ng);
v_Cl=zeros(1,Ng);
Mag_cor= 0;
Mag_dif= 0;
%%Add additive white gaussian noise
for iter=1:MaxIter
%%%%%%%%%%%加噪声
y_aw = awgn(y_CFO_STO,SNRdB,'measured');
%%%%%%%Symbol Timing Acqusition
[STO_cor,mag_cor]= STO_by_correlation(y_aw,Nfft,Ng,com_delay); %书中自带
[STO_cor_temp,mag_cor_temp]= STO_by_correlation_sim1(y_aw,Nfft,Ng,com_delay); %我自己编写
%%%%%经验证,以上两者函数结果一致
[STO_dif,mag_dif] = STO_by_difference(y_aw,Nfft,Ng,com_delay); %书中自带
[STO_dif_temp,mag_dif_temp] = STO_by_difference_sim1(y_aw,Nfft,Ng,com_delay); %我自己编写
%%%%%经验证,以上两者函数结果一致
v_ML(-STO_cor+Ng/2)= v_ML(-STO_cor+Ng/2)+1;
v_Cl(-STO_dif+Ng/2)= v_Cl(-STO_dif+Ng/2)+1;
Mag_cor= Mag_cor + mag_cor;
Mag_dif= Mag_dif + mag_dif;
end % End of for loop of iter
%%%%%%% Probability
v_ML_v_Cl= [v_ML; v_Cl]*(100/MaxIter);
figure(1+i-1);
set(gca,'fontsize',9);
% subplot(220+i)
bar(-Ng/2+1:Ng/2,v_ML_v_Cl');
hold on, grid on
str = sprintf('nSTO Estimation: nSTO=%d, CFO=%1.2f, SNR=%3d[dB]',nSTO,CFO,SNRdB);
title(str);
xlabel('Sample'), ylabel('Probability');
legend('ML','Classen');
axis([-Ng/2-1 Ng/2+1 0 100])
%%%%%%% Time metric
Mag_cor = Mag_cor/MaxIter;
[Mag_cor_max,ind_max] = max(Mag_cor);
nc= ind_max-1-com_delay;
Mag_dif = Mag_dif/MaxIter;
[Mag_dif_min,ind_min] = min(Mag_dif);
nd= ind_min-1-com_delay;
nn= -Nofdm/2 + [0:length(Mag_cor)-1];
nt= nSTO;
% figure(2);
% subplot(220+i);
figure(5+i-1);
plot(nn,Mag_cor,nn,1.5*Mag_dif,'r:','markersize',1);
hold on
stem(nc,Mag_cor_max,'b','markersize',5);
stem(nSTO,Mag_cor(nSTO+com_delay+1),'k.','markersize',5); % Estimated/True Maximum value
str1 = sprintf('STO Estimation - ML(b-)/Classen(r:) for nSTO=%d, CFO=%1.2f',nSTO,CFO); %,SNRdB);
title(str1);
xlabel('Sample'), ylabel('Magnitude');
%stem(n1,Mag_dif_min,'r','markersize',5)
stem(nd,Mag_dif(nd+com_delay+1),'r','markersize',5);
stem(nSTO,Mag_dif(nSTO+com_delay+1),'k.','markersize',5); % Estimated/True Minimum value
set(gca,'fontsize',9, 'XLim',[-32 32], 'XTick',[-10 -3 0 2 10]); %, xlim([-50 50]),
end % End of for loop of i
图2 nSTO = -3,CFOs = 0时,基于相关性最大和基于差值最小的估计性能
图3 nSTO = -3,CFOs = 0.5时,基于相关性最大和基于差值最小的估计性能
图4 nSTO = 2,CFOs = 0时,基于相关性最大和基于差值最小的估计性能
图5 nSTO = 2,CFOs = 0.5时,基于相关性最大和基于差值最小的估计性能
运行上面的代码,有以下几点需要注意:
(1)原书中的STO_by_correlation和STO_by_difference不是很好理解,我自己写了一个,与之结果一样。
STO相关函数:
%%%%%%%%%%%%%%%%%%%%% STO相关函数 %%%%%%%%%%%%%%%%
%%%%%%%%%%%%%%%%%%%%% STO_by_correlation_sim1.m %%%%%%%%%%%%%
%%%%%%%%%%%%%%%%%%%%% date:2020年11月20日 author:飞蓬大将军 %%%%%%%%%%
%%%%%% 仿真环境
%软件版本:MATLAB R2019a
function [STO_est, Mag]=STO_by_correlation_sim1(y,Nfft,Ng,com_delay)
% STO estimation by maximizing the correlation between CP and rear part of OFDM symbol
% estimates STO by maximizing the correlation between CP (cyclic prefix)
% and rear part of OFDM symbol
% Input: y = Received OFDM signal including CP
% Ng = Number of samples in Guard Interval (CP)
% com_delay = Common delay
% Output: STO_est = STO estimate
% Mag = Correlation function trajectory varying with time
N_ofdm = Nfft+Ng;
if nargin<4
com_delay = N_ofdm/2;
end
yy = y(com_delay : com_delay+ Ng-1)*y(Nfft+com_delay : Nfft+com_delay+Ng-1)';
maximum = abs(yy);
for k = 1:N_ofdm
yy_temp = y(com_delay+k : com_delay+k+Ng-1)*y( Nfft+com_delay+k : Nfft+com_delay+k+Ng-1)';%% 公式.(5.13)
Mag(k) = abs(yy_temp);
if abs(yy_temp) > maximum
maximum = abs(yy_temp);
STO_est = N_ofdm - com_delay - k + 1;
end
end
end
STO差值最小函数:
function [STO_est,Mag] = STO_by_difference_sim1(y,Nfft,Ng,com_delay)
% STO estimation by minimizing the difference between CP and rear part of OFDM symbol
% estimates STO by minimizing the difference between CP (cyclic prefix)
% and rear part of OFDM symbol
% Input: y = Received OFDM signal including CP
% Ng = Number of samples in CP (Guard Interval)
% com_delay = Common delay
% Output: STO_est = STO estimate
% Mag = Correlation function trajectory varying with time
N_ofdm = Nfft+Ng;
minimum = 100;
STO_est = 0;
if nargin<4
com_delay = N_ofdm/2;
end
temp = abs(y(com_delay : com_delay + Ng-1)) - abs(y(com_delay+Nfft : com_delay + Ng-1 +Nfft));
minimum = temp*temp'; % 公式.(5.12)
for k = 1:N_ofdm
temp = abs(y(com_delay + k : com_delay + k + Ng-1)) - abs(y(com_delay+Nfft+k : com_delay + Ng-1 +Nfft+k));
Mag(k) = temp*temp';
if Mag(k)<minimum
minimum = Mag(k);
STO_est = N_ofdm - com_delay - k + 1;
end
end
end
(2)噪声考虑的是接收机热噪声,并没有考虑信道对信号的影响。
因此,你可以根据自己实验内容所需,对其添加信道,比如瑞利信道、莱斯信道等,便可以衡量出不同STO技术在相应信道下的估计性能了。
(3)实验中加入了STO和CFO,因此是在CFO存在的时候来估计STO,不同算法表现的性能从图中可看出稍有不同。
四、总结
同步的内容在本科的课程中讲的非常少,一般就只会介绍下载波同步、位同步的概念,这导致许多同学在脑海中觉得同步是非常容易实现,甚至觉得同步就是很“默认”的一个步骤。
然而同步其实是通信过程中最难的内容,这直接决定了后面的解调和译码是否能够正确运行。
从这篇文章中,我们知道STO和CFO对OFDM系统的影响。下一讲,将集中在CFO的内容。
欢迎你点赞、收藏、转发和分享,关注我的知乎号,也欢迎读者朋友就相关技术问题与我交流,一起学习,共同进步。请你也别忘了把这篇文章分享给你身边正在学习通信专业的同学们,也许能够帮到Ta。
这是《陈老湿·通信MATLAB仿真》的第8章,期待下次更新见!