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

78 阅读3分钟

1.算法运行效果图预览

8c8b631bb3555503e1687e5288eb1972_82780907_202310262338250064170671_Expires=1698335305&Signature=%2Ba%2FNh%2Bn9cXDE7W7sNFZZaptIiUk%3D&domain=8.jpeg   c47499865575565b1c4e7bad3d5cc594_82780907_202310262338250141892559_Expires=1698335305&Signature=NCh%2FOA7OCuKzobDiASnjvEO3il0%3D&domain=8.jpeg

993408bc7cb9f9f4f8dd0ff85758e80e_82780907_202310262338250094221536_Expires=1698335305&Signature=cUfu%2BBeTNH0iACnAwitzOl3euIs%3D&domain=8.jpeg 2.算法运行软件版本

MATLAB2022a

 

3.算法理论概述

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

 

3.1 OFDM原理

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

acaf3f8c26686c6b2f6849f6ea6285a7_82780907_202310262340240094826623_Expires=1698335424&Signature=X4KjVfM3OLRdWSRsmb8DruNkw1E%3D&domain=8.png  

3.2 64QAM调制

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

ff5336948b33eaed7bce2f9a1f829b5f_82780907_202310262341110360774922_Expires=1698335471&Signature=21t%2F%2BEbyVnfqmnkWi2EKWPegQgs%3D&domain=8.png  

3.3 载波同步

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

bbbfa4c872b706eb937e9f3e7765b6e3_82780907_202310262341460797988049_Expires=1698335506&Signature=bwO%2FXLVmzYDW3kyPUOUkXIsWkfA%3D&domain=8.png  

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(63rand(nsym-264-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)/(2pii)*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*(4nsym-3004));

end

figure;

semilogy(SNRss,BER,'b-o');

grid on

xlabel('SNR');

ylabel('error');`