基于OFDM+64QAM系统的载波同步matlab仿真,输出误码率,星座图,鉴相器,锁相环频率响应以及NCO等

发布时间 2023-10-26 23:46:30作者: 简简单单做算法

1.算法运行效果图预览

 

 

 

 

2.算法运行软件版本

MATLAB2022a

 

3.算法理论概述

        正交频分复用(OFDM)是一种在现代通信系统中广泛使用的调制技术,它具有高效的频谱利用和抗多径衰落等特点。64QAM(64-ary Quadrature Amplitude Modulation)是一种调制方式,可以在每个符号中传输更多的位信息。在OFDM系统中,保持载波同步对确保数据传输的可靠性至关重要。

 

3.1 OFDM原理

      OFDM将高速数据流划分为多个较低速的子载波,这些子载波之间互相正交,从而降低了子载波之间的干扰。每个子载波可以独立地调制和解调,提高了抗多径衰落和频率偏移的能力。

 

3.2 64QAM调制

     64QAM是一种高阶调制方式,每个符号可以传输6个比特(2^6=6426=64种可能的组合)。每个符号的相位和幅度有64种可能的组合,使得64QAM适合传输更多的信息,但也对信号质量要求更高。

 

3.3 载波同步

       在OFDM系统中,准确的载波同步是至关重要的。载波同步包括两个方面:频率同步和相位同步。频率同步旨在校准发送端和接收端的本地振荡器,以消除频率偏移。相位同步则调整接收信号的相位,以最大化解调性能。

 

4.部分核心程序

for ij=1:Nframe      
    [sj,ij]
    %64个符号的训练序列
    msg1          = round(63*rand(64,1));
    msg2          = repmat(msg1,2,1); 
    msg2_64QAM    = qammod(msg2,Morder);
     
    dataPre       = round(63*rand(36,1));  
    dataPre_64QAM = qammod(dataPre,Morder);  
    %数据   
    signal        = round(63*rand(nsym-2*64-36,1));      
    signal_64QAM  = qammod(signal,Morder);
  
    Tx_din        = [dataPre;msg2;signal];
    Tx_bin        = de2bi(Tx_din,6,'left-msb');
    Tx_bin2       = Tx_bin.';
    %发送数据的二进制数
    Tx_bin3       = reshape(Tx_bin2,[],1);   
 
    dataTxSig     =[dataPre_64QAM;msg2_64QAM;signal_64QAM];
    dataTx        = dataTxSig.*Carrier.';
..............................................................................   
        %积分滤波器
        PLL_Phase_Part(i)= Discriminator(i)*C1;
        PLL_Freq_Part(i) = Discriminator(i-1)*C2+PLL_Freq_Part(i-1);
        Freq_Control(i)  = PLL_Phase_Part(i)+PLL_Freq_Part(i);
        NCO_Phase(i)     = NCO_Phase(i-1)+Freq_Control(i-1);
        fre(i)           = NCO_Phase(i)/(2*pi*i)*fs;
        %平滑处理
        if i-len<=99
           Discriminator2(i) = mean(Discriminator(len+1:i));                
           fre2(i)           = mean(fre(len+1:i));
        else
           Discriminator2(i) = mean(Discriminator(i-99:i));
           fre2(i)           = mean(fre(i-99:i));
        end
    end         
   
    
 
if (sj==12 | sj==15)& ij==1
 
figure    
subplot(2,2,1)
plot(fre2(len+1:nsym)); 
grid on;
title('锁相环频率响应');
 
subplot(2,2,2)
plot(NCO_Phase(len+1:nsym)); 
grid on;
title('NCO输出相位');
 
subplot(2,2,3)
plot(Discriminator2(len+1:nsym));  
title('鉴相器输出');  
grid on;
 
 
subplot(2,2,4)
plot(dataPhaEst(2000:end),'b*');  
title('锁相环之前星座图');   
grid on;
 
figure
plot(Signal_PLL(2000:end),'r.');  
title('锁相环之后星座图');   
grid on; 
 
end
  
s_pll=Signal_PLL; 
dRx2=qamdemod(s_pll,Morder);
dRx1=reshape(dRx2,[],1);
dRx_bit1=de2bi(dRx1,6,'left-msb'); 
dRx_bit2=dRx_bit1.';
dRxbit=reshape(dRx_bit2,[],1);
 
for m=(1200+1):nsym 
    if dRxbit(m)~=Tx_bin3(m)  
       err_bit(ij)=err_bit(ij)+1;       
    end                         
end                                    
end                                
sum_bit_err=sum(err_bit);
BER(sj)=sum_bit_err/(Nframe*(4*nsym-300*4));
end
figure;
semilogy(SNRss,BER,'b-o');
grid on
xlabel('SNR');
ylabel('error');