第8章(2)内容如下:
OFDM同步技术主要内容如下:
上一讲主要介绍了OFDM同步技术中的符号定时偏差(STO)相关问题,这一讲集中在载波频率偏差(CFO)问题。
一、CFO的基本介绍及影响
前面的文章已经多次提过,载波频率偏差主要来自两个方面:
(1)收发端本振频率有偏差;
(2)多普勒频移;
先定义归一化的CFO为CFO与子载波的间隔比值,即 ε = f o f f s e t Δ f \varepsilon = \frac{{{f_{offset}}}}{{\Delta f}} ε=Δffoffset 。
思考一下?为什么要定义归一化 ε \varepsilon ε ?
为帮助你理解,我拿DMB举例, ε = f o f f s e t Δ f = υ f c Δ f c = 120 3.6 × 375 × 10 6 1 × 10 3 × 3 × 10 8 = 0.042 \varepsilon = \frac{{{f_{offset}}}}{{\Delta f}} = \frac{{\upsilon {f_c}}}{{\Delta fc}} = \frac{{\frac{{120}}{{3.6}} \times 375 \times {{10}^6}}}{{1 \times {{10}^3} \times 3 \times {{10}^8}}} = 0.042 ε=Δffoffset=Δfcυfc=1×103×3×1083.6120×375×106=0.042
表格中使用“最大多普勒频率”这个词,是因为一般还有一个cos(theta)函数值的影响,theta是用户相对于基站移动速度的夹角,因此会用“最大”二字放在前面。
先复习一下信号与系统课程中常用的傅立叶变换对:
注意到CFO对接收信号的影响:
联系到STO对接收信号的影响,你是否有没有把CFO对接收信号的影响和STO对接收信号的影响这两者搞混呢?
建议多看几遍表5.3和5.1中的内容,我一开始也很懵逼。
继续看《MIMO-OFDM无线通信技术及MATLAB实现》第5章的内容:
由于QPSK是相位调制,在进行解调时是以相位作为判决条件。而由于CFO的影响,结合上面的相位差(即图5.5右边的三幅图),若相位差超过 π \pi π ,结果就会引起相位模糊,导致判决出错。
严格来说,若相位差超过 π \pi π/4就有可能判决出错,这取决于接收端的解调方式了。(想想为什么?对照星座图可以理解。)
接下来介绍IFO和FFO的概念,这和符号定时偏差的内容有很大不同。
注意接收机这端是N点FFT,而不是IFFT。
(不过,用FFT也可以实现IFFT,用IFFT也可以实现FFT,本质上没有多大区别,思考下为什么?数字信号处理课本上一般有这段内容)
图片中提到“子载波频率分量之间的正交性没有被破坏,因此没有出现ICI”,这怎么理解呢?
回到IFFT(IDFT的表达式):
x [ n ] = ∑ k = 0 N − 1 X [ k ] e j 2 π k n / N , n = 0 , 1 ⋯ , N − 1 x\left[ n \right] = \sum\limits_{k = 0}^{N - 1} {X\left[ k \right]{e^{j2\pi kn/N}}} ,n = 0,1 \cdots ,N - 1 x[n]=k=0∑N−1X[k]ej2πkn/N,n=0,1⋯,N−1
即 2 π k / N {2\pi k/N} 2πk/N ,当k=0,1…N-1,这些频率之间是相互正交的。
相应的,由于 ε i {\varepsilon _i} εi 是整数,所以 2 π ( k + ε i ) / N 2\pi \left( {k{\rm{ + }}{\varepsilon _i}} \right)/N 2π(k+εi)/N ,各子载波分量,当然也是保持正交的。
上面的(5.8)和(5.9)运算起来有点小复杂,你可以直接跳过该部分内容看下面这图,来理解FFO对星座图的影响。
二、CFO的估计技术
上面已经讲过了CFO的定义和影响,为了保证OFDM系统性能,接收机必须估计出CFO的大小,然后进行补偿,为后面的正确解调做准备。
CFO的估计技术也可以在时域或者频域进行,时域可利用CP或者训练符号进行CFO估计。
1、基于CP的CFO估计技术
在这里解释一下为什么是 ε ^ = 1 2 π arg { ∑ n = − N G − 1 y l ∗ [ n ] y l [ n + N ] } \hat{\varepsilon}=\frac{1}{2 \pi} \arg \left\{\sum_{n=-N_{\mathrm{G}}}^{-1} y_{l}^{*}[n] y_{l}[n+N]\right\} ε^=2π1arg{∑n=−NG−1yl∗[n]yl[n+N]} ,
令 y l [ n ] = A e j θ 1 {y_l}\left[ n \right] = A{e^{j{\theta _1}}} yl[n]=Aejθ1 , y l [ n + N ] = B e j θ 2 {y_l}\left[ {n + N} \right] = B{e^{j{\theta _2}}} yl[n+N]=Bejθ2
则 y l ∗ [ n ] y l [ n + N ] = A e − j θ 1 B e j θ 2 = C e j ( θ 2 − θ 1 ) = C e j 2 π ε y_l^*\left[ n \right]{y_l}\left[ {n + N} \right] = A{e^{ - j{\theta _1}}}B{e^{j{\theta _2}}} = C{e^{j\left( {{\theta _2} - {\theta _1}} \right)}} = C{e^{j2\pi \varepsilon }} yl∗[n]yl[n+N]=Ae−jθ1Bejθ2=Cej(θ2−θ1)=Cej2πε ,
这样的思路在CFO的估计中会很常见。
2、基于训练信号的CFO估计技术
(1)频域梳状信号可以参考导频结构相关知识:第7章:OFDM 信道估计与均衡(4)
(2)为方便理解公式(5.26)(5.27),我举一个例子,假设N=32,D=4,即做32点FFT,则32/4=8。
Am不妨就取2进制的数,0或1。
ε ∧ = 4 2 π arg { ∑ n = 0 7 y l ∗ [ n ] y l [ n + 8 ] } = 4 2 π arg { y l ∗ [ 0 ] y l [ 8 ] + y l ∗ [ 1 ] y l [ 9 ] … + y l ∗ [ 7 ] y l [ 15 ] } \mathop \varepsilon \limits^ \wedge = \frac{4}{{2\pi }}\arg \left\{ {\sum\limits_{n = 0}^7 {y_l^*\left[ n \right]{y_l}\left[ {n + 8} \right]} } \right\} = \frac{4}{{2\pi }}\arg \left\{ {y_l^*\left[ 0 \right]{y_l}\left[ 8 \right] + y_l^*\left[ 1 \right]{y_l}\left[ 9 \right] \ldots + y_l^*\left[ 7 \right]{y_l}\left[ {15} \right]} \right\} ε∧=2π4arg{n=0∑7yl∗[n]yl[n+8]}=2π4arg{yl∗[0]yl[8]+yl∗[1]yl[9]…+yl∗[7]yl[15]}
以 y l ∗ [ 0 ] y l [ 8 ] = 2 π × ε N × N D y_l^*\left[ 0 \right]{y_l}\left[ 8 \right] = 2\pi \times \frac{\varepsilon }{N} \times \frac{N}{D} yl∗[0]yl[8]=2π×Nε×DN 为例, 则 ε ∧ = 4 2 π y l ∗ [ 0 ] y l [ 8 ] \mathop \varepsilon \limits^ \wedge = \frac{4}{{2\pi }}y_l^*\left[ 0 \right]{y_l}\left[ 8 \right] ε∧=2π4yl∗[0]yl[8] ,也即上面这个式子得证了。
根据(5.27)后的那句话,这种技术能够估计出的CFO的范围是 ∣ ε ∣ ≤ 2 \left| \varepsilon \right| \le 2 ∣ε∣≤2 。
在频域CFO技术中的Moose方法,要求发射两个相同的训练符号,且这个两个训练符号中不能传输数据符号。
(在代码实现中也将看到,前两个OFDM符号只含有导频数据经过IFFT的时域信号+相应的CP,不包含传输数据符号,从第三个OFDM符号开始才有数据符号进行传输)。
三、CFO估计技术的可运行MATLAB代码及其注意点
下面将实现三种CFO的估计方法,基于CP的方法、频域的Moose/Classen方法。
%%%%%%%%%%%%%%%%%%%%% 基于CP的CFO(载波频偏估计) %%%%%%%%%%%%%%%%
%%%%%%%%%%%%%%%%%%%%% CFO_estimation_sim1.m %%%%%%%%%%%%%
%%%%%%%%%%%%%%%%%%%%% date:2020年12月14日 author:飞蓬大将军 %%%%%%%%%%
%%%%%%%%%%%%%%%%%程序说明
%%%完成时域基于CP的方法和频域的Moose/Classen方法,用于后续CFO补偿
%%%%%% 仿真环境
%软件版本:MATLAB R2019a
clear, clf
CFO = 0.15;
% CFO = 0;
Nfft=128; % FFT size
Nbps=2;
M=2^Nbps; % Number of bits per (modulated) symbol
Es=1;
A=sqrt(3/2/(M-1)*Es); % Signal energy and QAM normalization factor
N=Nfft;
Ng=Nfft/4;
Nofdm=Nfft+Ng;
Nsym=3;
% h=complex(randn,randn)/sqrt(2);
% %h=[1 zeros(1,5)];
% channel(h,0);
%Transmit signal
x=[];
for m=1:Nsym
msgint=randi([0 M-1],1,N); %bits_generator(1,Nsym*N,Nbps)
if m<=2
Xp = add_pilot(zeros(1,Nfft),Nfft,4);
Xf=Xp; % add_pilot
else %Xf= QAM(msgint((i-1)*N+1:i*N),Nbps); % constellation mapping. average power=1
Xf = A.*qammod(msgint,M,'UnitAveragePower',true);
end
xt = ifft(Xf,Nfft);
x_sym = add_CP(xt,Ng);
x= [x x_sym];
end
%************************* 信道 **************
%channel 可添加所需信道
y=x; % No channel effect
%Signal power calculation
sig_pow= y*y'/length(y); % Signal power calculation
%%%%
SNRdBs= 0:3:30;
% SNRdBs= 100; 设100是为调试程序
MaxIter = 100;
for i=1:length(SNRdBs)
SNRdB = SNRdBs(i);
MSE_CFO_CP = 0;
MSE_CFO_Moose = 0;
MSE_CFO_Classen = 0;
rand('seed',1);
randn('seed',1); % Initialize seed for random number generator
y_CFO= add_CFO(y,CFO,Nfft); % Add CFO
%%%%多次迭代取平均
for iter=1:MaxIter
%y_aw=add_AWGN(y_CFO,sig_pow,SNRdB,'SNR',Nbps); % AWGN added, signal power=1
y_aw = awgn(y_CFO,SNRdB,'measured'); % AWGN added, signal power=1
Est_CFO_CP = CFO_CP(y_aw,Nfft,Ng); % CP-based
MSE_CFO_CP = MSE_CFO_CP + (Est_CFO_CP-CFO)^2;
Est_CFO_Moose = CFO_Moose(y_aw,Nfft); % Moose (based on two consecutive preambles)
MSE_CFO_Moose = MSE_CFO_Moose + (Est_CFO_Moose-CFO)^2;
Est_CFO_Classen = CFO_Classen(y_aw,Nfft,Ng,Xp); % Classen (Pilot-based)
MSE_CFO_Classen = MSE_CFO_Classen + (Est_CFO_Classen-CFO)^2;
end % the end of for (iter) loop
MSE_CP(i) = MSE_CFO_CP/MaxIter;
MSE_Moose(i) = MSE_CFO_Moose/MaxIter;
MSE_Classen(i) = MSE_CFO_Classen/MaxIter;
end%ebn0 end
semilogy(SNRdBs, MSE_CP,'-+');
grid on, hold on
semilogy(SNRdBs, MSE_Moose,'-x'); semilogy(SNRdBs, MSE_Classen,'-*');
xlabel('SNR[dB]'), ylabel('MSE'); title('CFO Estimation'); %axis([0 30 10e-8 10e-2])
% str=sprintf('CFO = %1.2f',CFO);
legend('CP-based technique','Moose (Preamble-based)','Classen (Pilot-based)');
% legend(str);
%%********************* 实验结果 *************
%%%记录在CFO_fig1,对比了不同算法的CFO估计结果
%%%2020年12月14日 程序运行正确
%%%成功估计CFO小数部分,CFO估计后续再考虑
完整代码下载地址是:
https://github.com/123kevin456/OFDM–STO-CFOgithub.com
若缺少相应子函数,可在原书代码中照到相应子函数即可。
运行上面的代码,有以下几点需要注意:
(1)运行代码,可以比较不同算法估计CFO,和真实的CFO进行比较,估计的优劣采用均方误差进行衡量。
(2)噪声考虑的是接收机热噪声,并没有考虑信道对信号的影响。
因此,你可以根据自己实验内容所需,对其添加信道,比如瑞利信道、莱斯信道等,便可以衡量出不同STO技术在相应信道下的估计性能了。
(3)整数倍的CFO估计问题还未完成;
(4)估计出来的CFO与真实的CFO在数值上相差不大,说明估计性能还不错。
后续的频偏补偿,解调等过程没有进行。你可以根据需要,画出在残留频偏下的误码率曲线图,便可观察残留频偏对误码率的影响了。
四、总结
至此,OFDM两大同步问题均已讲完。下一章,将更新OFDM的PAPR,即峰均比相关问题。
欢迎你双击屏幕、点赞、收藏、转发和分享,关注我的知乎号,也欢迎读者朋友就相关技术问题与我交流,一起学习,共同进步。请你也别忘了把这篇文章分享给你身边正在学习通信专业的同学们,也许能够帮到Ta。
这是《陈老湿·通信MATLAB仿真》的第8章,期待下次更新见!