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

目录

1.算法仿真效果

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

2.1、Costas环的原理

2.2、QPSK载波同步方法

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

3.MATLAB核心程序

4.完整算法代码文件


1.算法仿真效果

matlab2022a仿真结果如下:

 

 

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

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

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

2.1、Costas环的原理

       Costas环是一种基于相位差检测的载波同步方法。其原理是利用两个正交的本振信号对接收信号进行相位差检测,从而实现载波同步。Costas环包括两个部分:相位检测器和环路滤波器。相位检测器的作用是计算接收信号和本振信号之间的相位差。常用的相位检测器有乘法相位检测器和Foster-Seeley相位检测器等。我们使用乘法相位检测器。设接收信号为 $r(t)$,本振信号为 $c(t)$,相位差为 $\Delta\phi(t)$,则相位检测器的输出信号为:

$$
e(t)=\mathrm{Re}\left{r(t)c^*(t)\right}\cdot\Delta\phi(t)
$$

其中,$^*$ 表示复共轭。

       环路滤波器的作用是对相位检测器的输出信号进行滤波,去除噪声和高频分量,从而得到稳定的载波同步信号。常用的环路滤波器有一阶低通滤波器和二阶低通滤波器等。在本文中,我们使用一阶低通滤波器。设相位检测器的输出为 $e(t)$,环路滤波器的输出为 $v(t)$,则环路滤波器的差分方程为:

$$
v(kT)=v((k-1)T)+2\pi K_pTe(kT)-2\pi K_iv((k-1)T)
$$

其中,$T$ 表示采样间隔,$K_p$ 和 $K_i$ 分别表示比例增益和积分增益,$k$ 表示采样时刻。

2.2、QPSK载波同步方法

       QPSK调制是一种基于相位和幅度的数字调制方式,将两个正交载波的相位和幅度分别表示为四个符号,每个符号表示两个比特。QPSK调制信号的载波同步方法可以使用Costas环实现。QPSK信号的接收信号可以表示为:

$$
r(t)=a(t)\cos(2\pi f_ct+\phi(t))+b(t)\sin(2\pi f_ct+\phi(t))
$$

其中,$a(t)$ 和 $b(t)$ 分别表示两个正交载波的幅度,$\phi(t)$ 表示相位偏差,$f_c$ 表示载波频率。

QPSK信号的本振信号可以表示为:

$$
c(t)=\cos(2\pi f_ct)+j\sin(2\pi f_ct)
$$

其中,$j$ 表示虚数单位。

QPSK信号的相位检测器输出为:

$$
e(t)=\mathrm{Re}\left{r(t)c^*(t)\right}=\frac{1}{2}a(t)\cos\phi(t)-\frac{1}{2}b(t)\sin\phi(t)
$$

QPSK信号的环路滤波器的差分方程为:

$$
v(kT)=v((k-1)T)+2\pi K_pTe(kT)-2\pi K_iv((k-1)T)
$$

QPSK信号的载波频率可以通过相位检测器的输出进行估计,即:

$$
\hat{f}_c=\frac{K_p}{2\pi K_i}
$$

QPSK信号的相位偏差可以通过环路滤波器的输出进行修正,即:

$$
\hat{\phi}(t)=\phi(t)-\frac{v(t)}{2\pi K_p}
$$

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
 
    
     %进入gardner环的信号
     datarcosI = dataout_I(9:end) ;
     datarcosQ = dataout_Q(9:end) ;

 

     %统计误码率
     in = dataI';
     out = sign(datarcosI(1: 4:end));
     [num2,rt2]= symerr(out(3001:end-5),in(3001:end));
     num2
     ratio(1,tp) =  rt2;

     in = dataQ';
     out = sign(datarcosQ(1: 4:end));
     [num2,rt2]= symerr(out(3001:end-5),in(3001:end));
     num2
     ratio(1,tp) = ratio(1,tp) + rt2;

     tp = tp + 1;
end
 
 
errrate= ratio/2;

  
 %误码率图
 snr = SNRS;
 figure;
 semilogy(snr ,errrate,'-r>',...
    'LineWidth',1,...
    'MarkerSize',6,...
    'MarkerEdgeColor','k',...
    'MarkerFaceColor',[0.9,0.9,0.0]);
grid on;
 

 save R11.mat SNRS errrate
0X_004m

4.完整算法代码文件

V

  • 1
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

我爱C编程

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

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

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

打赏作者

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

抵扣说明:

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

余额充值