m基于Costas环的QPSK载波同步matlab性能仿真,对比不同环路系数等对载波同步的影响

发布时间 2023-07-21 23:32:38作者: 我爱C编程

1.算法仿真效果

matlab2022a仿真结果如下:

 

 

 

 

 

 

 

2.算法涉及理论知识概要

        在数字通信中,载波同步是保证正常数据传输的重要环节之一。Costas环是一种常用的基于相位差检测的载波同步方法,适用于QPSK调制信号的同步。本文将介绍基于Costas环的QPSK载波同步方法,并比较不同环路系数对载波同步的影响。

 

      载波同步是相干解调的基础,不管对于模拟通信还是数字通信来说,只要是相干解调,接收端都必须提供同频同相的载波。当然,若采用基带传输,此时便没有载波同步的问题,因为没有频带调制,即没有乘以载波进行频谱搬移的过程。

 

 

 

 

 

2.3、不同环路系数对载波同步的影响

       在实际应用中,选择合适的环路系数对于保证载波同步的稳定性和精度非常重要。一般来说,比例增益 $K_p$ 决定了载波同步的响应速度,积分增益 $K_i$ 决定了载波同步的稳定性。在本文中,我们将分别比较不同的 $K_p$ $K_i$ 值对于载波同步的影响。在实验中,我们将QPSK调制信号传输至接收端,通过基于Costas环的QPSK载波同步方法实现载波同步,并记录不同 $K_p$ $K_i$ 值下的误差向量幅度和相位误差。

 

3.MATLAB核心程序

 

SNRS = [2:2:16];
 
for SNR_DB = SNRS
    SNR_DB
     % SNR_DB = 4
     rece = awgn(send,SNR_DB,'measured');  %接受端的信号,加载指定的snr
     %rece = send;
     %锁相环参数预设
     Discriminator_Out=zeros(carlen * nsamp,1);
     Freq_Control=zeros(carlen * nsamp,1);
     PLL_Phase_Part=zeros(carlen * nsamp,1);   %锁相环频率
     PLL_Freq_Part=zeros(carlen * nsamp,1);    %锁相环相位
     WC_frame = zeros(1,carlen * nsamp);       
     NCO_Phase = 0;
 
............................................................................
         end
     end
 
    
    %判断同步头,信号是否出现了反相,及时调整
    num1 = symerr(sign(I_D(comps1:compf1)) , sign(dataoutI(comps1:compf1)));
    num2 = symerr(sign(I_D(comps1:compf1)) , -sign(dataoutI(comps1:compf1)));
    num3 = symerr(sign(I_D(comps1:compf1)) , sign(dataoutQ(comps1:compf1)));
    num4 = symerr(sign(I_D(comps1:compf1)) , -sign(dataoutQ(comps1:compf1)));
    numI = [num1,num2,num3,num4];
    num = min(numI)
 
    if num1 == num
        dataout_I = dataoutI;
    elseif num2 == num
        dataout_I = -dataoutI;
    elseif  num3 == num
        dataout_I = dataoutQ;
    else
        dataout_I = -dataoutQ;
    end
 
    num1 = symerr(sign(Q_D(comps2:compf2)) , sign(dataoutQ(comps2:compf2)));
    num2 = symerr(sign(Q_D(comps2:compf2)) , -sign(dataoutQ(comps2:compf2)));
    num3 = symerr(sign(Q_D(comps2:compf2)) , sign(dataoutI(comps2:compf2)));
    num4 = symerr(sign(Q_D(comps2:compf2)) , -sign(dataoutI(comps2:compf2)));
    numQ = [num1,num2,num3,num4];
    num = min(numQ)
 
    if num1 == num
        dataout_Q = dataoutQ;
    elseif num2 == num
        dataout_Q = -dataoutQ;
    elseif  num3 == num
        dataout_Q = dataoutI;
    else
        dataout_Q = -dataoutI;
    end