第4章:载波同步与锁相环仿真(1) 您所在的位置:网站首页 追踪器的原理是什么呢图片 第4章:载波同步与锁相环仿真(1)

第4章:载波同步与锁相环仿真(1)

2023-05-06 06:23| 来源: 网络整理| 查看: 265

错误更正

之前代码中出现了错误,现在已改成下面这个式子,运行正确。

Wn = 2*Bn/(damp+(1/(4*damp)));

本人最近搞懂了锁相环MATLAB仿真的一些知识,于是先更新第4章,之后更新第3章——信号捕获。

第4章(1)内容如下:

一、二阶锁相环的MATLAB代码实现

二、锁相环经典书籍与材料

三、锁相环基本原理介绍,各参数对二阶锁相环的性能影响

四、总结

第4章(2)内容将集中:

用二阶数字锁相环对有多普勒频偏和载波随机相位的psk信号进行相干解调

下面开始第(1)部分内容:

一、二阶锁相环的MATLAB代码实现

本科在学习通信原理的课程时,提到2PSK的相干解调,接收端需要一个和发送端同频同相的载波,才能进行相干解调。

书本上一般会考虑载波相位误差 \[\varphi \] 对相干解调性能的影响,会使得信噪比下降 \[{\cos ^2}\varphi \] 倍。(思考几秒钟,想下为什么?)

你可能会想了,接收端有没有什么办法能估计出这个误差相位 \[\varphi \],从而避免这种信噪比的损失呢?

激动人心的时刻,锁相环表示他要出场了。

对,锁相环就是这么一种神奇的电路,能够产生出一个与到达接收端信号同频同相的载波信号。

注意,在这里你需要区分发送信号到达接收端信号,这两者的频率和相位常常是不一样的。

这是为什么呢?

在无线通信,尤其是卫星通信中,是少不了多普勒频偏的。

奇怪的小问号来了,多普勒频偏是什么?

百度解释:多普勒频偏(Doppler Shift)是指当移动台以恒定的速率沿某一方向移动时,由于传播路程差的原因,会造成相位和频率的变化,通常将这种变化称为多普勒频偏。

通信协议中,会事先规定收发端的载波频率,比如发送端的载波频率是fc,若接收端采用相干解调,接收端的本原振荡器也会产生频率fc的载波。

上面我用的“到达接收端信号”这个词语,可能不是特别准确,我想表达的是接收端实际收到的信号,你结合多普勒频偏便可以理解了。

但是多普勒频偏 \[\Delta f\] 到底偏了多少?这个值,接收端是不知道的。

对于接收端来说,接收端认为收到的信号频率是 \[{f_c} + \Delta f\] 。此时若还想采用相干解调,依然需要同频同相的载波,便要把多普勒频偏 \[\Delta f\]估计出来。

那你可能忍不住会问了,接收机就是不纠正多普勒频偏会带来什么后果呢?(这问题我想了也特别久)

后果便是:星座图的旋转,这将对接收端的解调和判决造成非常大的困扰。

思考几秒钟,为什么?

一个复信号,对其乘以 \[{e^{j\Delta \theta }}\] ,对应到星座图上,是对这个星座图进行逆时针旋转 \[\theta \] ,而

\[\Delta \theta = 2pi\Delta ft\] ,随着时间的积累,星座图旋转的角度会越来越大,判决的时候若不将星座图顺时针旋转回来,判决便容易出错。

以QPSK为例,星座图将不是集中在4个点,而是随着时间不同,旋转角度不同,因此星座图会散。

那采用非相干解调,不就行了吗?

无论对于相干解调还是非相干解调都是要估计多普勒频偏的,原因同样是星座图的旋转。当然,这也与非相干解调算法的频偏容忍范围有关。非相干解调的MATLAB实现,我将在第六章解调算法中写。

既然上面已经说到了锁相环,我自己本科时候学习了《高频电子线路》课程,知道了模拟锁相环电路的工作原理,那到底在数字系统是如何实现锁相环的呢?

我在《数字锁相环的MATLAB实现》提供了初始版本的代码,后面我会将其应用于有多普勒频偏的2PSK相干解调

二、锁相环经典书籍与材料

在讲解锁相环MATLAB代码实现之前,我先列举一下我所知道的锁相环经典书籍:

1、Gardner的《锁相环技术》,英文名是《Phaselock Techniques》,锁相环领域世界权威级教科书

2、西电出版社,郑继禹、张厥盛的《锁相技术》

3、郑继禹的《同步理论与技术》

以上三本书我都没完整看过,但遇到问题时,常翻阅。接下来说说我看过的材料:

1、Tsui《Fundamentals of Global Positioning System Receivers》的第8章,中文版本的西电杨俊、武奇生《GPS基本原理及其仿真》第6章与前者内容将近一致。

2、CSDN上《二阶数字锁相环仿真(内附MATLAB代码)》,也是一份非常不错的材料。

3、杜勇的《锁相环技术原理及FPGA实现》,这书的写作形式是博客,娓娓道来,总是能把我心中想问的问号说出来,非常不错。

4、蔡凡博士的博士毕业论文《卫星定时接收机的关键技术研究》,知网上可以下载,关于捕获和跟踪的内容比较全,需慢慢消化。

以上材料中对锁相环的原理讲解不错,均缺少MATLAB代码实现。

我现在想通信问题,会常想怎么在代码中实现。结合蔡凡博士的微信公众号“通信工程师专辑”有MATLAB代码,我将思考明白的原理和代码讲解如下。

《Fundamentals of Global Positioning System Receivers》的第8章,锁相环电路包括三部分:鉴相器、环路滤波器和压控振荡器。

经典的锁相环时域和s域图如下:

图1 经典锁相环时域图

\[{\theta _i}\left( t \right)\] 表示输入信号, \[{\theta _f}\left( t \right)\] 表示压控振荡器的输出信号, \[\sum {} \] 表示鉴相器, \[{k_0}\] 是鉴相器增益,\[\varepsilon \left( t \right)\] 表示鉴相误差,所以有 \[\varepsilon \left( t \right) = {\theta _i}\left( t \right) - {\theta _f}\left( t \right)\] 吗?

在这里一定要注意的是,实际在用鉴相器时, \[\varepsilon \left( t \right)\] 是关于 \[{\theta _i}\left( t \right) - {\theta _f}\left( t \right)\] 这个相位差的函数,并不一定就等于相位差,这个要理解。

鉴相器的类型有很多种,之后结合代码讲解的时候会说到。

图2 经典锁相环的s域图

压控振荡器(VCO),顾名思义,是用电压来控制振荡器输出信号的相位,有:

\[{\omega _2}\left( t \right) = {\omega _0}\left( t \right) + {k_1}u\left( t \right)\] (1)

\[{\omega _0}\] 是压控振荡器的固有振荡角频率,即没有输入控制电压时振荡角频率。

\[{k_1}\] 是增益系数,模拟的振荡器是有线性控制范围的,超出范围后,就不呈现线性函数关系了。但由于我们采用数字实现,整个数字频率控制振荡器来讲,都一直是线性函数关系

从图2中可以得出:

\[{V_c}\left( s \right) = {k_0}\varepsilon \left( s \right) = {k_0}[{\theta _i}\left( s \right) - {\theta _f}\left( s \right)]\] (2)

\[{V_0}\left( s \right) = {V_c}\left( s \right)F\left( s \right)\] (3)

\[{\theta _f}\left( s \right) = {V_0}\left( s \right)\frac{{{k_1}}}{s}\] (4)

由以上三个式子,可以化简得到下面:

\[H\left( s \right) \equiv \frac{{{\theta _f}\left( s \right)}}{{{\theta _i}\left( s \right)}} = \frac{{{k_0}{k_1}F\left( s \right)}}{{s + {k_0}{k_1}F\left( s \right)}}\] (4)

以上出现的“\[ \equiv \] ”均表示“定义为”,下同。也就是说,\[{F\left( s \right)}\] 决定了整个锁相环的传输函数 \[H\left( s \right)\]

那我们怎么来衡量一个锁相环的工作性能好不好呢?一般会用三类信号对锁相环进行测试:

(1) 相位阶跃信号: \[{\theta _i}\left( t \right) = u\left( t \right)\] ,即对应 \[{\theta _i}\left( s \right) = \frac{1}{s}\]

(2)频率阶跃信号: \[{\theta _i}\left( t \right) = \Delta \omega t\] ,即对应 \[{\theta _i}\left( s \right) = \frac{{\Delta \omega }}{{{s^2}}}\]

(3)频率斜升信号: \[{\theta _i}\left( t \right) = \frac{1}{2}R{t^2}\] ,即对应 \[{\theta _i}\left( s \right) = \frac{R}{{{s^3}}}\]

图3 各种类型环路的稳态误差

从图3可以看出,对于频率阶跃信号来说,一阶环的稳态误差不为0,因此一般不用一阶环路。三阶环路的复杂性比较高,不太好设计(我还没试过),所以综合来看,二阶环路用的比较多。

(这是郑继禹、张厥盛的《锁相技术》书籍中的图片,对于阶和型的命名,这张是正确的,读者明白就好了。)

\[F\left( s \right) = \frac{1}{{1 + s{\tau _1}}}\] 对应是RC积分滤波器, \[F\left( s \right) = \frac{{1 + s{\tau _2}}}{{1 + s{\tau _1}}}\] 对应是无源比例积分滤波器, \[F\left( s \right) = \frac{{1 + s{\tau _2}}}{{s{\tau _1}}}\] 对应是理想二阶环,三者的 \[F\left( s \right)\] 不一样

由于RC积分滤波器、无源比例积分滤波器对于频率阶跃信号来说,稳态误差也不为0,因此常采用理想二阶环

上面两图中出现了“阶”与“型”,这两个字是什么意思呢?

“阶”是环路开环传递函数总极点的个数,“型”在原点的极点个数。

先记住:决定环路稳态相差的不是环路开环传递函数总极点的个数——阶,而是在原点处的极点个数——型

本文后面的代码实现,都将以理想二阶环路为例。

《Fundamentals of Global Positioning System Receivers》的第8章说到二阶环路时,一上来就写:

\[F\left( s \right) = \frac{{s{\tau _2} + 1}}{{s{\tau _1}}}\] (5)

我当时还想了想为什么?

然后看到杜勇的《锁相环技术原理及FPGA实现》及郑继禹、张厥盛的《锁相技术》,里面均详细介绍了RC积分滤波器,无源比例积分滤波器,理想二阶环的区别。因此,我们暂且先记住以上提到的部分结论即可。

有了 \[F\left( s \right) = \frac{{s{\tau _2} + 1}}{{s{\tau _1}}}\] ,代入 \[H\left( s \right)\] ,可得到

\[H\left( s \right) = \frac{{\frac{{{k_0}{k_1}{\tau _2}s}}{{{\tau _1}}} + \frac{{{k_0}{k_1}}}{{{\tau _1}}}}}{{{s^2} + \frac{{{k_0}{k_1}{\tau _2}s}}{{{\tau _1}}} + \frac{{{k_0}{k_1}}}{{{\tau _1}}}}} \equiv \frac{{2\xi {\omega _n}s + \omega _n^2}}{{{s^2} + 2\xi {\omega _n}s + \omega _n^2}}\] (6)

其中 \[{\omega _n} = \sqrt {\frac{{{k_0}{k_1}}}{{{\tau _1}}}} \] ,叫做自然角频率, \[\xi \] 是阻尼因子,后面会说到阻尼因子这个变量的值一般取多少

环路噪声带宽如下:

\[{B_n} = \int_0^\infty {\left| {H\left( \omega \right)} \right|} df = \frac{{{\omega _n}}}{2}\left( {\xi + \frac{1}{{4\xi }}} \right)\] (7)

这个Bn在锁相环的参数设置中,是非常重要的一个量。

看了这么久公式,我们可能已经一脸懵逼了,甚至有点困倦了,回过头去不经思考:我们到底在干吗来着???

我们是要做锁相环的MATLAB代码实现,既然要实现数字系统,便就需要从连续域转到离散域。

那怎么从s域转到z域呢?

在本科的《数字信号处理》课程中,我们学习过IIR和FIR数字滤波器的设计方法,也伴随着有一些经典问题,比如IIR和FIR滤波器的区别?设计IIR滤波器,一般会讲脉冲响应不变法和双极性变换法,这两者的优缺点有哪些?

以上提到的问题,请读者思考几秒?(然后复习一下)

双极性变换法从s域到z域的映射公式如下:

\[s = \frac{2}{{{t_s}}}\frac{{1 - {z^{ - 1}}}}{{1 + {z^{ - 1}}}}\] (8)

其中 \[{{t_s}}\]采样周期,代入上面的F(s),则有 \[F\left( Z \right) = {C_1} + \frac{{{C_2}}}{{1 - {z^{ - 1}}}}\] (9)

\[{C_1} = \frac{{2{\tau _2} - {t_s}}}{{2{\tau _1}}}\] (10)

\[{C_2} = \frac{{{t_s}}}{{{\tau _1}}}\] (11)

所以环路滤波器等效如下:

图4 环路滤波器的z域图

模拟电路中的压控振荡器,在数字中用NCO(数字频率合成器)代替,这是为什么呢?

图5 NCO的数字化模型

注意到图片里面7-27,数字域NCO相当于相位累加器,代码实现中也可以观察到累加的过程。

有了 \[N(z) = \frac{{{\theta _f}\left( z \right)}}{{{V_0}\left( z \right)}} \equiv \frac{{{k_1}{z^{ - 1}}}}{{1 - {z^{ - 1}}}}\] ,得到下面

假设你已经认真阅读过上面的公式后,为什么大概率还是没有写出可以实现的MATLAB代码呢?

这是由于z变换后,具体的程序是采用迭代来实现。

因此,我们需要将之前的表达式转换成迭代式子,方可让程序进行进行计算。

我将结合图与公式,将以上提到的材料转化成迭代表达式,便是我的一点点贡献了。

环路滤波器的z变换图上图所示,假设鉴相器的输入是 \[f(i)\] ,NCO的输出是 \[fin(i)\] ,则有下列表达式:

\[input = {k_0} \cdot error(i) = {k_0} \cdot \left( {f(i) - fin(i)} \right)\] (12)

\[B\left( i \right) = {k_0} \cdot error(i) \cdot {C_1} + A(i)\] (13)

\[A\left( i \right) = {k_0} \cdot error(i) \cdot {C_2} + A(i - 1)\] (14)

由材料中已经给出的N(Z)公式:

\[N(Z) = \frac{{{\theta _f}\left( Z \right)}}{{{V_0}\left( Z \right)}} = \frac{{{k_1}{z^{ - 1}}}}{{1 - {z^{ - 1}}}}\] (15)

转化到时域,有: \[{\theta _f}\left( {i + 1} \right) - {\theta _f}\left( i \right) = {k_1} \cdot {V_0}\left( i \right)\] (16)

\[fin(i + 1) = {k_1} \cdot B\left( i \right) + fin(i)\] (17)

\[{k_0} = {k_1} = 1\] ,即可得到

for i = 2:length error(i) = f(i) - fin(i); A(i) = A(i-1) + error(i)*C2; B(i) = C1*error(i) + A(i); fin(i+1) = B(i) + fin(i); end % end for i

以上这一段代码,是锁相环MATLAB代码的核心,后面都将以这段代码为基础进行仿真。

结合上面已经计算出来的:

\[{C_1} = \frac{1}{{{k_0}{k_1}}} \cdot \frac{{8\zeta {\omega _n}{t_s}}}{{4 + 4\zeta {\omega _n}{t_s} + {{({\omega _n}{t_s})}^2}}}\] (18)

\[{C_2} = \frac{1}{{{k_0}{k_1}}} \cdot \frac{{4{{({\omega _n}{t_s})}^2}}}{{4 + 4\zeta {\omega _n}{t_s} + {{({\omega _n}{t_s})}^2}}}\] (19)

其中 \[{{B_n}}\] 是等效噪声带宽, \[{{t_s}}\] 是采样周期, \[damp = \zeta \] 是阻尼因子,

\[{B_n} = \frac{{{\omega _n}}}{2}\left( {\zeta + \frac{1}{{4\zeta }}} \right)\] (20)

Bn = 300,ts=1e-4时跟踪情况三、各参数对二阶数字锁相环的性能影响

在上面的代码中,可以调整不同的等效噪声带宽 \[{B_n}\] 和采样周期 \[{{t_s}}\] ,观察这两个参数对二阶锁相环跟踪性能的影响。

忍不住好奇问,那为什么\[\zeta = 0.707\]\[{k_0} = {k_1} = 1\]?或者说,这三个参数对二阶锁相环的跟踪性能有什么影响呢?

先来理解一下“锁相环为什么能跟踪相位?”

继续来说,为什么\[\zeta = 0.707\]

相位裕度和增益裕度,伯德图等相关概念,本科的《模拟电子线路》,也叫《低频电子线路》讲到过,请读者自行百度或者复习之前课本哦,这就不展开说啦。

《锁相环技术原理及FPGA实现》中讲到:工程上为确保环路稳定,要求增益裕度大于等于6dB,相位裕度30度到60度。

那么 \[{k_0}\]\[{{k_1}}\] 对二阶锁相环的性能有什么影响呢?

图片中的 \[{K_z}\] 即是上面一直提的 \[{{k_0}{k_1}}\]

上面的锁相环核心代码中,只用到了 \[{C_1}\]\[{C_2}\] ,而\[{C_1}\]\[{C_2}\]均与 \[{{t_s}}\]\[\xi \]\[{{\omega _n}}\]

\[{{k_0}}\]\[{{k_1}}\] 有关,固定了\[{{k_0}}\]\[{{k_1}}\]\[\xi \],而\[{{t_s}}\] 一般就是符号速率的倒数

因此,调整噪声带宽Bn便是相当于调整 \[{{\omega _n}}\] ,进而调整\[{C_1}\]\[{C_2}\]

上面讲到了NCO是相位累加器的作用,下面从相位误差来看,锁相环是如何锁相的。

可以看到锁相环已经能够顺利对多普勒频偏进行补偿,产生同频同相的载波。

解释一下常见的一段代码:

%%%%%%为了看到频差 if(k>200) &&(k


【本文地址】

公司简介

联系我们

今日新闻

    推荐新闻

    专题文章
      CopyRight 2018-2019 实验室设备网 版权所有