无线通信与编码_MATLAB实现OFDM载波频偏估计_含仿真代码

为了解决频率选择性衰落信道引起的失真,OFDM系统在正交子载波上并行传输消息数据。然而,只有正交性得到保持时,OFDM才能够发挥其优势,在正交性得不到保持的情况下,系统会因为ISI和ICI而下降。

总的来说,与载波信号相关的畸变有两种。一种是由发射机和接收机的载波信号发生器不稳定而引起的相位噪声,可以将其建模为一个零均值的维纳随机过程。另一种是由多普勒频移所引起的载波频率偏移。(尽管我们想在发射机和接收机之间产生相同频率的载波,但是载波频率会因振荡器固有的物理特性的不同而难保持一致)

%OFDM基于循环前缀/训练序列/导频的载波频偏估计
clc;clear
CFO = 0.1;                      %归一化频偏
N_fft=128;                      %FFT的点数
N_bps=2;                        %调制阶数
M=2^N_bps;  
Es=1; 
A=sqrt(3/2/(M-1)*Es);           %信号幅度,QAM归一化因子
N=N_fft;
Ng=N_fft/4;                     %循环前缀或保护间隔长度
Nofdm=N_fft+Ng;                 %一个OFDM符号长度
Nsym=3;
h=complex(randn,randn)/sqrt(2); %信道冲击响应 

%% 发送信号
x=[];
for m=1:Nsym
   msgint=randi([0,M-1],1,N);
   if m<=2  %加导频
       Xp = add_pilot(zeros(1,N_fft),N_fft,4);
       Xf=Xp;
       %发射的前两个相同的训练符号不能包含数据符号   
   else 
      %mod_object = qammod('M',M, 'SymbolOrder','gray');%4QAM正交幅度调制
      Xf = (A* qammod(msgint,M));
   end                        
   xt = ifft(Xf,N_fft);  
   x_sym = add_CP(xt,Ng);%四分之一
   x= [x x_sym];
end   
y=x;  %没有信道影响
sig_pow= y*y'/length(y);  %计算信号功率
SNRdBs= 0:3:30;  
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); %官方推荐使用rng(1),seed等词对于随机数生成器来说是一种误导
   randn('seed',1);
   y_CFO= add_CFO(y,CFO,N_fft);%添加CFO
   for iter=1:MaxIter
      y_aw = awgn(y_CFO,SNRdB,'measured'); %AWGN
      Est_CFO_CP = CFO_CP(y_aw,N_fft,Ng);  %基于CP的载波频偏估计
      MSE_CFO_CP = MSE_CFO_CP + (Est_CFO_CP-CFO)^2;
      Est_CFO_Moose = CFO_Moose(y_aw,N_fft); %Moose
      MSE_CFO_Moose = MSE_CFO_Moose + (Est_CFO_Moose-CFO)^2;
      Est_CFO_Classen = CFO_Classen(y_aw,N_fft,Ng,Xp);  %Classen
      MSE_CFO_Classen = MSE_CFO_Classen + (Est_CFO_Classen-CFO)^2;
   end
   MSE_CP(i)=MSE_CFO_CP/MaxIter; 
   MSE_Moose(i)=MSE_CFO_Moose/MaxIter; 
   MSE_Classen(i)=MSE_CFO_Classen/MaxIter;
end

semilogy(SNRdBs, MSE_CP,'-*');grid on;hold on
semilogy(SNRdBs, MSE_Moose,'-x')
semilogy(SNRdBs, MSE_Classen,'g-+')
xlabel('SNR[dB]'), ylabel('MSE'); 
title('载波频偏估计'); 
legend('基于循环前缀','Moose (基于训练序列)','Classen (基于导频)');

运行结果:
OFDM载波频偏估计

function xp=add_pilot(x,Nfft,Nps)  %add_pilot.m
%生成和插入导频序列
%恒定幅度零自相关序列
if nargin<3
    Nps=4; %导频间隔
end
Np=Nfft/Nps;  %导频数
xp=x; %准备OFDM信号(包括导频信号)
for k=1:Np
   xp((k-1)*Nps+1)= exp(1i*pi*(k-1)^2/Np);  % Np是偶数
   %xp((k-1)*Nps+1)= exp(j*pi*(k-1)*k/Np);  % Np是奇数
end
end
%------------------------------------------------------------------

function CFO_est=CFO_CP(y,Nfft,Ng)  %CFO_CP.m
%基于CP的时域CFO估计

nn=1:Ng; 
CFO_est = angle(y(nn+Nfft)*y(nn)')/(2*pi);  
%| |<0.5不能用于估计整数CFO
end
%-----------------------------------------------------------------

function CFO_est=CFO_Moose(y,Nfft)  %CFO_Moose.m
%基于Moose的频域CFO估计 

for i=0:1   
   Y(i+1,:)= fft(y(Nfft*i+1:Nfft*(i+1)),Nfft);
end
CFO_est = angle(Y(2,:)*Y(1,:)')/(2*pi);
end
%-----------------------------------------------------------------

function CFO_est=CFO_Classen(yp,Nfft,Ng,Nps)  %CFO_Classen.m
%利用Classen的频域CFO估计

if length(Nps)==1
    Xp=add_pilot(zeros(1,Nfft),Nfft,Nps); %导频信号
else
    Xp=Nps; %如果NPs是一个矩阵,那么Xp是导频序列
end
Nofdm=Nfft+Ng; 
kk=find(Xp~=0); 
Xp=Xp(kk); %提取导频
for i=1:2 
   yp_without_CP = remove_CP(yp(1+Nofdm*(i-1):Nofdm*i),Ng);%调用remove_CP函数
   Yp(i,:) = fft(yp_without_CP,Nfft);
end
CFO_est = angle(Yp(2,kk).*Xp*(Yp(1,kk).*Xp)')/(2*pi)*Nfft/Nofdm; 
end
%------------------------------------------------------------------

function y=add_CP(x,Ncp)  %add_CP.m
%基于CP的时域
    y = [x(:,end-Ncp+1:end) x];
end  %26行调用 x_sym = add_CP(xt,N_g)
%------------------------------------------------------------------

function y=remove_CP(x,Ncp,Noff)  %remove_CP.m  去除循环前缀
if nargin<3
    Noff=0; 
end
y=x(:,Ncp+1-Noff:end-Noff);
end
%------------------------------------------------------------------

function y_CFO=add_CFO(y,CFO,Nfft)  %add_CFO.m
% To add an arbitrary frequency offset
% Input: y    = Time-domain received signal
%        dCFO = FFO (fractional CFO) + IFO (integral CFO)
%        Nfft = FFT size;

nn=0:length(y)-1; 
y_CFO = y.*exp(j*2*pi*CFO*nn/Nfft);
end
%==================================================================
评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

SmallC1oud

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值